使用super關鍵字
訪問超類成員
如果你的方法覆蓋了它的一個超類的方法,你可以通過使用關鍵字super
來呼叫被重寫的方法,你也可以使用super
來引用隱藏欄位(儘管不鼓勵隱藏欄位),慮這個類,Superclass
:
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();
}
}
在Subclass
中,簡單名稱printMethod()
引用在Subclass
中宣告的名稱,它覆蓋了Superclass
中的名稱,因此,要引用從Superclass
繼承的printMethod()
,Subclass
必須使用限定名,使用super
,編譯和執行Subclass
將列印以下內容:
Printed in Superclass.
Printed in Subclass
子類建構函式
以下示例說明如何使用super
關鍵字來呼叫超類的建構函式,回想一下Bicycle
的例子,MountainBike
是Bicycle
的子類,這是MountainBike
(子類)建構函式,它呼叫超類建構函式,然後新增自己的初始化程式碼:
public MountainBike(int startHeight,
int startCadence,
int startSpeed,
int startGear) {
super(startCadence, startSpeed, startGear);
seatHeight = startHeight;
}
呼叫超類建構函式必須是子類建構函式中的第一行。
呼叫超類建構函式的語法是:
super();
或
super(parameter list);
使用super()
,可以呼叫超類無引數建構函式,使用super(parameter list)
,將呼叫具有匹配引數列表的超類建構函式。
注意:如果建構函式沒有顯式呼叫超類建構函式,Java編譯器會自動插入對超類的無引數建構函式的呼叫,如果超類沒有無引數建構函式,則會出現編譯時錯誤,
Object
確實有這樣的建構函式,因此如果Object
是唯一的超類,則沒有問題。
如果子類建構函式顯式或隱式呼叫其超類的建構函式,你可能會認為將呼叫一整個建構函式鏈,一直返回Object
的建構函式,事實上,情況就是這樣,它被稱為建構函式鏈,當需要很長的類層次時,你需要意識到這一點。