繼承

Chengkai730發表於2024-09-08

概述

封裝: 物件代表什麼, 就得封裝對應的資料, 並提供資料對應的行為. 利用封裝, 就可以把一些零散的資料和一些行為封裝為一個整體, 這個整體就是物件.

假設現在要在方法當中列印學生的資訊, 如果沒有封裝, 那麼就要把這些零散的資料全部單獨地傳遞給方法, 那麼方法就要寫很多很多的引數. 但是有了封裝之後, 就可以將這些引數作為一個整體, 即物件傳遞給方法.

但是當這樣的 Javabean 類越來越多之後, 問題就會出現了. 假設現在又有了第二個 Javabean 類去描述老師, 老師和學生這兩個 Javabean 類有大量重複的程式碼. 於是可以將兩個 Javabean 類中相同的程式碼全部抽取出來放到另一個位置, 這兩個 Javabean 類共同取用這個位置的程式碼.

Java 中提供了一個關鍵字 extends,利用這個關鍵字,就可以讓一個類和另一個類建立起繼承關係。例如:

public class Student extends Person{}

Student 稱為子類或派生類,Person 稱為父類或基類、超類。

子類自動獲得父類功能。

子類可以覆蓋父類中的方法。覆蓋的意思是子類重新定義繼承下來的方法,以改變或延伸此方法的行為。

使用繼承的好處:

  1. 可以把多個子類中重複的程式碼抽取到父類中,提高了程式碼的複用性。

  2. 子類可以在父類的基礎上,增加其他的功能,使子類更強大。

關於繼承最主要的需要學會的內容:

  1. 自己設計一個繼承結構並將程式碼寫出來。

  2. 學會使用別人已經寫好的繼承結構。

  3. 子類可以從父類中繼承哪些內容?

  4. 繼承中,成員變數的訪問特點。

  5. 繼承中,成員方法的訪問特點。

  6. 繼承中,構造方法的訪問特點。

  7. This 和 super 的使用方法。

什麼時候使用繼承: 當類與類之間,存在相同(共性)的內容,並滿足子類是父類中的一種,就可以考慮使用繼承,來最佳化程式碼。

繼承的特點:Java 中只支援單繼承,不支援多繼承,單支援多層繼承。

單繼承:一個子類只能繼承一個父類。

不支援多繼承:子類不能同時繼承多個父類。

多層繼承:子類 A 繼承父類 B,父類 B 可以繼承自父類 C。C 是 A 的間接父類,B 是 A 的直接父類。

Java 中有一個最大的祖類,叫做 Object。這個類是 Java 提前寫好的,每一個類都直接或間接繼承自 Object。如果寫了一個類,沒有指定其繼承自哪個類,就預設其直接繼承自 Object 類。這是在虛擬機器執行的時候自動幫我們加上去的, 如果當前類有父類, 那虛擬機器不做其他操作, 如果當前類沒有指定父類, 則虛擬機器會自動增加一個 Object 類作為當前類的父類。

指定了父類的類間接繼承自 Object 類。

當 Java 的類寫得越來越多時,就形成了一個繼承體系。在繼承體系最上面的類就預設是繼承自 Object 類,下面的所有的類都是間接地繼承自 Object。在繼承體系中,任何一個子類,既可以使用直接父類裡面的內容,也可以使用間接父類裡面的內容,但是不能使用類似於叔叔類的內容。

子類只能訪問父類中非私有的成員, 即不是用 private 修飾的內容.

練習:

繼承的練習(自己設計一個繼承體系)

現在有四種動物:布偶貓、中國狸花貓、哈士奇、泰迪。

暫時不考慮屬性,只要考慮行為。

請按照繼承的思想特點進行繼承體系的設計。

四種動物分別有以下的行為:

布偶貓:吃飯、喝水、抓老鼠

中國狸花貓:吃飯、喝水、抓老鼠

哈士奇:吃飯、喝水、看家、拆家

泰迪:吃飯、喝水、看家、蹭一蹭
思路:

採用畫圖法,從下往上畫圖,下面是子類,上面是父類,將子類中的共性內容抽取到父類中。

書寫程式碼要從上往下寫。

Javabean 類:

public class Animal {
    public void eat() {
        System.out.println("吃飯");
    }

    public void drink() {
        System.out.println("看家");
    }
}

Javabean 類:

public class Cat extends Animal {
    public void catchRat() {
        System.out.println("貓抓老鼠");
    }
}

Javabean 類:

public class Dog extends Animal {
    public void watchDoor() {
        System.out.println("狗在看家");
    }
}

Javabean 類:

public class RollCat extends Cat {

}

Javabean 類:

public class LiHua extends Cat {

}

Javabean 類:

public class Husky extends Dog {
    public void destroyHome() {
        System.out.println("哈士奇在拆家");
    }
}

Javabean 類:

public class Teddy extends Dog {
    public void touch() {
        System.out.println("泰迪在蹭一蹭");
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        Husky h = new Husky();
        h.destroyHome();
        h.watchDoor();

        Teddy t=new Teddy();
        t.touch();

        LiHua lihua=new LiHua();
        lihua.catchRat();
    }
}

執行結果:

哈士奇在拆家
狗在看家
泰迪在蹭一蹭
貓抓老鼠

相關文章