【詳解】java中 super關(guān)鍵字的作用
共 5563字,需瀏覽 12分鐘
·
2024-07-15 10:32
關(guān)注上面公眾號回復(fù)“激活碼”,獲取最新永久激活碼
1. 引言
在面向?qū)ο缶幊讨?,繼承是一個(gè)常見的概念。當(dāng)一個(gè)類繼承自另一個(gè)類時(shí),它會繼承父類的屬性和方法,并可以在此基礎(chǔ)上進(jìn)行擴(kuò)展。在Java中,使用關(guān)鍵字super來調(diào)用父類的構(gòu)造方法、成員變量和方法。本文將詳細(xì)介紹super()方法在Java中的用法和注意事項(xiàng)。
2. 調(diào)用父類的構(gòu)造方法
子類的構(gòu)造方法默認(rèn)會調(diào)用父類的無參構(gòu)造方法是因?yàn)樽宇愒诶^承父類時(shí),需要先實(shí)例化父類的成員變量和初始化父類的屬性。如果子類沒有顯式地調(diào)用父類的構(gòu)造方法,編譯器會自動在子類的構(gòu)造方法中插入super()語句來調(diào)用父類的無參構(gòu)造方法。
然而,如果父類沒有無參構(gòu)造方法,或者需要調(diào)用其他的父類構(gòu)造方法,就可以使用super()方法來顯式調(diào)用指定的父類構(gòu)造方法。使用super()方法調(diào)用父類構(gòu)造方法的語法是在子類的構(gòu)造方法中使用super關(guān)鍵字后跟括號,括號內(nèi)可以傳遞相應(yīng)的參數(shù)給父類構(gòu)造方法。
下面是一個(gè)示例代碼,演示了如何使用super()方法來調(diào)用父類構(gòu)造方法:
public classParent{
privateString name;
publicParent(){
System.out.println("Parent類的無參構(gòu)造方法被調(diào)用");
}
publicParent(String name){
this.name = name;
System.out.println("Parent類的有參構(gòu)造方法被調(diào)用,name值為:"+ name);
}
}
publicclassChildextendsParent{
publicChild(){
super();// 調(diào)用父類的無參構(gòu)造方法
System.out.println("Child類的無參構(gòu)造方法被調(diào)用");
}
publicChild(String name){
super(name);// 調(diào)用父類的有參構(gòu)造方法
System.out.println("Child類的有參構(gòu)造方法被調(diào)用,name值為:"+ name);
}
}
publicclassMain{
publicstaticvoidmain(String[] args){
Childchild1=newChild();// 輸出:Parent類的無參構(gòu)造方法被調(diào)用 Child類的無參構(gòu)造方法被調(diào)用
Childchild2=newChild("John");// 輸出:Parent類的有參構(gòu)造方法被調(diào)用,name值為:John Child類的有參構(gòu)造方法被調(diào)用,name值為:John
}
}
在示例代碼中,我們定義了一個(gè)Parent類和一個(gè)繼承自Parent類的Child類。Parent類有一個(gè)無參構(gòu)造方法和一個(gè)有參構(gòu)造方法,Child類分別有一個(gè)無參構(gòu)造方法和一個(gè)有參構(gòu)造方法。在Child類的構(gòu)造方法中使用super()方法來調(diào)用指定的父類構(gòu)造方法。在Main類中創(chuàng)建Child對象時(shí),可以看到父類構(gòu)造方法和子類構(gòu)造方法的調(diào)用順序和輸出結(jié)果。
通過使用super()方法來調(diào)用父類構(gòu)造方法,我們可以在子類中靈活地初始化父類的成員變量和屬性,并確保父類先于子類進(jìn)行實(shí)例化。這樣可以有效地繼承和擴(kuò)展父類的功能。
3. 實(shí)現(xiàn)構(gòu)造方法的重載
子類構(gòu)造方法重載的概念是指在子類中可以定義多個(gè)具有不同參數(shù)列表的構(gòu)造方法。子類構(gòu)造方法重載的作用是可以根據(jù)不同的情況選擇不同的構(gòu)造方法來初始化子類自己的成員變量,并調(diào)用父類的構(gòu)造方法來初始化父類的成員變量和屬性。
通過在子類中定義多個(gè)構(gòu)造方法,可以根據(jù)不同的需求來創(chuàng)建子類對象,而不需要在每次創(chuàng)建對象時(shí)都傳遞相同的參數(shù)。這樣可以提高代碼的靈活性和復(fù)用性。
下面是一個(gè)示例代碼,演示了如何使用super()方法實(shí)現(xiàn)構(gòu)造方法的重載:
public classParent{
privateString name;
privateint age;
publicParent(){
System.out.println("Parent類的無參構(gòu)造方法被調(diào)用");
}
publicParent(String name){
this.name = name;
System.out.println("Parent類的有參構(gòu)造方法1被調(diào)用,name值為:"+ name);
}
publicParent(String name, int age){
this.name = name;
this.age = age;
System.out.println("Parent類的有參構(gòu)造方法2被調(diào)用,name值為:"+ name +",age值為:"+ age);
}
}
publicclassChildextendsParent{
privateString school;
publicChild(){
super();// 調(diào)用父類的無參構(gòu)造方法
System.out.println("Child類的無參構(gòu)造方法被調(diào)用");
}
publicChild(String name){
super(name);// 調(diào)用父類的有參構(gòu)造方法1
System.out.println("Child類的有參構(gòu)造方法1被調(diào)用,name值為:"+ name);
}
publicChild(String name, int age, String school){
super(name, age);// 調(diào)用父類的有參構(gòu)造方法2
this.school = school;
System.out.println("Child類的有參構(gòu)造方法2被調(diào)用,name值為:"+ name +",age值為:"+ age +",school值為:"+ school);
}
}
publicclassMain{
publicstaticvoidmain(String[] args){
Childchild1=newChild();// 輸出:Parent類的無參構(gòu)造方法被調(diào)用 Child類的無參構(gòu)造方法被調(diào)用
Childchild2=newChild("John");// 輸出:Parent類的有參構(gòu)造方法1被調(diào)用,name值為:John Child類的有參構(gòu)造方法1被調(diào)用,name值為:John
Childchild3=newChild("Tom",10,"ABC School");// 輸出:Parent類的有參構(gòu)造方法2被調(diào)用,name值為:Tom,age值為:10 Child類的有參構(gòu)造方法2被調(diào)用,name值為:Tom,age值為:10,school值為:ABC School
}
}
在示例代碼中,我們定義了一個(gè)Parent類和繼承自Parent類的Child類。Parent類有三個(gè)構(gòu)造方法,分別是無參構(gòu)造方法、有參構(gòu)造方法1和有參構(gòu)造方法2。Child類定義了三個(gè)構(gòu)造方法,分別是無參構(gòu)造方法、有參構(gòu)造方法1和有參構(gòu)造方法2。
在Child類的構(gòu)造方法中使用super()方法來調(diào)用指定的父類構(gòu)造方法。根據(jù)調(diào)用的構(gòu)造方法的不同,會選擇不同的父類構(gòu)造方法來初始化父類的成員變量和屬性。在Main類中創(chuàng)建Child對象時(shí),可以看到不同構(gòu)造方法的調(diào)用順序和輸出結(jié)果。
通過在子類中實(shí)現(xiàn)構(gòu)造方法的重載,并使用super()方法來調(diào)用父類構(gòu)造方法,我們可以根據(jù)不同的需求來創(chuàng)建子類對象,實(shí)現(xiàn)更靈活的對象初始化。這樣可以提高代碼的復(fù)用性和可讀性。
4. 解決成員變量和方法的命名沖突
當(dāng)子類和父類擁有同名的成員變量或方法時(shí),使用super關(guān)鍵字可以明確指定調(diào)用的是父類的成員還是子類的成員。super關(guān)鍵字可以用于訪問父類的成員變量、成員方法和構(gòu)造方法。
使用super關(guān)鍵字的主要作用如下:
訪問父類的成員變量:當(dāng)子類和父類擁有同名的成員變量時(shí),使用super關(guān)鍵字可以訪問父類的成員變量,避免命名沖突。調(diào)用父類的成員方法:當(dāng)子類和父類擁有同名的成員方法時(shí),使用super關(guān)鍵字可以調(diào)用父類的成員方法,實(shí)現(xiàn)對父類方法的重用。調(diào)用父類的構(gòu)造方法:當(dāng)子類需要初始化父類的成員變量時(shí),使用super關(guān)鍵字可以調(diào)用父類的構(gòu)造方法。下面是一個(gè)示例代碼,演示了如何使用super關(guān)鍵字訪問父類中的成員變量和方法:
public classParent{
Stringname="Parent";
publicvoiddisplay(){
System.out.println("This is the Parent class.");
}
}
publicclassChildextendsParent{
Stringname="Child";
publicvoiddisplay(){
System.out.println("This is the Child class.");
}
publicvoidprint(){
System.out.println("Parent name: "+super.name);
System.out.println("Child name: "+this.name);
super.display();
this.display();
}
}
publicclassMain{
publicstaticvoidmain(String[] args){
Childchild=newChild();
child.print();
}
}
在示例代碼中,我們定義了一個(gè)Parent類和繼承自Parent類的Child類。Parent類和Child類都有一個(gè)名為name的成員變量,并且都有一個(gè)名為display的成員方法。
在Child類的print方法中,我們使用super關(guān)鍵字來訪問父類的成員變量name和父類的成員方法display。通過super.name和super.display(),我們可以明確地指定調(diào)用的是父類的成員。
在Main類中創(chuàng)建Child對象時(shí),調(diào)用child.print()方法,可以看到輸出結(jié)果:
Parent name: Parent
Child name: Child
This is the Parent class.
This is the Child class.
通過使用super關(guān)鍵字,我們可以區(qū)分子類和父類的成員變量和方法,避免命名沖突,并且可以靈活地調(diào)用父類的成員。這樣可以提高代碼的可讀性和可維護(hù)性。
5. super()方法的注意事項(xiàng)
5.1. super()方法必須在子類的構(gòu)造方法的第一行調(diào)用:在子類的構(gòu)造方法中,如果需要調(diào)用父類的構(gòu)造方法,必須使用super()方法,并且該語句必須放在子類構(gòu)造方法的第一行。這是因?yàn)樽宇悓ο笤趧?chuàng)建時(shí),需要先完成父類對象的初始化,然后再進(jìn)行子類對象的初始化。因此,為了保證先調(diào)用父類的構(gòu)造方法,super()方法必須在子類構(gòu)造方法的第一行調(diào)用。
5.2. super()方法只能調(diào)用一次:在子類的構(gòu)造方法中,只能使用一次super()方法來調(diào)用父類的構(gòu)造方法。這是因?yàn)楦割惖臉?gòu)造方法只會被調(diào)用一次,而且子類的構(gòu)造方法中必須要有對父類構(gòu)造方法的調(diào)用,以確保父類對象的正確初始化。如果在子類的構(gòu)造方法中多次調(diào)用super()方法,會導(dǎo)致父類的構(gòu)造方法被多次調(diào)用,從而引發(fā)錯(cuò)誤。
5.3. 編譯器會自動插入super()調(diào)用:如果子類的構(gòu)造方法沒有顯式地調(diào)用super()方法,編譯器會在子類構(gòu)造方法的第一行自動插入super()語句,以調(diào)用父類的無參構(gòu)造方法。這是因?yàn)椋绻宇悰]有顯式地調(diào)用super()方法,那么編譯器會默認(rèn)認(rèn)為子類構(gòu)造方法需要調(diào)用父類的無參構(gòu)造方法。如果父類沒有無參構(gòu)造方法,或者需要調(diào)用父類的帶參構(gòu)造方法,那么子類的構(gòu)造方法必須顯式地調(diào)用super()方法,并傳入相應(yīng)的參數(shù)。
6. 結(jié)論
簡要總結(jié)super()方法的作用和用法。強(qiáng)調(diào)super()方法在面向?qū)ο缶幊讨械闹匾?。通過本文的介紹,我們了解了super()方法在Java中的作用和用法。它可以調(diào)用父類的構(gòu)造方法、成員變量和方法,實(shí)現(xiàn)構(gòu)造方法的重載,解決成員變量和方法的命名沖突。在面向?qū)ο缶幊讨?,使用super()方法非常重要,它能夠幫助我們構(gòu)建出更加靈活和健壯的程序。
