Java虛擬機(JVM)對象創建淺析
你認為java虛擬機什么時候會創建一個對象?如果能回答出下面的問題,你就可以不用繼續向下看了。
我們調用B的main函數,會得到什么輸出?
經過考慮后,你是不是認為應該得到:
這個結果?不對,其實結果是:
嗯?A沒有被實例化?
其實,java虛擬機會在6種情況下創建一個對象,分別是:
·創建類的新實例
·調用類中聲明的靜態方法
·操作類或接口中聲明的非常量靜態字段
·調用Java API中特定的反射方法
·初始化一個類的子類
| 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可能會出現(只是如果,可能考試不會涉及到虛擬機一層)
順便說一下,任何一個類的初始化都要求它的所有祖先類(非祖先接口)預先被初始化,而接口的初始化則不需要祖先接口預先被初始化。