程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中類的加載次序分析(經常使用於面試題)

Java中類的加載次序分析(經常使用於面試題)

編輯:關於JAVA

Java中類的加載次序分析(經常使用於面試題)。本站提示廣大學習愛好者:(Java中類的加載次序分析(經常使用於面試題))文章只能為提供參考,不一定能成為您想要的結果。以下是Java中類的加載次序分析(經常使用於面試題)正文


這實際上是客歲校招時我碰到的一道阿裡巴巴的口試題(認可有點長遠了-。-),嗯,假如我沒記錯的話,其時是作為Java偏向的一道選做年夜題。固然題意沒有這麼直白,標題只需求你寫出法式運轉後一切System.out.println的輸入成果,個中法式是標題給的,而各個System.out.println的履行次序分歧會招致最初法式輸入的成果也分歧。

詳細的標題我確定記不清,不外我們可以換個直接的問法,假如類A和類B中有靜態變量,靜態語句塊,非靜態變量,非靜態語句塊,結構函數,靜態辦法,非靜態辦法,同時類A繼續類B,請問當實例化A時,類外部的加載次序是甚麼?

其時我也是一頭霧水,過後我就本身寫了一個小Demo,這才曉得了類外部的現實加載順,測試代碼以下:

Class B:

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


Class A:

public class A extends B{
//靜態變量	
static int i=1;
//靜態語句塊
static {
	System.out.println("Class A1:static blocks"+i);
}
//非靜態變量
int j=1;
//靜態語句塊
static{
	i++;
	System.out.println("Class A2:static blocks"+i);
}
//結構函數
public A(){
  	super();
	i++;
	j++;
	System.out.println("constructor A: "+"i="+i+",j="+j);
}
//非靜態語句塊
{
  i++;
  j++;
  System.out.println("Class A:common blocks"+"i="+i+",j="+j);
}
//非靜態辦法
public void aDisplay(){
	i++;
	System.out.println("Class A:static void aDisplay():	"+"i="+i+",j="+j);
	return ;
}
//靜態辦法
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();
	}
}

法式運轉成果如圖:

經由過程上述示圖,我們可以比擬清楚的看出java類的全部加載進程。

1.若要加載類A,則先加載履行其父類B(Object)的靜態變量和靜態語句塊(履行前後次序按分列的前後次序)。
2.然後再加載履行類A的靜態變量和靜態語句塊。(而且1、2步調只會履行1次)
3.若需實例化類A,則先挪用其父類B的結構函數,而且在挪用其父類B的結構函數前,順次先挪用父類B中的非靜態變量及非靜態語句塊.最初再挪用父類B中的結構函數初始化。
4.然後再順次挪用類A中的非靜態變量及非靜態語句塊.最初挪用A中的結構函數初始化。( 而且3、4步調可以反復履行)
5.而關於靜態辦法和非靜態辦法都是主動挪用,即體系不會主動挪用履行,所以用戶沒有挪用時都不履行,重要差別在於靜態辦法可以直接用類名直接挪用(實例化對象也能夠),而非靜態辦法只能先實例化對象後能力挪用。

OK,明天就總結到這裡了,假如有處所說的欠好或有毛病的處所,迎接年夜家指出,定當糾正,感謝。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved