簡體   English   中英

為什么在構造函數中調用 super()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM