當java程式首次透過下面6中方式來使用某個類別或介面時,系統就會初始化該類別或介面。
(1)建立類別的實例。為某個類別建立實例的方式包括:使用new操作符來建立實例,透過反射來建立實例,透過反序列化的方式來建立實例。
(2)呼叫某個類別的類別方法(靜態方法)。
(3)存取某個類別變數或為某個類別變數。或為此變數賦值
(4)使用反射方式強制建立某個類別或介面對應的java.lang.Class物件。例如:Class,forName("Person"),如果系統還未初始化Person類,則先初 始化Person類,然後傳回Person類對應的java.lang.Class物件。
(5)初始化某個類別的子類別。子類別的父類別都會被初始化。
(6)直接使用java.exe指令執行某個主類,主類別先被初始化。
注意:
對於一個final型的類別變量,如果變數的值在編譯期就可以確定下來,那麼這個類別變數相當於“巨集變數”,java編譯器會在編譯時直接把這個類別變數出現的地方全部替換成它的值。因此即使程式使用靜態變數,也不會導致該類別的初始化。如下程式碼將不會列印出靜態初始化區塊
public class Test12 { static final String STRING="宏变量"; static{ System.out.println("静态初始化块"); } } class Test13{ public static void main(String[] args) { System.out.println(Test12.STRING); } }
#
反之,如果final修飾的類別變數不能在編譯時確定下來,則必須等到運行時才能確定該類別變數的值,如果透過該類別來存取它的類別變量,則會導致該類被初始化。 (下面的程式碼將會列印靜態初始化快)
public class Test12 { static final String STRING=""+System.currentTimeMillis(); static{ System.out.println("静态初始化块"); } } class Test13{ public static void main(String[] args) { System.out.println(Test12.STRING); }
相關推薦:
以上是java類別的初始化什麼時候進行? (附代碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!