更新時(shí)間:2022-12-09 11:53:42 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1705次
Java構(gòu)造函數(shù)是在實(shí)例化對象時(shí)調(diào)用的特殊方法。換句話說,當(dāng)您使用new關(guān)鍵字時(shí)。Java 構(gòu)造函數(shù)的目的是在使用之前初始化新創(chuàng)建的對象。本 Java 構(gòu)造函數(shù)教程將更詳細(xì)地探討 Java 構(gòu)造函數(shù)。
這是一個(gè)創(chuàng)建對象的簡單示例,它會調(diào)用類構(gòu)造函數(shù):
MyClass myClassObj = new MyClass();
此示例導(dǎo)致MyClass創(chuàng)建一個(gè)新對象,并調(diào)用 的無參數(shù)構(gòu)造函數(shù) MyClass。稍后您將了解什么是無參數(shù)構(gòu)造函數(shù)。
Java 類構(gòu)造函數(shù)初始化該類的實(shí)例(對象)。通常,構(gòu)造函數(shù)會初始化需要初始化的對象的字段。Java 構(gòu)造函數(shù)也可以帶參數(shù),因此可以在創(chuàng)建時(shí)在對象中初始化字段。
這是一個(gè)簡單的 Java 構(gòu)造函數(shù)聲明示例。該示例顯示了一個(gè)非常簡單的 Java 類,它只有一個(gè)構(gòu)造函數(shù)。
公開課 MyClass {
公共 MyClass() {
}
}
構(gòu)造函數(shù)是這部分:
公共 MyClass() {
}
Java 構(gòu)造函數(shù)聲明的第一部分是訪問修飾符。訪問修飾符與方法和字段具有相同的含義。它們確定哪些類可以訪問(調(diào)用)構(gòu)造函數(shù)。
Java 構(gòu)造函數(shù)聲明的第二部分是構(gòu)造函數(shù)所屬類的名稱。使用構(gòu)造函數(shù)的類名向 Java 編譯器發(fā)出這是一個(gè)構(gòu)造函數(shù)的信號。還要注意構(gòu)造函數(shù)沒有返回類型,就像其他方法一樣。
Java 構(gòu)造函數(shù)聲明的第三部分是構(gòu)造函數(shù)可以采用的參數(shù)列表。構(gòu)造函數(shù)參數(shù)在構(gòu)造函數(shù)()的類名部分之后的括號內(nèi)聲明。在上面的構(gòu)造函數(shù)聲明示例中,沒有聲明任何參數(shù)。我將在本文后面展示一個(gè)帶有參數(shù)的 Java 構(gòu)造函數(shù)聲明示例。
Java 構(gòu)造函數(shù)聲明的第四部分是構(gòu)造函數(shù)的主體。{ }構(gòu)造函數(shù)的主體定義在參數(shù)列表之后的大括號內(nèi)。在上面的構(gòu)造函數(shù)示例中,構(gòu)造函數(shù)在構(gòu)造函數(shù)體內(nèi)沒有任何操作。它被稱為“空”構(gòu)造函數(shù)。
一個(gè)類可以有多個(gè)構(gòu)造函數(shù),只要它們的簽名(它們采用的參數(shù))不相同即可。您可以根據(jù)需要定義任意數(shù)量的構(gòu)造函數(shù)。當(dāng)一個(gè) Java 類包含多個(gè)構(gòu)造函數(shù)時(shí),我們說構(gòu)造函數(shù)被重載(有多個(gè)版本)。這就是 構(gòu)造函數(shù)重載的意思,一個(gè) Java 類包含多個(gè)構(gòu)造函數(shù)。
這是一個(gè) Java 構(gòu)造函數(shù)重載示例:
公開課 MyClass {
私人整數(shù) = 0;
公共 MyClass() {
}
公共 MyClass(int theNumber) {
this.number = theNumber;
}
}
上面的 Java 類包含兩個(gè)構(gòu)造函數(shù)。第一個(gè)構(gòu)造函數(shù)是一個(gè)無參數(shù)構(gòu)造函數(shù),這意味著它沒有參數(shù)(沒有參數(shù))。第二個(gè)構(gòu)造函數(shù)接受一個(gè)int參數(shù)。在構(gòu)造函數(shù)體內(nèi),int參數(shù)值被分配給一個(gè)字段,這意味著參數(shù)的值被復(fù)制到該字段中。該字段因此被初始化為給定的參數(shù)值。
this字段名前面的 關(guān)鍵字( this.number)不是必須的。它只是向編譯器發(fā)出信號,表明它是number被引用的命名字段。這在有關(guān)構(gòu)造函數(shù)參數(shù)的部分中有更詳細(xì)的解釋。
您不必為類定義構(gòu)造函數(shù),但如果您沒有定義任何構(gòu)造函數(shù),Java 編譯器將為您插入一個(gè)默認(rèn)的無參數(shù)構(gòu)造函數(shù)。因此,一旦類被編譯,它總是至少有一個(gè)無參數(shù)的構(gòu)造函數(shù)。
如果您確實(shí)為您的類定義了構(gòu)造函數(shù),那么 Java 編譯器不會將默認(rèn)的無參數(shù)構(gòu)造函數(shù)插入到您的類中。
正如您已經(jīng)看到的,Java 構(gòu)造函數(shù)可以采用參數(shù)。然后可以使用這些參數(shù)來初始化新創(chuàng)建對象的內(nèi)部狀態(tài)(字段)。這是一個(gè)例子:
公共課員工{
私有字符串 firstName = null;
私有字符串 lastName = null;
私人詮釋出生年 = 0;
公共員工(首先是字符串,
字符串最后,
整數(shù)年){
名字 = 第一個(gè);
姓氏 = 姓氏;
出生年份 = 年;
}
}
在此示例中,Java 構(gòu)造函數(shù)聲明以粗體標(biāo)記。如您所見,聲明了三個(gè)參數(shù):first,last和year。在構(gòu)造函數(shù)的主體中,這三個(gè)參數(shù)的值被分配給Employee 對象的字段。
每個(gè)參數(shù)后的換行符是可選的。Java 編譯器忽略此處的換行符。如果需要,您也可以將參數(shù)聲明寫在一行中,如下所示:
public Employee(String first, String last, int year) {
名字 = 第一個(gè);
姓氏 = 姓氏;
出生年份 = 年;
}
要調(diào)用這個(gè)采用三個(gè)參數(shù)的構(gòu)造函數(shù),您可以Employee像這樣實(shí)例化一個(gè)對象:
雇員 employee = new Employee("Jack", "Daniels", 2000);
參數(shù)在等號右側(cè)的類名之后的括號內(nèi)傳遞給構(gòu)造函數(shù)。然后創(chuàng)建對象,并執(zhí)行構(gòu)造函數(shù)。執(zhí)行上述構(gòu)造函數(shù)后,構(gòu)造函數(shù)初始化的字段將具有傳遞給構(gòu)造函數(shù)的參數(shù)值。
Java 構(gòu)造函數(shù)參數(shù)可以與字段同名。如果構(gòu)造函數(shù)參數(shù)與字段同名,則 Java 編譯器無法知道您指的是哪個(gè)。默認(rèn)情況下,如果參數(shù)(或局部變量)與同一類中的字段同名,則參數(shù)(或局部變量)為該字段“隱藏”。看看這個(gè)構(gòu)造函數(shù)示例:
公共課員工{
私有字符串 firstName = null;
私有字符串 lastName = null;
私人詮釋出生年 = 0;
公共雇員(字符串名字,
字符串姓氏,
整數(shù)出生年){
名字 = 名字;
姓氏 = 姓氏;
出生年 = 出生年;
}
}
在 Employee 類的構(gòu)造函數(shù)中,firstName,lastName和birthYear 標(biāo)識符現(xiàn)在引用構(gòu)造函數(shù)參數(shù),而不是同名的 Employee 字段。因此,構(gòu)造函數(shù)現(xiàn)在只需將參數(shù)設(shè)置為等于它們自己。Employee 字段永遠(yuǎn)不會被初始化。
要向 Java 編譯器表明您指的是 Employee 類的字段而不是參數(shù),請 this在字段名稱前放置關(guān)鍵字和一個(gè)點(diǎn)。以下是之前的 Java 構(gòu)造函數(shù)聲明在更改后的樣子:
公共課員工{
私有字符串 firstName = null;
私有字符串 lastName = null;
私人詮釋出生年 = 0;
公共雇員(字符串名字,
字符串姓氏,
整數(shù)出生年){
this.firstName = firstName;
this.lastName = lastName;
this.birthYear = birthYear;
}
}
現(xiàn)在,Employee 字段已在構(gòu)造函數(shù)中正確初始化。
在創(chuàng)建包含構(gòu)造函數(shù)的類的新實(shí)例時(shí)調(diào)用構(gòu)造函數(shù)。這是一個(gè) Java 構(gòu)造函數(shù)調(diào)用示例:
MyClass myClassVar = new MyClass();
MyClass此示例調(diào)用(調(diào)用)本文前面定義 的無參數(shù)構(gòu)造函數(shù)。
如果你想將參數(shù)傳遞給構(gòu)造函數(shù),你可以在類名后的括號中包含參數(shù),如下所示:
MyClass myClassVar = new MyClass(1975);
此示例將一個(gè)參數(shù)傳遞給采用as 參數(shù) 的MyClass構(gòu)造函數(shù)。int
在 Java 中,可以從另一個(gè)構(gòu)造函數(shù)內(nèi)部調(diào)用一個(gè)構(gòu)造函數(shù)。當(dāng)您從另一個(gè)構(gòu)造函數(shù)內(nèi)部調(diào)用一個(gè)構(gòu)造函數(shù)時(shí),您可以使用this關(guān)鍵字來引用該構(gòu)造函數(shù)。下面是在 Java 中從另一個(gè)構(gòu)造函數(shù)中調(diào)用一個(gè)構(gòu)造函數(shù)的示例:
公共課員工{
私有字符串 firstName = null;
私有字符串 lastName = null;
私人詮釋出生年 = 0;
公共員工(首先是字符串,
字符串最后,
整數(shù)年){
名字 = 第一個(gè);
姓氏 = 姓氏;
出生年份 = 年;
}
公共員工(首先是字符串,最后是字符串){
這個(gè)(第一個(gè),最后一個(gè),-1);
}
}
注意第二個(gè)構(gòu)造函數(shù)定義。在構(gòu)造函數(shù)的主體中,您可以找到以下 Java 語句:
這個(gè)(第一個(gè),最后一個(gè),-1);
this關(guān)鍵字后跟圓括號和參數(shù)表示正在調(diào)用同一個(gè) Java 類中的另一個(gè)構(gòu)造函數(shù) 。調(diào)用哪個(gè)其他構(gòu)造函數(shù)取決于您傳遞給構(gòu)造函數(shù)調(diào)用的參數(shù)(在this關(guān)鍵字后的括號內(nèi))。在此示例中,它是被調(diào)用的類中的第一個(gè)構(gòu)造函數(shù)。
在 Java 中,一個(gè)類可以擴(kuò)展另一個(gè)類。當(dāng)一個(gè)類擴(kuò)展另一個(gè)類時(shí),它也被稱為從它擴(kuò)展的類“繼承”。擴(kuò)展的類稱為子類,被擴(kuò)展的類稱為超類。在我的關(guān)于Java 中的繼承的教程中更詳細(xì)地介紹了繼承。
擴(kuò)展另一個(gè)類的類不繼承其構(gòu)造函數(shù)。但是,子類必須在其子類構(gòu)造函數(shù)內(nèi)部調(diào)用超類中的構(gòu)造函數(shù)!如果子類在其自身內(nèi)部調(diào)用另一個(gè)構(gòu)造函數(shù),則被調(diào)用的構(gòu)造函數(shù)必須調(diào)用超類構(gòu)造函數(shù)。
查看以下兩個(gè) Java 類。Car 類擴(kuò)展(繼承自)Vehicle 類。
公共類車輛{
私有字符串 regNo = null;
公共車輛(字符串編號){
this.regNo = 否;
}
}
公共類汽車擴(kuò)展車輛{
私人字符串品牌=空;
public Car(String br, String no) {
超級(沒有);
這個(gè)品牌 = br;
}
}
注意 Car 類中的構(gòu)造函數(shù)。它使用此 Java 語句調(diào)用超類中的構(gòu)造函數(shù):
超級(沒有);
使用關(guān)鍵字super是指使用關(guān)鍵字的類的超類super。當(dāng)super關(guān)鍵字后跟括號時(shí),就像這里一樣,它指的是超類中的構(gòu)造函數(shù)。在這種情況下,它指的是 Vehicle 類中的構(gòu)造函數(shù)。因?yàn)?Car 擴(kuò)展了 Vehicle,所以 Car 的構(gòu)造函數(shù)必須都調(diào)用 Vehicle 中的構(gòu)造函數(shù)。
構(gòu)造函數(shù)的訪問修飾符決定了應(yīng)用程序中哪些類可以調(diào)用該構(gòu)造函數(shù)。訪問修飾符在有關(guān)Java 訪問修飾符的文本中有更詳細(xì)的解釋 。
例如,如果聲明了構(gòu)造函數(shù),protected則只有同一包中的類或該類的子類才能調(diào)用該構(gòu)造函數(shù)。
一個(gè)類可以有多個(gè)構(gòu)造函數(shù),每個(gè)構(gòu)造函數(shù)可以有自己的訪問修飾符。因此,某些構(gòu)造函數(shù)可能對應(yīng)用程序中的所有類都可用,而其他構(gòu)造函數(shù)僅對同一包中的類、子類可用,甚至僅對類本身可用(私有構(gòu)造函數(shù))。
可以從 Java 構(gòu)造函數(shù)中拋出異常。下面是一個(gè)帶有可以拋出異常的構(gòu)造函數(shù)的 Java 類的示例:
公共汽車類 {
公共汽車(字符串品牌)拋出異常{
如果(品牌==空){
throw new Exception("品牌參數(shù)不能為空!");
}
}
}
注意throws Exception構(gòu)造函數(shù)聲明的部分。該部分聲明構(gòu)造函數(shù)可能會拋出一個(gè)Exception. 如果發(fā)生這種情況,則創(chuàng)建的Car實(shí)例無效。
下面是調(diào)用Car構(gòu)造函數(shù)的示例:
車車=空;
嘗試{
car = new Car("梅賽德斯");
//對汽車對象做點(diǎn)什么
} 趕上(異常 e){
// 處理異常
}
Car如果構(gòu)造函數(shù)拋出異常,car則永遠(yuǎn)不會為該變量分配對Car您嘗試創(chuàng)建的對象的引用。該car變量仍將指向 null。
如果要防止在無效狀態(tài)下創(chuàng)建給定類的對象,讓構(gòu)造函數(shù)拋出異常是個(gè)好主意。通常是構(gòu)造函數(shù)的輸入?yún)?shù)可能導(dǎo)致對象無效。如果構(gòu)造函數(shù)檢測到無效的輸入?yún)?shù),它會拋出異常并阻止將對象賦值給任何變量。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743