成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中代碼塊與代碼加載順序原理的示例分析-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Java中代碼塊與代碼加載順序原理的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

在蓮池等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營銷推廣,成都外貿(mào)網(wǎng)站制作,蓮池網(wǎng)站建設(shè)費用合理。

在面試大型公司時,如果遇到大型國企或者大的互聯(lián)網(wǎng)私企,筆試中經(jīng)常遇到代碼塊和代碼加載順序的筆試題。這里做一個總結(jié),也方便各位小伙伴飆車不會飄。

名詞解釋

代碼塊

由 { } 包起來的代碼,稱為代碼塊

靜態(tài)代碼塊

由 static { } 包起來的代碼,稱為靜態(tài)代碼塊。

不同類型變量定義示例:

class Demo{
  String x;// 非靜態(tài)成員變量,又稱為屬性,對該類不同的對象來說,屬性互不相同
  static int y = 32;// 類變量,一個類中只有一個該變量,該類不同的對象共享同一個靜態(tài)成員變量
  public static void main(String[] args){
    int z = 0;// 局部變量,只在方法內(nèi)部可見,在方法結(jié)束后由垃圾收集器自動回收
  }
}

局部代碼塊

位置:局部位置(方法內(nèi)部)。

作用:限定變量的生命周期,盡早釋放,節(jié)約內(nèi)存。

調(diào)用:調(diào)用其所在的方法時執(zhí)行。

方法中的局部代碼塊一般進行一次性地調(diào)用,調(diào)用完立刻釋放空間,避免在接下來的調(diào)用過程中占用??臻g。??臻g內(nèi)存有限,方法調(diào)用可能會生成很多局部變量導(dǎo)致棧內(nèi)存不足,使用局部代碼塊可以避免此缺陷。

public class 局部代碼塊 {

   public static void go() {
    // 局部代碼塊
    {
      int age = 30;
      System.out.print("go: " + age);
    }
  }
  public static void main(String[] args) {
    go();
  }
}

構(gòu)造代碼塊

位置:類成員的位置,即類中方法之外的位置。

作用:把多個構(gòu)造方法共同的部分提取出來,共用構(gòu)造代碼塊。

調(diào)用:每次調(diào)用構(gòu)造方法時,都會優(yōu)先于構(gòu)造方法執(zhí)行,也就是每次new一個對象時自動調(diào)用,實現(xiàn)對象初始化。

public class A {
  int i = 1;
  int initValue;//成員變量,初始化交給代碼塊來完成
  A(){
    System.out.println("構(gòu)造方法在代碼塊執(zhí)行后運行");
  }
  {
    System.out.println("代碼塊從上至下依次運行");
    //代碼塊的作用體現(xiàn)于此:在調(diào)用構(gòu)造方法之前,用某段代碼對成員變量進行初始化。
    //而不是在構(gòu)造方法調(diào)用時再進行。
    for (int i = 0;i < 100;i ++) {
      initValue += i;
    }
  }
  {
    System.out.println(initValue);
    System.out.println(i);//此時會打印1
    int i = 2;//局部變量,和成員變量不沖突,但會優(yōu)先使用代碼塊的變量
    System.out.println(i);//此時打印2
    //System.out.println(j);//提示非法向后引用,因為此時j的的初始化還沒開始。
  }
  int j = 2;
  {
    System.out.println(j);
    System.out.println(i);//代碼塊中的變量運行后自動釋放,不會影響代碼塊之外的代碼
  }

}
public class 構(gòu)造代碼塊 {
  @Test
  public void test() {
    A a = new A();
  }
}

執(zhí)行結(jié)果

代碼塊從上至下依次運行
1
2
構(gòu)造方法在代碼塊執(zhí)行后運行

靜態(tài)代碼塊

位置:類成員位置。

作用:對類進行一些初始化,只加載一次。當(dāng)new多個對象時,只有第一次會調(diào)用靜態(tài)代碼塊,因為靜態(tài)代碼塊和類變量一樣,

是屬于類的,所有對象共享一份。

調(diào)用: new 一個對象時自動調(diào)用。

public class 靜態(tài)代碼塊 {
@Test
public void test() {
  C c1 = new C();
  C c2 = new C();
  //結(jié)果,靜態(tài)代碼塊只會調(diào)用一次,類的所有對象共享該代碼塊
System.out.println("我是普通方法");
}
}
class C{
  C(){
    System.out.println("構(gòu)造方法調(diào)用");
  }
  {
    System.out.println("代碼塊調(diào)用");
  }
  static {
    System.out.println("靜態(tài)代碼塊調(diào)用");
  }
}

調(diào)用結(jié)果:

靜態(tài)代碼塊調(diào)用
代碼塊調(diào)用
構(gòu)造方法調(diào)用
代碼塊調(diào)用
構(gòu)造方法調(diào)用
我是普通方法

執(zhí)行順序 靜態(tài)代碼塊 —–> 構(gòu)造代碼塊 ——-> 構(gòu)造方法

筆試題

寫出下列程序輸出結(jié)果:

public class HelloA {
  public HelloA(){
    System.out.println("HelloA");
  }
  {
    System.out.println("I'm A class");
  }
  static {
    System.out.println("static A");
  }
}
public class HelloB extends HelloA {
  public HelloB(){
    System.out.println("HelloB");
  }
  {
    System.out.println("I'm B class");
  }
  static {
    System.out.println("static B");
  }
  public static void main(String[] args) {
    new HelloB();
  }
}

執(zhí)行結(jié)果:

Java中代碼塊與代碼加載順序原理的示例分析

分析:首先要知道靜態(tài)代碼塊是隨著類的加載而加載,而構(gòu)造代碼塊和構(gòu)造方法都是隨著對象的創(chuàng)建而加載。

1,在編譯HelloB.java時,由于HelloB 繼承 HelloA,先加載了HelloA類,因此HelloA類的靜態(tài)代碼塊首先執(zhí)行,而后加載HelloB類,HelloB類的靜態(tài)代碼塊執(zhí)行,這沒什么好說的。

2,然后創(chuàng)建HelloB的對象,大家都知道構(gòu)造代碼塊優(yōu)先于構(gòu)造方法執(zhí)行,這時候問題來了,這時應(yīng)該先看HelloB類的構(gòu)造方法,HelloB類里的構(gòu)造方法里有一句隱式的super()首先被執(zhí)行,所以找到HelloA類的構(gòu)造方法,而HelloA類的構(gòu)造方法中也有一句隱式的super()執(zhí)行(調(diào)用Object類的構(gòu)造方法),并沒有什么返回結(jié)果,接下來才是在執(zhí)行HelloA類構(gòu)造方法的方法體前先執(zhí)行了HelloA類的構(gòu)造代碼塊(I'm A class),再執(zhí)行HelloA類構(gòu)造方法的方法體(也就是Hello A),最后又回到HelloB類的構(gòu)造方法中,這時HelloB類的super()已經(jīng)執(zhí)行完了,在執(zhí)行HelloB類構(gòu)造方法的方法體前先執(zhí)行HelloB類的構(gòu)造代碼塊(I'm B class),再執(zhí)行子類構(gòu)造方法的方法體(HellB)。

無繼承初始化順序:

Java中代碼塊與代碼加載順序原理的示例分析

有繼承初始化順序:

Java中代碼塊與代碼加載順序原理的示例分析

接下來看一道阿里筆試題:

public class B{
  public static B t1 = new B();
  public static B t2 = new B();
  {
    System.out.println("構(gòu)造塊");
  }
  static {
    System.out.println("靜態(tài)塊");
  }
  public static void main(String[] args) {
    B t =new B();
  }
}

執(zhí)行結(jié)果:

Java中代碼塊與代碼加載順序原理的示例分析

總結(jié)

Java代碼初始化順序

由 static 關(guān)鍵字修飾的,如類變量和靜態(tài)代碼塊,將在類創(chuàng)建實例之前被初始化,而且是按順序從上到下依次被執(zhí)行。(類變量、靜態(tài)代碼塊)屬于類本身,不依賴于類的實例。

沒有 static 關(guān)鍵字修飾的(如:實例變量(非靜態(tài)變量)、非靜態(tài)代碼塊)初始化實際上是會被提取到類的構(gòu)造器中被執(zhí)行的,但是會比類構(gòu)造器中的代碼塊優(yōu)先執(zhí)行。實例變量、非靜態(tài)代碼塊的地位是相等的,它們將按順序被執(zhí)行。
容易混淆的一個知識點

靜態(tài)方法只允許直接訪問靜態(tài)成員,而實例方法中可以訪問靜態(tài)成員和實例成員,原因是類還沒有實例化,所以實例成員也沒有被創(chuàng)建,靜態(tài)方法中因此也不能用this。

關(guān)于“Java中代碼塊與代碼加載順序原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前題目:Java中代碼塊與代碼加載順序原理的示例分析-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article26/dhcscg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、服務(wù)器托管軟件開發(fā)、云服務(wù)器面包屑導(dǎo)航、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
古田县| 闽清县| 宿州市| 徐闻县| 会东县| 宜宾市| 宁化县| 行唐县| 丹巴县| 张家口市| 馆陶县| 镇远县| 庆安县| 江城| 定陶县| 开鲁县| 嘉鱼县| 资中县| 兰坪| 莲花县| 红安县| 绿春县| 汽车| 镇沅| 长阳| 信丰县| 临澧县| 安陆市| 额尔古纳市| 汤阴县| 合川市| 东莞市| 尉氏县| 海淀区| 宕昌县| 临颍县| 永嘉县| 合作市| 于都县| 印江| 鄢陵县|