Thinking In Java 8 多态

8.1 向上转型

将某一个对象的引用视为对其基类型的引用的做法被称为向上转型

向上转型之后,被转型视作为基类的引用,编译器如何知道这个引用是指向某个子类对象,或者说: 引用如何正确调用override方法 编译器是无法得知引用的具体指向的子类。

8.2 深入调用问题

  • 8.2.1. 方法调用绑定

    • 由编译器和连接程序实现 –前期绑定

    • 运行时根据对象类型进行绑定 -后期绑定
      后期绑定机制随着编程语言的不同而有所不同,不管怎么样都不需在对象中安置某种类型信息
      Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。
      将某一个方法设置为final ,可以防止其他人覆盖该方法,也可以有效地关闭动态绑定。

  • 8.2.2. 产生正确的行为
    Java中因为动态绑定实现了多态,我们就可以发送消息给一个对象,让对象自己去判定应该做什么事情。
    基类为自从它那继承过来的所有导出类建立了一个公共接口。导出类通过覆盖这些定义,为每个导出类提供单独的行为。
  • 8.2.3 可扩展性
    多态是一项让程序员“将改变的事务和未改变的事务分离开来”的重要技术。
  • 8.2.4 缺陷一 : “覆盖” 私有方法
    如果基类方法是private 将会自动认为是final方法,而且对导出类时屏蔽的。因此基类的private方法在子类不可见,并且无法被重载。
    子类中与基类private方法同名的方法只能是一个全新的方法。
  • 8.2.5 缺陷二 : 域与静态方法
    多态的范围只有普通的方法调用可以是多态的,如果直接方法某一个域,这个访问将在编译器进行解析。
    • 所有的域访问操作都将由编译器解析,因此不是多态的。
    • 静态方法是与类,而非单个对象相关联的。

8.3 构造器和多态

构造器是隐式static,并不具有多态性

  • 8.3.1 构造器的调用顺序
    在如下事情发生之前分配给对象的存储空间初始化为二进制的零
    1. 调用基类构造器。不断递归,先根再子
    2. 按照申明顺序调用成员的初始化方法
    3. 调用类构造器的主体
  • 8.3.2 继承与清理

    对象的销毁顺序应该与其初始化顺序相反
    在导出类中执行了清理工作,应该通知基类也进行清理工作 super

  • 8.3.3 构造器内部的多态方法的行为
    编写构造器的有效准则:用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法 。在构造器中唯一能够安全调用的那些方法是基类中的final方法。

8.4 协变返回类型

在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 “狭窄” 的类型。

Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方法返回类型的子类。协变返回类型允许返回更为具体的类型。

扫描二维码关注公众号,回复: 1856702 查看本文章

猜你喜欢

转载自blog.csdn.net/xiaocajiyyd/article/details/79149044