继承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 类型

上提 namelocation

访问控制修饰符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 是 AB 跟 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 外爆

ZZAX 微信公众

文档一更新,立刻告诉你