構(gòu)造函數(shù)
格式:類名(參數(shù)1葵孤,參數(shù)2,…){構(gòu)造函數(shù)執(zhí)行語句}沙郭;
關(guān)于構(gòu)造函數(shù)佛呻,以下幾點(diǎn)要注意:
1.對象一建立,就會調(diào)用與之相應(yīng)的構(gòu)造函數(shù)病线,也就是說吓著,不建立對象,構(gòu)造函數(shù)時不會運(yùn)行的送挑。
2.構(gòu)造函數(shù)的作用是用于給對象進(jìn)行初始化绑莺。
3.構(gòu)造函數(shù)籠統(tǒng)來說也是函數(shù),它具備函數(shù)的一些特性惕耕,也不具備一些特性纺裁,可以把它看成是特殊的函數(shù)。它可以重載(重載時參數(shù)類型與參數(shù)個數(shù)有一項不同即可司澎,但僅僅函數(shù)返回值類型不同是不行的)欺缘,可以被權(quán)限修飾符修飾,但是它沒有返回值(注意:這與平常所說的函數(shù)返回值類型是void不同)挤安。
4.當(dāng)一個類中沒有定義構(gòu)造函數(shù)時谚殊,那么系統(tǒng)會默認(rèn)給該類加入一個空參數(shù)的構(gòu)造方法。但是當(dāng)在類中自定義構(gòu)造函數(shù)后蛤铜,默認(rèn)的構(gòu)造函數(shù)就沒有了嫩絮,即使是自定義的構(gòu)造函數(shù)也是空參數(shù)的也是這樣,因?yàn)槟钱吘故悄恪白远x”的围肥!
5.構(gòu)造函數(shù)和一般函數(shù)不僅在寫法上有不同剿干,在運(yùn)行上也有不同。構(gòu)造函數(shù)是在對象一建立就運(yùn)行穆刻,給對象初始化置尔,而一般函數(shù)是對象調(diào)用時才執(zhí)行,給對象添加對象具備的功能氢伟。
一個對象建立撰洗,構(gòu)造函數(shù)只運(yùn)行一次,而一般方法可以被該對象調(diào)用多次腐芍。
6.定義構(gòu)造函數(shù)的需求性:當(dāng)分析事物時,該事物存在具備一些特性或者行為试躏,那么將這些內(nèi)容定義在構(gòu)造函數(shù)中猪勇。
構(gòu)造代碼塊
格式:{構(gòu)造代碼塊執(zhí)行語句};
關(guān)于構(gòu)造代碼塊颠蕴,以下幾點(diǎn)要注意:
1.構(gòu)造代碼塊的作用是給對象進(jìn)行初始化泣刹。
2.對象一建立就運(yùn)行構(gòu)造代碼塊了助析,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行。這里要強(qiáng)調(diào)一下椅您,有對象建立外冀,才會運(yùn)行構(gòu)造代碼塊,類不能調(diào)用構(gòu)造代碼塊的掀泳,而且構(gòu)造代碼塊與構(gòu)造函數(shù)的執(zhí)行順序是前者先于后者執(zhí)行雪隧。
3.構(gòu)造代碼塊與構(gòu)造函數(shù)的區(qū)別是:構(gòu)造代碼塊是給所有對象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對應(yīng)的對象初始化员舵,因?yàn)闃?gòu)造函數(shù)是可以多個的脑沿,運(yùn)行哪個構(gòu)造函數(shù)就會建立什么樣的對象,但無論建立哪個對象马僻,都會先執(zhí)行相同的構(gòu)造代碼塊庄拇。也就是說,構(gòu)造代碼塊中定義的是不同對象共性的初始化內(nèi)容韭邓。
靜態(tài)代碼塊
格式:static{靜態(tài)代碼塊執(zhí)行語句}措近;
關(guān)于靜態(tài)代碼塊,要注意的是:
1.它是隨著類的加載而執(zhí)行女淑,只執(zhí)行一次瞭郑,并優(yōu)先于主函數(shù)。具體說诗力,靜態(tài)代碼塊是由類調(diào)用的凰浮,當(dāng)然,建立對象的時候苇本,它也會執(zhí)行袜茧,但是建立多個對象,它也是只會執(zhí)行一次瓣窄,并不是說每次建立對象它都要執(zhí)行笛厦,因?yàn)樗怯深愓{(diào)用的,且只執(zhí)行一次俺夕!就它優(yōu)先于主函數(shù)而執(zhí)行這點(diǎn)來說裳凸,因?yàn)橹骱瘮?shù)也是由類調(diào)用的,所以類可以控制著執(zhí)行的順序劝贸,而實(shí)際上姨谷,類調(diào)用時,先執(zhí)行靜態(tài)代碼塊映九,然后才執(zhí)行主函數(shù)的梦湘。
2.靜態(tài)代碼塊其實(shí)就是給類初始化的,而構(gòu)造代碼塊是給對象初始化的。區(qū)分著理解比較容易記牢捌议。
下面結(jié)合一個小例子來具體分析三者的用法哼拔。
classStaticCode{
? int num=9;
? StaticCode(){
? ? ?System.out.println("b");
? }
? static{
? ? System.out.println("a");
? }
? {
? ? System.out.println("c");
? }
? StaticCode(int x){
? ? System.out.println("d");
? }
}
public classStaticCodeDemo {
? public static voidmain(String[] args){
? ? newStaticCode(1);
? }
}
運(yùn)行結(jié)果是
a
c
d
這是因?yàn)椋骱瘮?shù)中的執(zhí)行語句是new StaticCode(1);因?yàn)檫@個語句調(diào)用了StaticCode類并調(diào)用StaticCode的一個構(gòu)造函數(shù)建立對象瓣颅,那么在StaticCode類中倦逐,先執(zhí)行的是靜態(tài)代碼塊
static{
? ? System.out.println("a");
? }
它是在調(diào)用類時立即執(zhí)行,但此時還沒有建立對象宫补。然后執(zhí)行的是構(gòu)造代碼塊檬姥,
{
? ? System.out.println("c");
}
這是在建立對象時執(zhí)行,但它的執(zhí)行是優(yōu)先于構(gòu)造函數(shù)的守谓。接著執(zhí)行的是對應(yīng)的構(gòu)造函數(shù)
StaticCode(int x){
? ? System.out.println("d");
}
穿铆,這個構(gòu)造函數(shù)與new StaticCode(1);有著相同的參數(shù)個數(shù)和對應(yīng)的參數(shù)類型,執(zhí)行語句自動匹配尋找對應(yīng)的構(gòu)造函數(shù)斋荞。
另外荞雏,StaticCode類中有個成員變量num,如果將靜態(tài)代碼塊改為
static{
? ? System.out.println("a"+this.num);
?}
則編譯不通過平酿,因?yàn)殪o態(tài)代碼塊只能調(diào)用靜態(tài)變量凤优,非靜態(tài)成員變量在對象沒有建立前是不存在的,這也幫助理解了靜態(tài)代碼塊是在對象建立前執(zhí)行的蜈彼。
如果將構(gòu)造代碼塊改為
{
? ? System.out.println("c,num="+this.num);
}
那么將編譯無誤筑辨,運(yùn)行正確,因?yàn)闃?gòu)造代碼塊是在對象建立后才運(yùn)行的幸逆,是由對象調(diào)用的棍辕,對象建立后,成員變量num已經(jīng)存在了还绘,所以不會出錯楚昭。
運(yùn)行結(jié)果如下
a
c,num=9
d
運(yùn)行結(jié)果為0