日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

阿里面试题——Java对象初始化

發(fā)布時(shí)間:2024/4/17 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里面试题——Java对象初始化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java對(duì)象初始化

這是一道阿里巴巴的關(guān)于Java對(duì)象初始化的面試題,堪稱經(jīng)典,代碼很簡(jiǎn)單(編寫格式做了些修改),但是需要面試者對(duì)Java中對(duì)象初始化有一個(gè)透徹的認(rèn)識(shí),那么通過這道面試題,對(duì)我有點(diǎn)啟發(fā),所以希望在這里分享給大家,希望能給迷惘的初學(xué)者一起指引,下面我們直入主題,先看看代碼:

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("靜態(tài)塊");}private int j = print("j");{print("構(gòu)造塊");}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");} } 復(fù)制代碼

做些小補(bǔ)充,這也是很多Java學(xué)習(xí)者最初都能接觸到的一些但是不是很理解的概念:

核心理念

  • 靜態(tài)屬性和靜態(tài)代碼塊都是在類加載的時(shí)候初始化和執(zhí)行,兩者的優(yōu)先級(jí)別是一致的,且高于非靜態(tài)成員,執(zhí)行按照編碼順序。
  • 非靜態(tài)屬性和匿名構(gòu)造器在所有的構(gòu)造方法之前執(zhí)行,兩者的優(yōu)先級(jí)別一致,執(zhí)行按照編碼順序。
  • 以上執(zhí)行完畢后執(zhí)行構(gòu)造方法中的代碼。
  • 讀者仔細(xì)揣摩上面三條句子,也就是Java對(duì)象初始化的順序,也就明白以上程序的輸出結(jié)果為什么如下:

    j i=0 n=0 構(gòu)造塊 i=1 n=1 t1 i=2 n=2 j i=3 n=3 構(gòu)造塊 i=4 n=4 t2 i=5 n=5 i i=6 n=6 靜態(tài)塊 i=7 n=99 j i=8 n=100 構(gòu)造塊 i=9 n=101 init i=10 n=102 復(fù)制代碼

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

  • 運(yùn)行main方法的時(shí)候,JVM會(huì)調(diào)用ClassLoader來加載InitializeDemo類,那么一起源于這次加載。
  • 上面有四個(gè)靜態(tài)屬性,所以會(huì)按順序逐一初始化這四個(gè)靜態(tài)屬性。
  • private static int k = 1; 此時(shí)將k初始化為1。
  • private static InitializeDemo t1 = new InitializeDemo("t1");創(chuàng)建InitializeDemo對(duì)象,那么按照核心理念中的順序,先執(zhí)行private int j = print("j");,打印出j,然后執(zhí)行構(gòu)造 塊,最后執(zhí)行構(gòu)造方法。 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,之前是從默認(rèn)的0開始++的。 8.靜態(tài)屬性初始化完畢,代碼走到靜態(tài)塊,打印出靜態(tài)塊,此時(shí)n=99。 9.靜態(tài)屬性和靜態(tài)塊執(zhí)行完畢,然后執(zhí)行main方法中的代碼new InitializeDemo("init"); 10.main方法中創(chuàng)建對(duì)象,先初始化非靜態(tài)屬性,private int j = print("j");打印j,然后執(zhí)行構(gòu)造塊,最后執(zhí)行構(gòu)造方法。
  • 不知道我解說清楚了沒有,只要把握住核心理念,碰到在復(fù)雜的問題也都不會(huì)怕了。

    用一個(gè)公式概括一下Java對(duì)象初始化執(zhí)行優(yōu)先級(jí)別

    (靜態(tài)屬性=靜態(tài)代碼塊)> (非靜態(tài)屬性 = 構(gòu)造塊)> 構(gòu)造方法

    總結(jié)一下核心理念

  • 靜態(tài)只在類加載的時(shí)候執(zhí)行,且執(zhí)行一次。
  • 非靜態(tài)只在實(shí)例化的時(shí)候執(zhí)行,且每次實(shí)例化都執(zhí)行。
  • 靜態(tài)在非靜態(tài)之前執(zhí)行。
  • 靜態(tài)屬性和靜態(tài)塊的執(zhí)行順序取決于編碼順序,對(duì)它們一視同仁。
  • 非靜態(tài)屬性和構(gòu)造塊的執(zhí)行順取決于編碼順序,對(duì)它們也一視同仁。
  • 最后執(zhí)行構(gòu)造方法。
  • 上面的總結(jié)有點(diǎn)繞對(duì)吧,問題進(jìn)一步簡(jiǎn)化的話,就更好理解了: 讀者將靜態(tài)代碼塊視為一個(gè)靜態(tài)屬性,將構(gòu)造塊視為一個(gè)非靜態(tài)屬性,那么問題簡(jiǎn)化到了這種路線“靜態(tài)屬性-->非靜態(tài)屬性-->構(gòu)造方法“

    不積跬步無以至千里,祝愿大家學(xué)習(xí)進(jìn)步,樂于分享~ ~

    寫在最后

    最后,歡迎做Java的工程師朋友們加入Java高級(jí)架構(gòu)進(jìn)階Qqun:963944895

    群內(nèi)有技術(shù)大咖指點(diǎn)難題,還提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)

    比你優(yōu)秀的對(duì)手在學(xué)習(xí),你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 我們必須不斷學(xué)習(xí),否則我們將被學(xué)習(xí)者超越!

    趁年輕,使勁拼,給未來的自己一個(gè)交代!

    轉(zhuǎn)載于:https://juejin.im/post/5cd96f2a6fb9a0320c5ad0f7

    總結(jié)

    以上是生活随笔為你收集整理的阿里面试题——Java对象初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。