呼叫父建構函式

假設你有 Parent 類和 Child 類。要構造 Child 例項,總是需要在 Child 建構函式的 gebinning 上執行一些 Parent 建構函式。我們可以通過使用適當的引數顯式呼叫 super(...) 作為我們的第一個 Child 建構函式語句來選擇我們想要的 Parent 建構函式。這樣做可以通過重用 Parent 類的建構函式而不是在 Child 類的建構函式中重寫相同的程式碼來節省我們的時間。

沒有 super(...) 方法:

(隱含地,no-args 版本 super() 被稱為隱形)

class Parent {
    private String name;
    private int age;
    
    public Parent() {} // necessary because we call super() without arguments
    
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
    public Child() {
        // compiler implicitly calls super() here
        name = "John";
        age = 42;
    }
}

super() 方法:

class Parent {
    private String name;
    private int age;
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

class Child extends Parent {
    public Child() {
        super("John", 42);   // explicit super-call
    }
}

注意: 呼叫另一個建構函式(連結)或超級建構函式必須是建構函式中的第一個語句。

如果顯式呼叫 super(...) 建構函式,則必須存在匹配的父建構函式(這很簡單,不是嗎?)。

如果你沒有顯式地呼叫任何 super(...) 建構函式,那麼你的父類必須有一個 no-args 建構函式 - 如果父類沒有提供任何建構函式,那麼這可以是顯式編寫的,也可以由編譯器作為預設值建立。

class Parent{
    public Parent(String tName, int tAge) {}
}

class Child extends Parent{
    public Child(){}
}

Parent 類沒有預設建構函式,因此,編譯器無法在 Child 建構函式中新增 super。此程式碼將無法編譯。你必須更改建構函式以適合雙方,或者編寫你自己的 super 呼叫,如下所示:

class Child extends Parent{
    public Child(){
          super("",0);
    }
}