繼承
| 導航 類和物件 主題: |
繼承是 面向物件程式設計 最強大的機制之一。它允許在另一個類(稱為子類、子類或派生類)中重用一個類(稱為超類或母類)的成員,該類繼承自它。這樣,類可以透過繼承依次構建。
在 Java 中,這種機制是由extends關鍵字啟用的。示例
程式碼清單 4.9:Vehicle.java
public class Vehicle {
public int speed;
public int numberOfSeats;
}
|
程式碼清單 4.10:Car.java
public class Car extends Vehicle {
public Car() {
this.speed = 90;
this.numberOfSeats = 5;
}
}
|
在程式碼清單 4.10中,類Car繼承自Vehicle,這意味著屬性speed和numberOfSeats存在於類Car中,而它們是在類Vehicle中定義的。此外,在類Car中定義的建構函式允許初始化這些屬性。在 Java 中,繼承機制允許定義具有所有類的類層次結構。如果沒有顯式繼承,類會隱式地繼承自Object類。這個Object類是類層次結構的根。
某些類不能繼承。這些類是用final關鍵字定義的。例如,Integer類不能有子類。它被稱為最終類。
在例項化時,子類會接收從其超類繼承的特徵,該超類也從其自己的超類繼承了特徵,依此類推,直到Object類。這種機制允許定義可重用的全域性類,其使用者在派生的更具體的類中詳細說明行為。
在 Java 中,一個類只能繼承自一個類。Java 不允許你從兩個類建立子類,因為這將需要建立複雜的規則來消除從多個超類繼承的欄位和方法的歧義。如果 Java 需要從多個來源繼承,最好的選擇是透過介面,在下一章中介紹。
super關鍵字允許訪問類的超類的成員,就像你可以使用this訪問當前類的成員一樣。示例
程式碼清單 4.11:Plane.java
public class Plane extends Vehicle {
public Plane() {
super();
}
}
|
在這個例子中,Plane類的建構函式呼叫了其超類Vehicle的建構函式。你只能使用super訪問子類內部超類的成員。如果你從另一個類使用它,它會訪問另一個類的超類。這個關鍵字還允許你顯式地訪問超類的成員,例如,在你的類中存在同名方法的情況下(覆蓋,...)。示例
程式碼清單 4.12:Vehicle.java
public class Vehicle {
// ...
public void run() throws Exception {
position += speed;
}
}
|
程式碼清單 4.13:Plane.java
public class Plane extends Vehicle {
// ...
public void run() throws Exception {
if (0 < height) {
throw new Exception("A plane can't run in flight.");
} else {
super.run();
}
}
}
|
問題 4.1:考慮以下類。
問題 4.1:Class1.java
public class Class1 {
public static final int CONSTANT_OF_CLASS_1 = 9;
public int myAttributeOfClass1 = 40;
public void myMethodOfClass1(int i) {
}
}
|
問題 4.1:Class2.java
public class Class2 extends Class1 {
public int myAttributeOfClass2 = 10;
public void myMethodOfClass2(int i) {
}
}
|
問題 4.1:Class3.java
public class Class3 {
public static final int CONSTANT_OF_CLASS_3 = 9;
public void myMethodOfClass3(int i) {
}
}
|
問題 4.1:Question1.java
public class Question1 extends Class2 {
public static final int CONSTANT = 2;
public int myAttribute = 20;
public void myMethod(int i) {
}
}
|
列出可以在類Question1中訪問的所有屬性和方法。
CONSTANT_OF_CLASS_1myAttributeOfClass1myMethodOfClass1(int)myAttributeOfClass2myMethodOfClass2(int)CONSTANTmyAttributemyMethod(int)
Question1繼承自Class1和Class2,但不繼承自Class3。
- 另請參閱有關繼承概念的面向物件程式設計書籍。