Java编程思想中的干货-多态

由于这本书内容较多,而且有相当一部分是自己已经理解的知识,所以只记录对自己有启发的或者以前未注意到过的知识点。

多态
——到底会调用父类的方法还是子类的方法?

  • 向上转型:把某个对象的引用视为对其基类型的引用。目的在于编码时,只与基类打交道,即只需要关心统一的方法或接口而不用考虑具体的实现,这样一来就能将设计和实现解耦
  • 后期绑定(动态绑定、运行时绑定):在运行时根据对象的类型进行绑定(将一个方法调用同一个方法主体关联起来),是多态的实现基础。java中除了static和final方法,其余方法都是后期绑定的。
  • 缺陷-“覆盖”私有方法:父类Fa中有方法private f();子类Son有方法public f();此时使用向上转型再去执行f() : Fa fa = new Son();fa.f();这时就会调用父类的f方法而不是预期中的子类方法。这是因为父类中的方法是private属性,子类无法覆盖,只是新建了一个全新的方法。所以对象fa会直接调用父类的方法。
  • 缺陷-域与静态方法:子类重新定义了父类中已经存在的某个属性时,两者都会共存。将子类转为父类后,任何域访问操作都由编译器解析而不是后期绑定,所以会直接访问父类的属性,因此不是多态的。显性使用子类时想要调用父类的属性,必须显性的使用super。
  • 构造器的调用顺序:
  1. 调用基类构造器,首先构造最顶上的父类,再是下一层导出类,直到最底层的导出类。
  2. 按声明属性调用成员属性的初始化方法。
  3. 调用导出类构造器的代码主体。
  • 构造器内部的多态行为:如果在父类构造器内部调用了一个方法f(),同时子类覆盖了f方法。那么按照上文在new 子类时会先调用父类的构造器,这就意味在此构造器中会调用动态绑定后的子类f方法,会造成一定问题。
  • 协变返回类型:导出类的被覆盖方法可以返回基类方法的返回类型的某种导出类型,即子类覆盖的方法的返回类型可以是父类对应方法返回类型的子类
  • 向下转型与运行时类型识别:向上转型是安全的,而向下转型不是。原因在于父类的信息总是子类信息的子集,调用父类一定是安全的。为了保证向下转型的正确性,java语言对每一次转型都要进行检查,如果不合法将会抛出ClassCastException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值