阿里面试题——Java对象初始化
Java對象初始化
這是一道阿里巴巴的關于Java對象初始化的面試題,堪稱經典,代碼很簡單(編寫格式做了些修改),但是需要面試者對Java中對象初始化有一個透徹的認識,那么通過這道面試題,對我有點啟發,所以希望在這里分享給大家,希望能給迷惘的初學者一起指引,下面我們直入主題,先看看代碼:
public class InitializeDemo {private static int k = 1;private static InitializeDemo t1 = new InitializeDemo("t1");private static InitializeDemo t2 = new InitializeDemo("t2");private static int i = print("i");private static int n = 99;static {print("靜態塊");}private int j = print("j");{print("構造塊");}public InitializeDemo(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[]) {new InitializeDemo("init");} } 復制代碼做些小補充,這也是很多Java學習者最初都能接觸到的一些但是不是很理解的概念:
核心理念:
讀者仔細揣摩上面三條句子,也就是Java對象初始化的順序,也就明白以上程序的輸出結果為什么如下:
j i=0 n=0 構造塊 i=1 n=1 t1 i=2 n=2 j i=3 n=3 構造塊 i=4 n=4 t2 i=5 n=5 i i=6 n=6 靜態塊 i=7 n=99 j i=8 n=100 構造塊 i=9 n=101 init i=10 n=102 復制代碼如果還是沒有明白,就看下面詳解,一下詳解的順序就是按照上文的核心理念的順序來執行的(建議讀者把自己帶入JVN的世界里,跟著JVM一步一步往下面走):
不知道我解說清楚了沒有,只要把握住核心理念,碰到在復雜的問題也都不會怕了。
用一個公式概括一下Java對象初始化執行優先級別:
(靜態屬性=靜態代碼塊)> (非靜態屬性 = 構造塊)> 構造方法
總結一下核心理念:
上面的總結有點繞對吧,問題進一步簡化的話,就更好理解了: 讀者將靜態代碼塊視為一個靜態屬性,將構造塊視為一個非靜態屬性,那么問題簡化到了這種路線“靜態屬性-->非靜態屬性-->構造方法“
不積跬步無以至千里,祝愿大家學習進步,樂于分享~ ~
寫在最后
最后,歡迎做Java的工程師朋友們加入Java高級架構進階Qqun:963944895
群內有技術大咖指點難題,還提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
比你優秀的對手在學習,你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 我們必須不斷學習,否則我們將被學習者超越!
趁年輕,使勁拼,給未來的自己一個交代!
轉載于:https://juejin.im/post/5cd96f2a6fb9a0320c5ad0f7
總結
以上是生活随笔為你收集整理的阿里面试题——Java对象初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#-修改图书借阅管理系统-错误与SQL
- 下一篇: WebGL three.js学习笔记 6