国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中類的加載順序剖析(常用于面試題)

Java中類的加載順序剖析(常用于面試題)

2019-12-13 10:40junjie JAVA教程

這篇文章主要介紹了Java中類的加載順序剖析(常用于面試題),本文直接給出代碼實例和運行結果,給后給出了加載過程總結,需要的朋友可以參考下

這其實是去年校招時我遇到的一道阿里巴巴的筆試題(承認有點久遠了-。-),嗯,如果我沒記錯的話,當時是作為Java方向的一道選做大題。當然題意沒有這么直白,題目只要求你寫出程序運行后所有System.out.println的輸出結果,其中程序是題目給的,而各個System.out.println的執行順序不同會導致最后程序輸出的結果也不同。

具體的題目我肯定記不清,不過我們可以換個直接的問法,如果類A和類B中有靜態變量,靜態語句塊,非靜態變量,非靜態語句塊,構造函數,靜態方法,非靜態方法,同時類A繼承類B,請問當實例化A時,類內部的加載順序是什么?

當時我也是一頭霧水,事后我就自己寫了一個小Demo,這才知道了類內部的實際加載順,測試代碼如下:

Class B:

  1. public class B{ 
  2. //靜態變量   
  3. static int i=1; 
  4. //靜態語句塊 
  5. static { 
  6.     System.out.println("Class B1:static blocks"+i); 
  7. //非靜態變量 
  8. int j=1; 
  9. //靜態語句塊 
  10. static
  11.     i++; 
  12.     System.out.println("Class B2:static blocks"+i); 
  13. //構造函數 
  14. public B(){ 
  15.     i++; 
  16.     j++; 
  17.     System.out.println("constructor B: "+"i="+i+",j="+j); 
  18. //非靜態語句塊 
  19.   i++; 
  20.   j++; 
  21.   System.out.println("Class B:common blocks"+"i="+i+",j="+j); 
  22. //非靜態方法 
  23. public void bDisplay(){ 
  24.     i++; 
  25.     System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j); 
  26.     return ; 
  27. //靜態方法 
  28. public static void bTest(){ 
  29.     i++; 
  30.     System.out.println("Class B:static void bTest():    "+"i="+i); 
  31.     return ; 

Class A:

  1. public class A extends B{ 
  2. //靜態變量   
  3. static int i=1; 
  4. //靜態語句塊 
  5. static { 
  6.     System.out.println("Class A1:static blocks"+i); 
  7. //非靜態變量 
  8. int j=1; 
  9. //靜態語句塊 
  10. static
  11.     i++; 
  12.     System.out.println("Class A2:static blocks"+i); 
  13. //構造函數 
  14. public A(){ 
  15.     super(); 
  16.     i++; 
  17.     j++; 
  18.     System.out.println("constructor A: "+"i="+i+",j="+j); 
  19. //非靜態語句塊 
  20.   i++; 
  21.   j++; 
  22.   System.out.println("Class A:common blocks"+"i="+i+",j="+j); 
  23. //非靜態方法 
  24. public void aDisplay(){ 
  25.     i++; 
  26.     System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j); 
  27.     return ; 
  28. //靜態方法 
  29. public static void aTest(){ 
  30.     i++; 
  31.     System.out.println("Class A:static void aTest():    "+"i="+i); 
  32.     return ; 

Class ClassLoading :

  1. public class ClassLoading { 
  2.       
  3.     public static void main (String args[]) { 
  4.         A a=new A(); 
  5.         a.aDisplay(); 
  6.     } 

程序運行結果如圖:

Java中類的加載順序剖析(常用于面試題)

通過上述示圖,我們可以比較清晰的看出java類的整個加載過程。

1.若要加載類A,則先加載執行其父類B(Object)的靜態變量以及靜態語句塊(執行先后順序按排列的先后順序)。

2.然后再加載執行類A的靜態變量以及靜態語句塊。(并且1、2步驟只會執行1次)

3.若需實例化類A,則先調用其父類B的構造函數,并且在調用其父類B的構造函數前,依次先調用父類B中的非靜態變量及非靜態語句塊.最后再調用父類B中的構造函數初始化。

4.然后再依次調用類A中的非靜態變量及非靜態語句塊.最后調用A中的構造函數初始化。( 并且3、4步驟可以重復執行)

5.而對于靜態方法和非靜態方法都是被動調用,即系統不會自動調用執行,所以用戶沒有調用時都不執行,主要區別在于靜態方法可以直接用類名直接調用(實例化對象也可以),而非靜態方法只能先實例化對象后才能調用。

OK,今天就總結到這里了,如果有地方說的不好或有錯誤的地方,歡迎大家指出,定當改正,謝謝。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩在线精品视频 | 久久国产精品久久喷水 | 成人激情视频免费在线观看 | 色综合天天天天做夜夜夜夜做 | 成人永久免费视频 | 久久久婷婷 | 久久久久久99精品 | 午夜爽爽影院 | 国产精品久久久久久久久图文区 | 成人av电影网址 | a级毛片免费高清视频 | 久久久久久精 | 中文字幕视频在线观看 | 免费黄色小视频 | 亚洲欧洲av| 国产精品国产a | 欧美www | 欧美一级久久 | 国产精品视屏 | 中文字幕视频在线观看 | 亚洲人视频在线观看 | 久久99er6热线精品首页蜜臀 | 亚洲免费视频网 | 中文字幕在线免费视频 | 免费成人在线网站 | 久久精品国产一区二区三 | 亚洲精品一二三区 | 亚洲国产免费av | 日韩欧美中字 | 91在线视频播放 | 免费观看电视在线高清视频 | 欧美福利电影在线观看 | 欧美国产精品一区 | 国产一区二区三区免费观看 | 欧美一级精品 | 色官网| 久久国产精品99久久久久久老狼 | 免费黄色在线观看视频 | 日韩成人不卡 | 精品成人在线视频 | 免费一级片 |