怎么理解“通過構造方法初始化name” 和 "通過初始化塊初始化sex" 代碼不都是一樣的嗎?
// 構造方法
public ?HelloWorld ? ? ?() {?
System.out.println("通過構造方法初始化name");
name = "tom";
}
? ??
? ? // 初始化塊
{?
System.out.println("通過初始化塊初始化sex");
sex = "男";
}
? ??
? ? // 靜態初始化塊
static ? ? {?
System.out.println("通過靜態初始化塊初始化age");
age = 20;
}
? ??
2016-01-27
說明你對程序的運行還不了解,沒有真正理解這個程序。這種情況下,我建議你采用第一季教過的debug方法進行調試,弄清楚程序的執行過程。
main方法之前完成的其實是類的申明,是所有workhorse class(主力類)都要完成的申明工作,前面的內容暫時是不工作的(除了靜態初始化塊)。一般情況下這種類的main方法其實是用來做測試的,所以我們debug的時候在main的第一條語句設置breakpoint。
進入調試之后,會發現console區域立馬顯示了“通過靜態初始化塊初始化age”,這說明靜態初始化塊在類加載的時候就執行了,先于對象的構造。然后運行HelloWorld hello=new HelloWorld();語句就會發現,”通過初始化塊初始化sex““通過構造方法初始化name”先后出現,這說明先執行了初始化塊,再執行了構造方法。這是因為賦值的完成,必須在對象創建之前完成。就好比,我要去買一個某種屏幕大?。ㄟ@里就是沒有賦值的屬性)的手機,我可以說“因為我想買5吋的手機(屬性賦值),所以我選擇了這款華為手機(對象創建)”,但是我不能說“因為我買了這款華為手機(對象創建),所以這款手機是5吋屏幕(屬性賦值)”。這個邏輯順序是不對的。
2016-01-26
代碼的位置不同。緊挨著構造方法名的是構造方法,隨后才是普通初始化塊或靜態初始化塊。他們的執行順序不同。
2016-01-26
構造函數初始化是在創建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。初始化塊的用處是,如果一段初始化處理代碼對所有對象完全相同,且無須接受任何參數,就可以把這段提取到初始化塊中。