继承Inheritance
项目
背景
需求
一个实时战略游戏。可以选择不同的作战单位,进行不同的动作,比如,移动到某个地点,或者攻击某个作战单位

独角兽
Unicorn
行走,不会可以走进湖泊,但可以爬山
可以治疗友方单位
直升飞机
Helicopter
可以跨过山丘和湖泊飞行
环形远程攻击 距离 2 - 4 之间

骑士
Knight
行走,不会可以走进湖泊,但可以爬山
近距离攻击 距离 1

法师
Mage
行走,不会可以走进湖泊,也不会爬山
远程攻击 距离 6 以内

项目进度推进
初始代码
Point.java
Rectangle.java
基本信息显示
名称
位置
description
攻击怪物支持
不同类型 支持 attack
方法
位置移动支持
不同类型 支持 move
方法
继承 与 代码重用Inheritance and Code Reuse
项目进度推进
主要问题
大量代码重复
使用继承 达到 代码重用
使用前

使用后

名词
子类 继承 父类
子类 / 派生类
Subclass / Child Class / Derived Class
父类 / 基类 / 超类
Superclass / Parent Class / Base Class
语法
public class 类名 extends 父类类名 { }
方法及属性调用

使用继承后 调用的方法时
如果方法是子类的 就调用子类的方法代码
如果方法是父类的 就调用父类的方法代码
但都运行在子类对象上
多个子类

多个子类可以继承同一个父类
一个父类可以有多个子类
继承链

子类可以继续有它自己的子类
从而形成继承链
项目进度推进
抽出 Unit 类型
上提 name
和 location
访问控制修饰符Access Control Modifiers
访问性 与 存在性
核心
不可访问 不代表 不存在
private 与 外部
外部不可以访问 某个类 私有的资源,但是不代表 这个类没有这个资源

1 2 3 4 5 6 7 8 9 public class Animal { private int age; public void setAge(int age) { this.age = age; } public int getAge() { return this.age; }}
1 2 3 4 5 6!7 8 9 public class Main { ... public void run() { Animal animal = new Animal(); animal.setAge(10); animal.age = 20; Console.println(animal.getAge()); }}
private x 继承
父类私有属性会被子类继承

1 2 3 4 5 6 7 8 9 public class Animal { private int age; public void setAge(int age) { this.age = age; } public int getAge() { return this.age; }}
1 2 public class Person extends Animal {}
1 2 3 4 5 6 7 8 public class Main { ... public void run() { Person person = new Person(); person.setAge(10); Console.println(person.getAge()); }}
private x 子类
子类不可以访问 父类 私有的资源,但是不代表 子类没有父类的资源

1 2 3 4 5 6 7 8 9 public class Animal { private int age; public void setAge(int age) { this.age = age; } public int getAge() { return this.age; }}
1 2 3!4 5 public class Person extends Animal { public boolean checkId() { return age >= 18; }}
定义
修改类内成员对外可见性,达到不同级别的封装
语法
可以对类内属性和方法添加访问控制修饰
public class 类名 { 访问控制修饰符 属性声明; 访问控制修饰符 方法声明 { } }
控制规则
1 2 3 public class A { 访问控制修饰符 int m;}
1 2 3 4 5 6 public class B { public void func() { A a = new A(); a.m; }}
修饰符用于描述,位于文件 B 内的方法内,能否使用 A 文件里声明的 m 资源
B 是 A | B 跟 A 同包 | B 是 A 的子类 | B 是 任何类 | |
private | 可以 | |||
默认 | 可以 | 可以 | ||
protected | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
选择策略
优先考虑低等级的 private
视情况提高访问权限
外部要求的 使用 public
项目进度推进
更改 Unit 属性的访问权限
更改 name 和 location
继承 x 构造方法Inheritance x Constructors
基本原则
父类必须先构造,子类才能构造
1 2 3 4 5 public class Animal { public Animal() { System.out.println("Animal init"); }}
1 2 3 4 5 6 public class Dog extends Animal { public Dog() { super() System.out.println("Dog init"); }}
super 位置规则
super() 如果出现,必须出现在第一行
1 2 3 4!5 6 public class Dog extends Animal { public Dog() { System.out.println("Dog init"); super() }}
super 省略规则
如果构造方法内的第一行不是 this(xxx),
那么系统会自动补上 super()
1 2 3 4 5 public class Dog extends Animal { public Dog() { super(); System.out.println("Dog init"); }}
super 省略规则 与 构造方法省略规则
如果你不写任何构造,相当于写了这个代码
1 2 public class Dog extends Animal { public Dog() { super(); }}
项目进度推进
使用
name 和 location 使用构造方法传递给 Unit
location 外爆