跳轉到內容

繼承

100% developed
來自華夏公益教科書,開放的書籍,開放的世界

導航 類和物件 主題:v  d  e )

繼承是 面向物件程式設計 最強大的機制之一。它允許在另一個類(稱為子類子類派生類)中重用一個類(稱為超類母類)的成員,該類繼承自它。這樣,類可以透過繼承依次構建。

在 Java 中,這種機制是由extends關鍵字啟用的。示例

Computer code 程式碼清單 4.9:Vehicle.java
public class Vehicle {
    public int speed;
    public int numberOfSeats;
}
Computer code 程式碼清單 4.10:Car.java
public class Car extends Vehicle {
    public Car() {
        this.speed = 90;
        this.numberOfSeats = 5;
    }
}

程式碼清單 4.10中,類Car繼承自Vehicle,這意味著屬性speednumberOfSeats存在於類Car中,而它們是在類Vehicle中定義的。此外,在類Car中定義的建構函式允許初始化這些屬性。在 Java 中,繼承機制允許定義具有所有類的類層次結構。如果沒有顯式繼承,類會隱式地繼承自Object類。這個Object類是類層次結構的根。

某些類不能繼承。這些類是用final關鍵字定義的。例如,Integer類不能有子類。它被稱為最終類。

Object

[編輯 | 編輯原始碼]

在例項化時,子類會接收從其超類繼承的特徵,該超類也從其自己的超類繼承了特徵,依此類推,直到Object類。這種機制允許定義可重用的全域性類,其使用者在派生的更具體的類中詳細說明行為。

在 Java 中,一個類只能繼承自一個類。Java 不允許你從兩個類建立子類,因為這將需要建立複雜的規則來消除從多個超類繼承的欄位和方法的歧義。如果 Java 需要從多個來源繼承,最好的選擇是透過介面,在下一章中介紹。

super關鍵字

[編輯 | 編輯原始碼]

super關鍵字允許訪問類的超類的成員,就像你可以使用this訪問當前類的成員一樣。示例

Computer code 程式碼清單 4.11:Plane.java
public class Plane extends Vehicle {
    public Plane() {
        super();
    }
}

在這個例子中,Plane類的建構函式呼叫了其超類Vehicle的建構函式。你只能使用super訪問子類內部超類的成員。如果你從另一個類使用它,它會訪問另一個類的超類。這個關鍵字還允許你顯式地訪問超類的成員,例如,在你的類中存在同名方法的情況下(覆蓋,...)。示例

Computer code 程式碼清單 4.12:Vehicle.java
public class Vehicle {
    // ...
    public void run() throws Exception {
        position += speed;
    }
}
Computer code 程式碼清單 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:考慮以下類。

Computer code 問題 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) {
    }
}
Computer code 問題 4.1:Class2.java
public class Class2 extends Class1 {
    public int myAttributeOfClass2 = 10;
    public void myMethodOfClass2(int i) {
    }
}
Computer code 問題 4.1:Class3.java
public class Class3 {
    public static final int CONSTANT_OF_CLASS_3 = 9;
    public void myMethodOfClass3(int i) {
    }
}
Computer code 問題 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_1
  • myAttributeOfClass1
  • myMethodOfClass1(int)
  • myAttributeOfClass2
  • myMethodOfClass2(int)
  • CONSTANT
  • myAttribute
  • myMethod(int)

Question1繼承自Class1Class2,但不繼承自Class3

另請參閱有關繼承概念的面向物件程式設計書籍。
華夏公益教科書