top
Loading...
Java虛擬機(JVM)對象創建淺析
你認為java虛擬機什么時候會創建一個對象?如果能回答出下面的問題,你就可以不用繼續向下看了。

class A{
static final int a = 10;

static{
System.out.println( "initializing A" );
}

}

class B{
public static void main(String[] args){
System.out.println(A.a);
}

static{
System.out.println( "initializing B" );
}
}

我們調用B的main函數,會得到什么輸出?

經過考慮后,你是不是認為應該得到:

"initializing B"
"initializing A"
10

這個結果?不對,其實結果是:

"initializing B"
10

嗯?A沒有被實例化?

其實,java虛擬機會在6種情況下創建一個對象,分別是:

·創建類的新實例

·調用類中聲明的靜態方法

·操作類或接口中聲明的非常量靜態字段

·調用Java API中特定的反射方法

·初始化一個類的子類

·制定一個類作為Java虛擬機啟動時的初始化類

java虛擬機只有在第一次主動使用一個類的情況下才會初始化該類。在以上6種情況下,虛擬機認為正在主動使用該類,所以會對其進行初始化,記住這6條,SCJP可能會出現(只是如果,可能考試不會涉及到虛擬機一層)

順便說一下,任何一個類的初始化都要求它的所有祖先類(非祖先接口)預先被初始化,而接口的初始化則不需要祖先接口預先被初始化。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗