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

首頁 > 編程 > Java > 正文

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

2019-11-26 15:15:30
字體:
供稿:網(wǎng)友

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

具體的題目我肯定記不清,不過我們可以換個直接的問法,如果類A和類B中有靜態(tài)變量,靜態(tài)語句塊,非靜態(tài)變量,非靜態(tài)語句塊,構(gòu)造函數(shù),靜態(tài)方法,非靜態(tài)方法,同時類A繼承類B,請問當(dāng)實(shí)例化A時,類內(nèi)部的加載順序是什么?

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

Class B:

public class B{//靜態(tài)變量	static int i=1;//靜態(tài)語句塊static {	System.out.println("Class B1:static blocks"+i);}//非靜態(tài)變量int j=1;//靜態(tài)語句塊static{	i++;	System.out.println("Class B2:static blocks"+i);}//構(gòu)造函數(shù)public B(){	i++;	j++;	System.out.println("constructor B: "+"i="+i+",j="+j);}//非靜態(tài)語句塊{  i++;  j++;  System.out.println("Class B:common blocks"+"i="+i+",j="+j);}//非靜態(tài)方法public void bDisplay(){	i++;	System.out.println("Class B:static void bDisplay():	"+"i="+i+",j="+j);	return ;}//靜態(tài)方法public static void bTest(){	i++;	System.out.println("Class B:static void bTest():	"+"i="+i);	return ;}}


Class A:

public class A extends B{//靜態(tài)變量	static int i=1;//靜態(tài)語句塊static {	System.out.println("Class A1:static blocks"+i);}//非靜態(tài)變量int j=1;//靜態(tài)語句塊static{	i++;	System.out.println("Class A2:static blocks"+i);}//構(gòu)造函數(shù)public A(){  	super();	i++;	j++;	System.out.println("constructor A: "+"i="+i+",j="+j);}//非靜態(tài)語句塊{  i++;  j++;  System.out.println("Class A:common blocks"+"i="+i+",j="+j);}//非靜態(tài)方法public void aDisplay(){	i++;	System.out.println("Class A:static void aDisplay():	"+"i="+i+",j="+j);	return ;}//靜態(tài)方法public static void aTest(){	i++;	System.out.println("Class A:static void aTest():	"+"i="+i);	return ;}}

Class ClassLoading :

public class ClassLoading {		public static void main (String args[]) {		A a=new A();		a.aDisplay();	}}

程序運(yùn)行結(jié)果如圖:

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

1.若要加載類A,則先加載執(zhí)行其父類B(Object)的靜態(tài)變量以及靜態(tài)語句塊(執(zhí)行先后順序按排列的先后順序)。
2.然后再加載執(zhí)行類A的靜態(tài)變量以及靜態(tài)語句塊。(并且1、2步驟只會執(zhí)行1次)
3.若需實(shí)例化類A,則先調(diào)用其父類B的構(gòu)造函數(shù),并且在調(diào)用其父類B的構(gòu)造函數(shù)前,依次先調(diào)用父類B中的非靜態(tài)變量及非靜態(tài)語句塊.最后再調(diào)用父類B中的構(gòu)造函數(shù)初始化。
4.然后再依次調(diào)用類A中的非靜態(tài)變量及非靜態(tài)語句塊.最后調(diào)用A中的構(gòu)造函數(shù)初始化。( 并且3、4步驟可以重復(fù)執(zhí)行)
5.而對于靜態(tài)方法和非靜態(tài)方法都是被動調(diào)用,即系統(tǒng)不會自動調(diào)用執(zhí)行,所以用戶沒有調(diào)用時都不執(zhí)行,主要區(qū)別在于靜態(tài)方法可以直接用類名直接調(diào)用(實(shí)例化對象也可以),而非靜態(tài)方法只能先實(shí)例化對象后才能調(diào)用。

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 尼勒克县| 神农架林区| 遂宁市| 封丘县| 东阳市| 乌兰察布市| 阿鲁科尔沁旗| 闽清县| 曲麻莱县| 辉县市| 乳源| 广饶县| 长泰县| 卢氏县| 澳门| 城步| 内乡县| 故城县| 佛教| 康定县| 那坡县| 威海市| 阜康市| 治县。| 盐边县| 乌海市| 钟山县| 武陟县| 孙吴县| 通山县| 农安县| 虎林市| 乌海市| 红原县| 寿光市| 台东县| 昔阳县| 济阳县| 蕉岭县| 库尔勒市| 甘南县|