1. 程式人生 > >什麼時候進行java類的初始化

什麼時候進行java類的初始化

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);
		}
	}