①:Java首次會自動對變量進行初始化,其順序優於構造器;
②:如果一個域是靜態的的基本類型域,且也沒有對它進行初始化,那么它就會獲得基本類型的標准初值,如果它是一個對象引用,那么他的默認初始化值為null;
③:Java在執行一個類時,會沖main方法入口開始,在執行main()之前,需要加載包含main()方法的類,此時編譯器會先對該類的變量進行初始化,靜態的優與非靜態的,如果只基本類型直接初始化,如果是應用類型,則對靜態的引用進行初始化,
比如:
class A{
public static void main(){
print("dddddddddd");
}
static Table=new Table();
}
class Table {
static Bow bow1=new Bow();
Table(){
printf("table初始化");
}
static Bow bow2=new Bow();
}
類似上面的代碼,在執行main()函數之前會先執行main函數后面的一條靜態語句,在執行靜態語句時,會調用相應的Table的類,在執行Table的構造器之前會對Table類中的靜態語句進行初始化,執行完Table構造器之后的靜態語句之后再執行Table的構造器(
靜態的對象只會被初始化一次,如果第二次牽扯到靜態的域時,程序不會對它進行二次初始化)
總結:①構造器可以看成是靜態的
②:初始化的順序是先靜態對象,然后非靜態,
③:對象的創建過程:1):當創建一個對象時,Java解釋器會先定位到該對象的.class文件;2)加載該.class文件,該過程會對有關靜態初始化的操作會被完成(也就是說只在被加載時進行一次)。
3):在內存中開辟一個空間用於放置這個對象,並對基本的變量進行初始化(基本類型的初始化為初始值,引用對象初始化為null),
4) : 執行完所有的變量初始化后,就開始執行構造器方法:
詳細內容可以參見 《Java 編程思想——p95--p96》