继承是 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 只支持其中一部分(多级继承和层次继承)。 想了解更多,请阅读这篇文章。
在这个练习中,你正在玩一款角色扮演游戏,不同类型的战士可以互相战斗。游戏为每种类型的战士制定了不同的规则。我们将重点关注两种特定类型:巫师和战士。
对于 Warrior,规则如下:
6点伤害。10点伤害。对于 Wizard,规则如下:
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 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 wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12