国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

阿里巴巴面試題--Java對象初始化

2019-11-14 20:49:09
字體:
來源:轉載
供稿:網友
阿里巴巴面試題--java對象初始化

轉自 http://blog.csdn.net/ysjian_pingcx/article/details/19605335

Java對象初始化 這是一道阿里巴巴的關于Java對象初始化的面試題,堪稱經典,代碼很簡單(編寫格式做了些修改),但是需要面試者對Java中對象初始化有一個透徹的認識,那么通過這道面試題,對我有點啟發,所以希望在這里分享給大家,希望能給迷惘的初學者一起指引,下面我們直入主題,先看看代碼:
 1 public class InitializeDemo { 2     PRivate static int k = 1; 3     private static InitializeDemo t1 = new InitializeDemo("t1"); 4     private static InitializeDemo t2 = new InitializeDemo("t2"); 5     private static int i = print("i"); 6     private static int n = 99; 7     static { 8         print("靜態塊"); 9     }10     private int j = print("j");11     {12         print("構造塊");13     }14     public InitializeDemo(String str) {15         System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);16         ++i;17         ++n;18     }19     public static int print(String str) {20         System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);21         ++n;22         return ++i;23     }24     public static void main(String args[]) {25         new InitializeDemo("init");26     }27 }
做些小補充,這也是很多Java學習者最初都能接觸到的一些但是不是很理解的概念:核心理念:

1.靜態屬性和靜態代碼塊都是在類加載的時候初始化和執行,兩者的優先級別是一致的, 且高于非靜態成員,執行按照編碼順序。2.非靜態屬性和匿名構造器在所有的構造方法之前執行,兩者的優先級別一致,執行按照編碼順序。3.以上執行完畢后執行構造方法中的代碼。

讀者仔細揣摩上面三條句子,也就是Java對象初始化的順序,也就明白以上程序的輸出結果為什么如下:

1:j i=0 n=02:構造塊 i=1 n=13:t1 i=2 n=24:j i=3 n=35:構造塊 i=4 n=46:t2 i=5 n=57:i i=6 n=68:靜態塊 i=7 n=999:j i=8 n=10010:構造塊 i=9 n=10111:init i=10 n=102

如果還是沒有明白,就看下面詳解,一下詳解的順序就是按照上文的核心理念的順序來執行的(建議讀者把自己帶入JVN的世界里,跟著JVM一步一步往下面走):

1.運行main方法的時候,JVM會調用ClassLoader來加載InitializeDemo類,那么一起源于這次加載。2.上面有四個靜態屬性,所以會按順序逐一初始化這四個靜態屬性。3.private static int k = 1; 此時將k初始化為1。4.private static InitializeDemo t1 = new InitializeDemo("t1");創建InitializeDemo對象,  那么按照核心理念中的順序,先執行private int j = print("j");,打印出j,然后執行構造  塊,最后執行構造方法。5.private static InitializeDemo t2 = new InitializeDemo("t2");同步驟4。6.private static int i = print("i");打印i。7.private static int n = 99;直到這一步,n才被賦值為99,之前是從默認的0開始++的。8.靜態屬性初始化完畢,代碼走到靜態塊,打印出靜態塊,此時n=99。9.靜態屬性和靜態塊執行完畢,然后執行main方法中的代碼new InitializeDemo("init");10.main方法中創建對象,先初始化非靜態屬性,private int j = print("j");打印j,   然后執行構造塊,最后執行構造方法。
不知道我解說清楚了沒有,只要把握住核心理念,碰到在復雜的問題也都不會怕了。用一個公式概括一下Java對象初始化執行優先級別:(靜態屬性=靜態代碼塊)> (非靜態屬性 = 構造塊)> 構造方法總結一下核心理念:

1.靜態只在類加載的時候執行,且執行一次。2.非靜態只在實例化的時候執行,且每次實例化都執行。3.靜態在非靜態之前執行。4.靜態屬性和靜態塊的執行順序取決于編碼順序,對它們一視同仁。5.非靜態屬性和構造塊的執行順取決于編碼順序,對它們也一視同仁。6.最后執行構造方法。

上面的總結有點繞對吧,問題進一步簡化的話,就更好理解了:讀者將靜態代碼塊視為一個靜態屬性,將構造塊視為一個非靜態屬性,那么問題簡化到了這種路線“靜態屬性-->非靜態屬性-->構造方法“不積跬步無以至千里,祝愿大家學習進步,樂于分享~ ~
上一篇:Java IO操作

下一篇:Java線程池

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘潭市| 马关县| 南溪县| 万全县| 三河市| 鱼台县| 江北区| 蒙自县| 金寨县| 台中市| 辉县市| 纳雍县| 汉寿县| 自治县| 耿马| 天镇县| 远安县| 勐海县| 察雅县| 定安县| 昭苏县| 洛宁县| 屏东县| 昌黎县| 自贡市| 庄河市| 宁都县| 永济市| 高邑县| 皋兰县| 泰顺县| 砀山县| 浮梁县| 马边| 齐齐哈尔市| 梨树县| 京山县| 珠海市| 沙河市| 天等县| 苏尼特右旗|