<abbr id="ciwa6"><option id="ciwa6"></option></abbr>
  • <sup id="ciwa6"><kbd id="ciwa6"></kbd></sup>
    <small id="ciwa6"></small>
  • 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

    400-811-9990
    手機(jī)站
    千鋒教育

    千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

    千鋒教育

    掃一掃進(jìn)入千鋒手機(jī)站

    領(lǐng)取全套視頻
    千鋒教育

    關(guān)注千鋒學(xué)習(xí)站小程序
    隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

    上海
    • 北京
    • 鄭州
    • 武漢
    • 成都
    • 西安
    • 沈陽(yáng)
    • 廣州
    • 南京
    • 深圳
    • 大連
    • 青島
    • 杭州
    • 重慶
    當(dāng)前位置:成都千鋒IT培訓(xùn)  >  技術(shù)干貨  >  經(jīng)典面試題:static加載機(jī)制你知道嗎?

    經(jīng)典面試題:static加載機(jī)制你知道嗎?

    來(lái)源:千鋒教育
    發(fā)布人:gxy
    時(shí)間: 2023-03-23 16:21:00

      經(jīng)典面試題:static加載機(jī)制你知道嗎?

    static加載機(jī)制

      static在Java中是一個(gè)很常見(jiàn)的關(guān)鍵字,同時(shí)它也是面試時(shí)的一個(gè)高頻考點(diǎn)。那么在Java類(lèi)中,static的加載機(jī)制到底是怎樣的呢?接下來(lái)小編就來(lái)帶大家弄明白這個(gè)問(wèn)題。

      一. 類(lèi)加載機(jī)制

      JVM在首次使用某個(gè)類(lèi)時(shí),會(huì)通過(guò) classpath 來(lái)查找該類(lèi)的.class文件。然后將.class文件中對(duì)類(lèi)的描述信息加載到內(nèi)存中進(jìn)行保存,如:包名、類(lèi)名、父類(lèi)、屬性、方法、構(gòu)造方法......一個(gè)類(lèi)的加載過(guò)程大致如下:

      加載時(shí)機(jī)

      創(chuàng)建對(duì)象

      創(chuàng)建子類(lèi)對(duì)象

      訪問(wèn)靜態(tài)屬性

      調(diào)用靜態(tài)方法

      主動(dòng)加載:Class.forName(“全限定名”)

      二. static 特點(diǎn)

      被static關(guān)鍵字修飾的類(lèi)或方法、成員等具有如下特點(diǎn):

      靜態(tài)方法允許直接訪問(wèn)靜態(tài)成員;

      靜態(tài)方法不能直接訪問(wèn)非靜態(tài)成員;

      靜態(tài)方法中不允許使用this或是super關(guān)鍵字;

      靜態(tài)方法可以繼承,不能重寫(xiě)、沒(méi)有多態(tài)。

      三. 經(jīng)典面試題

      接著我們?cè)賮?lái)看看關(guān)于static的一個(gè)經(jīng)典面試題,代碼案例如下:

      public class Test {

      public static int k = 0;

      public static Test t1 = new Test("t1");

      public static Test t2 = new Test("t2");

      public static int i = print("i");

      public static int n = 99;

      private int a = 0;

      public int j = print("j");

      {

      print("構(gòu)造代碼塊");

      }

      static{

      print("靜態(tài)構(gòu)造代碼塊");

      }

      public Test(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++i;

      ++n;

      }

      public static int print(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++n;

      return ++i;

      }

      public static void main(String[] args) {

      }

      }

      這是一道關(guān)于static加載執(zhí)行順序的經(jīng)典面試題,根據(jù)代碼觀察執(zhí)行結(jié)果,接下來(lái)我們就來(lái)分析一下上述代碼的執(zhí)行結(jié)果是什么。

      在執(zhí)行 main 方法,也就是程序主入口的時(shí)候,首先會(huì)加載所在的類(lèi),聲明靜態(tài)變量,初始化靜態(tài)屬性,執(zhí)行靜態(tài)代碼塊(按照順序執(zhí)行),所以首先加載的是:

      public static int k = 0;

      2. 其次加載:

      public static Test t1 = new Test("t1");

      3. 而加載到實(shí)例化 t1 對(duì)象時(shí),類(lèi)的加載會(huì)暫停,然后創(chuàng)建 Test 的實(shí)例對(duì)象。在創(chuàng)建 Test 對(duì)象時(shí)則會(huì)先加載屬性再執(zhí)行代碼塊,最后執(zhí)行構(gòu)造方法,所以先執(zhí)行的會(huì)是實(shí)例屬性。

      private int a = 0;

      public int j = print("j");

      public static int print(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++n;

      return ++i;

      }

      4. 因加載類(lèi)的過(guò)程中,會(huì)對(duì)定義的靜態(tài)字段在方法區(qū)中分別分配空間,并賦予初始化值,所以 i 和 n 的值都為0,因此第一個(gè)打印語(yǔ)句是:

      1:j i=0 n=0

      5. 實(shí)例屬性加載完畢后,則進(jìn)行構(gòu)造代碼塊的加載:

      {

      print("構(gòu)造代碼塊");

      }

      public static int print(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++n;

      return ++i;

      }

      6. 因?yàn)榈谝淮握{(diào)用時(shí)已經(jīng)對(duì) k 、i 、n 的值進(jìn)行了自加,因此第二個(gè)打印語(yǔ)句是:

      2:構(gòu)造代碼塊 i=1 n=1

      7. 實(shí)例化對(duì)象的最后一步,則是執(zhí)行構(gòu)造方法:

      public static Test t1 = new Test("t1");

      public Test(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++i;

      ++n;

      }

      8. 因此第三個(gè)打印語(yǔ)句是:

      3:t1 i=2 n=2

      9. t1 對(duì)象創(chuàng)建完畢后,類(lèi)加載則繼續(xù)執(zhí)行,因此下一步則是:

      public static Test t2 = new Test("t2");

      10. 按照前面實(shí)例化 t1 的執(zhí)行機(jī)制,因此接下來(lái)的打印的幾句則是:

      4:j i=3 n=3

      5:構(gòu)造代碼塊 i=4 n=4

      6:t2 i=5 n=5

      11. 實(shí)例化完 t2 對(duì)象后,繼續(xù)進(jìn)行類(lèi)加載,因此下一步加載靜態(tài)屬性 i 的賦值:

      public static int i = print("i");

      public static int print(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++n;

      return ++i;

      }

      12. 因此下一步打印結(jié)果為:

      7:i i=6 n=6

      13. 加載完最后一個(gè)靜態(tài)屬性 n= 99 后,則加載靜態(tài)構(gòu)造代碼塊:

      public static int n = 99;

      static{

      print("靜態(tài)構(gòu)造代碼塊");

      }

      public static int print(String str){

      System.out.println((++k)+":"+str+" i="+i+" n="+n);

      ++n;

      return ++i;

      }

      13. 因此最后會(huì)打印:

      8:靜態(tài)構(gòu)造代碼塊 i=7 n=99

      14. 所以整體的執(zhí)行結(jié)果會(huì)是:

      1:j i=0 n=0

      2:構(gòu)造代碼塊 i=1 n=1

      3:t1 i=2 n=2

      4:j i=3 n=3

      5:構(gòu)造代碼塊 i=4 n=4

      6:t2 i=5 n=5

      7:i i=6 n=6

      8:靜態(tài)構(gòu)造代碼塊 i=7 n=99

      四. 小結(jié)

      現(xiàn)在你知道一個(gè)Java類(lèi)的加載執(zhí)行機(jī)制了嗎?可以說(shuō),掌握 static 在程序中的加載執(zhí)行順序,可以使我們更好地理解代碼,明白程序的執(zhí)行流程。今天小編只是通過(guò)這樣的一個(gè)小案例,給大家展現(xiàn)了 static 使用的冰山一角,它還有更多的神奇之處有待于我們繼續(xù)挖掘,請(qǐng)大家繼續(xù)關(guān)注小編哦。

    聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

    猜你喜歡LIKE

    經(jīng)典面試題:static加載機(jī)制你知道嗎?

    2023-03-23

    如何做用戶分層?

    2022-12-12

    如何進(jìn)行有效的數(shù)據(jù)分析?

    2022-12-12

    最新文章NEW

    跨域如何解決

    2023-04-04

    消息中間件常用協(xié)議有哪些

    2023-03-22

    四種方式創(chuàng)建SpringBoot項(xiàng)目

    2023-02-27

    相關(guān)推薦HOT

    更多>>

    快速通道 更多>>

    最新開(kāi)班信息 更多>>

    網(wǎng)友熱搜 更多>>