[英]Why call super() in a constructor?
我正在處理一個擴展 JFrame 的JFrame
。
這不是我的代碼,它在開始構建 GUI 之前調用了super
。 我想知道為什么要這樣做,因為我一直只是訪問超類的方法而不必調用super();
有一個對super()
的隱式調用,所有具有父類的類都沒有參數 - 這是 Java 中每個用戶定義的類 - 因此通常不需要顯式調用它。 但是,如果父構造函數接受參數,並且您希望指定它們,則可以使用帶參數調用super()
。 此外,如果父的構造函數接受參數,並且它沒有默認的無參數構造函數,您將需要使用參數調用super()
) 。
一個示例,其中對super()
的顯式調用為您提供了對框架標題的一些額外控制:
class MyFrame extends JFrame
{
public MyFrame() {
super("My Window Title");
...
}
}
當您不自己調用時,會自動調用父類的空構造函數super()
。 這就是您不必在代碼中執行此操作的原因。 它是為你完成的。
當您的超類沒有無參數構造函數時,編譯器將要求您使用適當的參數調用super
。 編譯器將確保您正確實例化該類。 所以這不是你需要擔心的太多。
無論您是否在構造函數中調用super()
,它都不會影響您調用父類方法的能力。
作為旁注,有些人說為了清楚起見,通常最好手動進行調用。
我們可以使用 super 關鍵字訪問超類元素
考慮我們有兩個類,Parent 類和 Child 類,它們具有不同的 foo 方法實現。 現在在子類中如果我們想調用父類的foo方法,可以通過super.foo(); 我們還可以通過 super 關鍵字訪問父元素。
class parent {
String str="I am parent";
//method of parent Class
public void foo() {
System.out.println("Hello World " + str);
}
}
class child extends parent {
String str="I am child";
// different foo implementation in child Class
public void foo() {
System.out.println("Hello World "+str);
}
// calling the foo method of parent class
public void parentClassFoo(){
super.foo();
}
// changing the value of str in parent class and calling the foo method of parent class
public void parentClassFooStr(){
super.str="parent string changed";
super.foo();
}
}
public class Main{
public static void main(String args[]) {
child obj = new child();
obj.foo();
obj.parentClassFoo();
obj.parentClassFooStr();
}
}
它只是調用超類的默認構造函數。
我們使用 super 關鍵字來調用超類的成員。
由於子類從其父類繼承了所有成員(字段、方法、嵌套類),並且由於構造函數不是成員(它們不屬於對象。它們負責創建對象),因此它們不會被子類繼承。
因此,如果我們需要為超類創建對象,我們必須顯式調用父構造函數,以便構造函數鏈保持連接。 在創建對象時,只能調用一個構造函數。 通過 super,我們可以在需要時從當前構造函數中調用另一個構造函數。
如果您在想為什么它存在於不擴展任何其他類的類中,那么請記住默認情況下每個類都遵循對象類。 所以在你的構造函數中保留 super 是一個很好的做法。
注意:即使您的第一條語句中沒有 super(),編譯器也會為您添加它!
我們可以使用 super 關鍵字訪問 SuperClass 成員
如果您的方法覆蓋了其超類的方法之一,您可以通過使用關鍵字super
調用被覆蓋的方法。 您還可以使用 super 來引用隱藏字段(盡管不鼓勵隱藏字段)。 考慮這個類,超類:
public class Superclass {
public void printMethod() {
System.out.println("Printed in Superclass.");
}
}
// 這是一個子類,稱為 Subclass,它覆蓋了printMethod()
:
public class Subclass extends Superclass {
// overrides printMethod in Superclass
public void printMethod() {
super.printMethod();
System.out.println("Printed in Subclass");
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
在子類中,簡單名稱printMethod()
指的是在子類中聲明的方法,它覆蓋了超類中的方法。 因此,要引用從 Superclass 繼承的printMethod()
,Subclass 必須使用限定名稱,如圖所示使用 super。 編譯和執行子類打印以下內容:
Printed in Superclass.
Printed in Subclass
以上答案都沒有回答“為什么”。 在這里找到了一個很好的解釋:
子類可以有自己的私有數據成員,所以子類也可以有自己的構造函數。
子類的構造函數只能初始化子類的實例變量。 因此,當子類對象被實例化時,子類對象也必須自動執行超類的構造函數之一。
干杯
由於構造函數不是 class 的一部分,所以在調用它時無法實現,通過使用 SUPER() 我們可以調用構造函數中的成員和成員函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.