W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
構(gòu)造函數(shù)是用于在對(duì)象創(chuàng)建后立即初始化對(duì)象的代碼塊。
構(gòu)造函數(shù)的結(jié)構(gòu)看起來(lái)類(lèi)似于一個(gè)方法。
構(gòu)造函數(shù)聲明的一般語(yǔ)法是
<Modifiers> <Constructor Name>(<parameters list>) throws <Exceptions list> { }
構(gòu)造函數(shù)的聲明以修飾符開(kāi)頭。
構(gòu)造函數(shù)可以將其訪問(wèn)修飾符作為public,private,protected或package-level(無(wú)修飾符)。
構(gòu)造函數(shù)名稱與類(lèi)的簡(jiǎn)單名稱相同。
構(gòu)造函數(shù)名稱后面是一對(duì)括號(hào),可能包括參數(shù)。
可選地,右括號(hào)后面可以是關(guān)鍵字throws,其后面是逗號(hào)分隔的異常列表。
以下代碼顯示了聲明類(lèi)Test的構(gòu)造函數(shù)的示例。類(lèi)的名稱和構(gòu)造函數(shù)的名稱必須匹配。
public class Test { public Test() { // Code goes here } }
與方法不同,構(gòu)造函數(shù)沒(méi)有返回類(lèi)型。
我們使用一個(gè)帶有new操作符的構(gòu)造函數(shù)來(lái)在創(chuàng)建新實(shí)例之后初始化類(lèi)的實(shí)例。
new運(yùn)算符創(chuàng)建一個(gè)對(duì)象,構(gòu)造函數(shù)初始化該對(duì)象。
以下語(yǔ)句使用Test類(lèi)的構(gòu)造函數(shù)來(lái)初始化Test類(lèi)的對(duì)象:
Test t = new Test();
以下代碼顯示了如何使用構(gòu)造函數(shù)
class Cat { public Cat() { System.out.println("in constructor..."); } } public class Main { public static void main(String[] args) { // Create a Cat object and ignore its reference new Cat(); // Create another Cat object and store its reference in c Cat c = new Cat(); } }
上面的代碼生成以下結(jié)果。
一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù)。它們稱為重載構(gòu)造函數(shù)。
如果一個(gè)類(lèi)有多個(gè)構(gòu)造函數(shù),它們的數(shù)量,順序或參數(shù)類(lèi)型都必須與其他構(gòu)造函數(shù)不同。
下面的代碼聲明兩個(gè)構(gòu)造函數(shù)。一個(gè)構(gòu)造函數(shù)不接受參數(shù),另一個(gè)接受String參數(shù)。
class Car { // Constructor #1 public Car() { System.out.println("A car is created."); } // Constructor #2 public Car(String name) { System.out.println("A car named " + name + " is created."); } } public class Main { public static void main(String[] args) { Car d1 = new Car(); // Uses Constructor #1 Car d2 = new Car("My Car"); // Uses Constructor #2 } }
上面的代碼生成以下結(jié)果。
每個(gè)對(duì)象創(chuàng)建表達(dá)式調(diào)用一次構(gòu)造函數(shù)。
我們可以在對(duì)象創(chuàng)建的過(guò)程中只執(zhí)行一個(gè)構(gòu)造函數(shù)的代碼一次。
構(gòu)造函數(shù)可以調(diào)用同一類(lèi)的另一個(gè)構(gòu)造函數(shù)。讓我們考慮下面的Test類(lèi)。它聲明兩個(gè)構(gòu)造函數(shù);一個(gè)不接受參數(shù),一個(gè)接受一個(gè)int參數(shù)。
我們必須使用關(guān)鍵字this從另一個(gè)構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)。
下面的代碼使用語(yǔ)句“this(1);”從沒(méi)有參數(shù)的構(gòu)造函數(shù)中調(diào)用具有int參數(shù)的構(gòu)造函數(shù)。
class Test { Test() { this(1); // OK. Note the use of the keyword this. } Test(int x) { } }
如果構(gòu)造函數(shù)調(diào)用另一個(gè)構(gòu)造函數(shù),它必須是構(gòu)造函數(shù)體中的第一個(gè)可執(zhí)行語(yǔ)句。
構(gòu)造函數(shù)不能調(diào)用自身,因?yàn)樗鼘?dǎo)致遞歸調(diào)用。
構(gòu)造函數(shù)在其聲明中不能有返回類(lèi)型。
我們可以在構(gòu)造函數(shù)體中使用沒(méi)有返回表達(dá)式的return語(yǔ)句。
當(dāng)一個(gè)構(gòu)造函數(shù)中的返回語(yǔ)句被執(zhí)行時(shí),控制返回給調(diào)用者,忽略構(gòu)造函數(shù)的其余代碼。
以下代碼顯示了在構(gòu)造函數(shù)中使用return語(yǔ)句的示例。
class Test { public Test(int x) { if (x < 0) { return; } System.out.println("here"); } }
構(gòu)造函數(shù)的訪問(wèn)級(jí)別決定了可以在對(duì)象創(chuàng)建表達(dá)式中使用該構(gòu)造函數(shù)的程序。
我們可以為構(gòu)造函數(shù)指定四個(gè)訪問(wèn)級(jí)別之一:public,private,protected和package-level。
下面的代碼聲明了Test類(lèi)的四個(gè)構(gòu)造函數(shù)。
// Class Test has public access level public class Test { // Constructor #1 - Package-level access Test() { } // Constructor #2 - public access level public Test(int x) { } // Constructor #3 - private access level private Test(int x, int y) { } // Constructor #4 - protected access level protected Test(int x, int y, int z) { } }
具有公共訪問(wèn)級(jí)別的構(gòu)造函數(shù)可以在程序的任何部分中使用。
具有私有訪問(wèn)級(jí)別的構(gòu)造函數(shù)只能在聲明它的同一類(lèi)中使用。
具有受保護(hù)訪問(wèn)級(jí)別的構(gòu)造函數(shù)可以在具有在其中聲明類(lèi)的相同包的程序中以及在任何包中的任何后代類(lèi)內(nèi)使用。
具有包級(jí)訪問(wèn)權(quán)限的構(gòu)造函數(shù)可以在聲明其類(lèi)的同一個(gè)包中使用。
具有包級(jí)訪問(wèn)權(quán)限的構(gòu)造函數(shù)可以在聲明其類(lèi)的同一個(gè)包中使用。
編譯器添加的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù)。
默認(rèn)構(gòu)造函數(shù)沒(méi)有任何參數(shù)。
默認(rèn)構(gòu)造函數(shù)也稱為無(wú)參數(shù)構(gòu)造函數(shù)。
如果類(lèi)已經(jīng)有一個(gè)構(gòu)造函數(shù),編譯器不會(huì)添加任何構(gòu)造函數(shù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: