繼承是 OOP(物件導向程式設計)的核心概念。 它代表的是一種 IS-A 關係。 它在程式設計裡的意思,就跟在英文裡一樣,都是從父類別繼承特性(在程式設計裡,這些特性通常就是函式與變數)。
請看下面這個Animal類別:
//Creating an Animal class with bark() as a member function.
public class Animal {
public void bark() {
System.out.println("This is an animal");
}
}
Animal是一個父類別,因為這個類別所擁有的屬性可以延伸給一般的所有動物。
再看一個叫做Lion的動物,它的類別長這樣:
//Lion class is a child class of Animal.
public class Lion extends Animal {
@Override
public void bark() {
System.out.println("Lion here!!");
}
}
Override註解用來指出子類別中的某個方法正在覆寫父類別的方法。
它不是絕對必要,但使用它是最佳做法。
現在,當我們這樣寫:
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
注意:這裡是用Lion來初始化Animal類別。
輸出結果會像這樣:
Lion here!!
根據 OOP,繼承有很多種類型,但 Java 只支援其中幾種(多層繼承與階層繼承)。 想進一步了解的話,請閱讀這篇。
在這個練習中,你會玩一款角色扮演遊戲,不同類型的鬥士可以在裡面互相對戰。 遊戲為每種類型的鬥士訂定了不同的規則。 我們會把焦點放在兩種特定的類型上:巫師與戰士。
對戰士來說,規則如下:
6點傷害。10點傷害。對巫師來說,規則如下:
12點傷害。3點傷害。建立一個叫做Warrior的新類別。
這個類別應該繼承現有的Fighter類別。
更新Warrior類別,讓它的toString()方法描述他們是哪種類型的鬥士。
這個方法應該回傳字串"Fighter is a Warrior"。
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
更新Warrior類別,讓它的isVulnerable()方法永遠回傳false。
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
更新Warrior類別,讓它的getDamagePoints(Fighter)方法依照上面的規則計算戰士造成的傷害。
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
再建立一個叫做Wizard的新類別。
這個類別同樣應該繼承現有的Fighter類別。
更新Wizard類別,讓它的toString()方法描述他們是哪種類型的鬥士。
這個方法應該回傳字串"Fighter is a Wizard"。
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
更新Wizard類別,新增一個叫做prepareSpell()的方法。
這個類別應該記住這個方法何時被呼叫,並確保只有在已準備法術時,它的isVulnerable()方法才回傳false。
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
更新Wizard類別,讓它的getDamagePoints(Fighter)方法依照上面的規則計算巫師造成的傷害。
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12