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