继承(Inheritance)

  • 继承表达的是一种“是(is-a)”的关系

语法格式

作用

  • 描述一个体系
  • 其次解决代码重复
  • 只允许单继承,不允许多继承,支持多重继承
  • java.lang.Object 类是 Java 语言的根类,任何类都是 Object 类的子类 / 间接子类

子类可以访问的父类成员

  • 可访问
    • public 或 修饰的成员
    • 同包中缺省访问权限修饰符的成员
  • 不可以直接访问
    • 不同包中缺省访问权限修饰符的成员
    • private 修饰成员

子类初始化过程

  • 调用子类构造器之前一定会调用父类中可以被子类访问的构造器,完成父类字段初始化操作,隐式调用父类无参数构造器 (从该类所在继承树最顶层类的构造器开始执行)
  • 若父类没有可以被子类访问的无参数构造器,那么子类必须显式通过 super 语句调用父类带参数的构造器

super 关键字

  • 代表当前对象的父类对象

作用

  • 在子类中访问父类的被隐藏的实例变量或调用父类的被覆盖的实例方法 super.fly();

方法覆盖 Override

作用

  • 解决子类继承父类之后,可能父类的某一个方法不满足子类的具体特征,此时需要重新在子类中定义该方法,并重写方法体
  • 一同:实例方法签名必须相同
  • 两小:
    • 子类方法的返回值类型和父类方法的返回类型相同或者是其子类
    • 子类方法声明抛出的异常类和父类方法声明抛出的异常类相同或者是其子类(运行时异常除外)
      • 子类方法中声明抛的异常小于或等于父类方法声明抛出异常类
      • 子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(子类也可以不声明抛出)

注意

  • 书写方法覆盖直接拷贝父类的方法定义,修改方法体
  • 只有非 private、final 修饰的实例方法才有覆盖的概念
  • 隐藏:父类方法、父类字段(字段名相同,不管类型)、本类字段(局部变量)

组合(Composite)

  • 旧类对象 作为 新类的成员变量 组合进来,用以实现新类的功能
  • 组合表达的是“有(has-a)”的关系