5.1.1 定义子类

extends

5.1.2 覆盖方法

super

5.1.3 子类构造器

  1. package chapter05;
  2. import chapter04.Employee;
  3. public class Manager extends Employee {
  4. private double bonus;
  5. public Manager(String n, double s, int year, int month, int day) {
  6. // super() 必须是第一句
  7. super(n, s, year, month, day);
  8. bonus = 0;
  9. }
  10. public void SetBonus(double b) {
  11. bonus = b;
  12. }
  13. public double GetSalary() {
  14. return super.GetSalary() + bonus;
  15. }
  16. }

5.1.4 继承层次

image.png

5.1.5 多态

  • is-a
  • 替换原则
  • 程序中出现超类对象的任何地方都可以使用子类对象替换

image.png

image.png

5.1.6 理解方法调用

  • 可协变的返回类型
  • 动态绑定
  • 静态绑定

5.1.7 阻止继承: final 类和方法

final 类不能被继承:

  • 该类的字段不是 final
  • 该类的方法都是 final
  1. package chapter05;
  2. public final class Executive {
  3. ...
  4. }

final 方法不能被覆盖:

  1. package chapter05;
  2. public class Executive {
  3. private String name;
  4. public final String getName() {
  5. return name;
  6. }
  7. }

5.1.8 强制类型转换

将某个类的对象引用转换成另外一个类的对象引用.

  1. Manager boss = (Manager) staff[0];

在转换之前使用 instanceof:

  1. if (staff[1] instanceof Manager) {
  2. boss = (Manager) staff[1];
  3. ...
  4. }

5.1.9 抽象类

包含一个或多个抽象方法的类本身必须被声明为抽象:

  1. package chapter05;
  2. public abstract class Person {
  3. private String name;
  4. public abstract String getDescription();
  5. }
  1. class Student extends Person {
  2. private String major;
  3. public Student(String n, String m) {
  4. super(n);
  5. major = m;
  6. }
  7. public String getDescription() {
  8. return "a student majoring in " + major;
  9. }
  10. }

5.1.10 受保护访问

子类不能访问父类的 private 字段.

  • proteced 字段只能在同一包/子类中访问

访问控制总结:

image.png