《Java核心技術》第五章 繼承 學習筆記

飢渴的小蘋果發表於2021-01-05

第5章 繼承

本章將學習物件導向程式設計的另外一個基本概念:繼承(inheritance)。

利用繼承,人們可以基於已存在的類構造一個新類。繼承已存在的類就是複用(繼承)這些類的方法和域。在此基礎上,還可以新增一些新的方法和域,以滿足新的需求。這是Java程式設計中的一項核心技術。

另外,本章還闡述了反射(reflection)的概念。反射是指在程式執行期間發現更多的類及其屬性的能力。這是一個功能強大的特性,使用起來也比較複雜。

5.1 類、超類和子類

5.1.1 定義子類

下面是由繼承Employee類來定義Manager類的格式,關鍵字extends表示繼承。

public class Manager extends Employee {
    // 新增方法和域
}

關鍵字extends表明正在構造的新類派生於一個已存在的類。已存在的類稱為超類(superclass)、基類(base class)或父類(parent class);新類稱為子類(subclass)、派生類(derived class)或孩子類(child class)。

儘管Employee類是一個超類,但並不是因為它優於子類或者擁有比子類更多的功能。實際上恰恰相反,子類比超類擁有的功能更加豐富。

public class Manager extends Employee {
    private double bonus;
    
    public void setBonus(double bonus)
    {
        this.bonus = bonus;
    }
}

當然,由於setBonus方法不是在Employee類中定義的,所以屬於Employee類的物件不能使用它。

然而,儘管在Manager類中沒有顯式地定義getName和getHireDay等方法,但屬於Manager類的物件卻可以使用它們,這是因為Manager類自動地繼承了超類Employee中的這些方法。

同樣,從超類中還繼承了name、salary和hireDay這3個域。這樣一來,每個Manager類物件就包含了4個域:name、salary、hireDay和bonus。

在通過擴充套件超類定義子類的時候,僅需要指出子類與超類的不同之處。因此在設計類的時候,應該將通用的方法放在超類中,而將具有特殊用途的方法放在子類中,這種將通用的功能放到超類的做法,在物件導向程式設計中十分普遍。

5.1.2 覆蓋方法

然而,超類中的有些方法對子類Manager並不一定適用。具體來說,Manager類中的getSalary方法應該返回薪水和獎金的總和。為此,需要提供一個新的方法來覆蓋(override)超類中的這個方法:

super是一個指示編譯器呼叫超類方法的特殊關鍵字。

@Override
public double getSalary() {
    return super.getSalary() + bonus;
}

5.1.3 子類構造器

public Manager(String name, double salary, int year, int month, int day)
{
    super(name, salary, year, month, day);
    bonus = 0;
}

相關文章