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方法裡面什麼都沒有。