呼叫父建構函式
假設你有 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);
}
}