java 初始化與main方法

1,首先由一位網友的博文引出話題:

地址:http://blog.csdn.net/tan605963296/article/details/5562928

Java的類是用到纔開始加載的,並且在每個類的構造器調用之前,類的每個域(成員變量)都要首先被編譯器初始化一次,然後才輪到構造器來幹活兒。但是,Java的初始化是惰性的,Java編譯器會保證每個變量在使用之前會被初始化,因此Java中只要求程序員在合適的地方爲類成員給一個有效的值即可。

每當執行Java編譯器的時候,編譯器會尋找指定的類,當它找到類時,首先需要初始化static變量,因爲這些成員可以在沒有實例的情況下運行,接着,再按照變量的聲明順序依次初始化類的成員,成員初始化完畢之後才爲自己調用構造器,一切進行完畢之後,纔可以調用方法。但主類比較特殊,主方法會在構造器之前,static變量初始化之後調用,這是由於Java的惰性初始化,在main方法被調用之前無法知道是否存在主類的實例。

主類爲什麼特殊呢,可以這樣理解:public void main(String []args)主方法是靜態的,可以把它看做靜態成員,所以在靜態變量初始化之後調用。

public class InitialTest1{
      int a;
      int b;
      static int c;
     {
            a=-1;
            b=1;
     }//這個就是所謂的初始化代碼塊
     static {
             c=100;
     }//static成員有專屬的static初始化代碼塊
     InitialTest(){Syetem.out.println("InitialTest creat now!")}//這個和C++確實不同,權限大爲縮減
}
2,如果想運行上面的程序,Jvm會找不到入口,但是下面的程序會得到執行:

package com.puzzle.initialization;

public class InitialTest {

	static{
		System.out.println("初始化塊");
	}
	public static void main(String[] args) {
		
	}
}
所以說:main方法在某種程度上只是提供了一個入口,有了這個入口,程序就可以運行,即使main方法裏面什麼都沒有。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章