第八章 多态

文章目录

          • 1.向上转型
          • 2.转机
            • 方法调用绑定
            • (2) 前期绑定
            • (3) 后期绑定(动态绑定/运行时绑定)
            • 产生正确行为
            • 可拓展性
            • 缺陷:“覆盖”私有方法
            • 缺陷:域和静态方法
          • 3.构造器和多态
            • 构造器的调用顺序
            • 继承与清理
            • 构造器内部的多态方法的行为
          • 4.协变返回类型
          • 5.用继承进行设计
            • 用继承表达行为之间的差异,并用字段表状态上的变化
            • 纯继承与拓展
            • 向下转型与运行时类型识别

第八章 多态_第1张图片

1.向上转型
  • 把对某个对象的引用视为对基类型的的引用(例如:Wind继承于Instrument,在需要传递Instrument类型的时候,也可以传递Wind对象代替)
2.转机
  1. 方法调用绑定

    (1) 将一个方法调用同一个方法体关联起来

    (2) 前期绑定

    在程序执行前进行绑定(static、final)

    (3) 后期绑定(动态绑定/运行时绑定)

    在程序运行时根据对象类型进行绑定

  2. 产生正确行为

    (1) 发消息给某个对象,让对象去判断该做什么

    (2) 在编译时,编译器不需要获得任何特殊信息就能进行正确调用

  3. 可拓展性

    (1) 只与及类接口通信,这样的程序是可拓展的,因为可以从通用的基类继承出新的数据类型,从而新添一些新功能

    (2) 多态:将新改变的事物和未被改变的事物分离开

  4. 缺陷:“覆盖”私有方法

    (1) 只有非private的方法才可以被覆盖

    (2) 如果导出类有一个方法与基类private方法同名,则导出类中的方法被视为一个“新的方法”,并不是覆盖基类同名private方法

  5. 缺陷:域和静态方法

    (1) 任何与访问都将由编译器解析,因此不是多态

    (2) 静态方法是与类关联的,并非与单个对象相关联,所以某个方法是静态的,他的行为就不是多态性

3.构造器和多态
  1. 构造器的调用顺序

    (1) 调用基类构造器
    (2) 按声明顺序调用成员初始化方法
    (3) 调用导出类构造器主体

  2. 继承与清理

    (1) 某个子对象要依赖于其他对象,销毁顺序应该和初始化顺序相反
    (2) 首先清理导出类,再清理基类(因为导出类中的某些构建依赖于基类,所以要让基类中的构建在导出类销毁前依然起作用)
    (3) 如果成员对象中存在于其他一个或多个对象啊你个共享的情况就必须使用“引用计数”来跟踪仍旧访问这共享对象数量

  3. 构造器内部的多态方法的行为

    (1) 初始化
    i.在其他任何事物没有发生之前,将分配给对象的存储空间初始化为零
    ii.调用基类构造器
    iii.按照声明的顺序调用成员初始化方法
    iv.调用导出类构造器主体

    (2) 用尽可能简单的方法使对象进入正常状态,尽量避免调用其他方法

    (3) 在构造器中调用的唯一方法就是final方法(final方法不能被复写)

4.协变返回类型
  • 基类被导出类覆盖的方法,返回类型可以是:基类方法的放回类型的导出类型
5.用继承进行设计
  1. 用继承表达行为之间的差异,并用字段表状态上的变化
  2. 纯继承与拓展

    (1) 只有在基类中已经建立的方法才能在导出类中被覆盖
    (2) 也可以认为是一种纯替代
    (3) 基类可以接收任何发送给导出类的消息,因为两者接口相同
    (4) 导出类中,拓展接口不能被基类访问,因此一旦“向上转型”就不能调用新方法

  3. 向下转型与运行时类型识别

    (1) 在继承层次中向下移动【强制类型转换(因为导出类的类型就是基类所以需要强制类型转换)为导出类,从而控制导出类有而基类没有的方法】
    (2) 如果类型错误,会报错ClassCastException

你可能感兴趣的:(Java编程思想,java)