多态

本文详细阐述了面向对象编程中的多态概念,包括接口与实现分离的优势、动态绑定原理及其实现方式。同时介绍了Java中向上转型与向下转型的特点、注意事项及如何避免构造过程中的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态:

  1. 从另一个角度讲接口和实现分离开来,多态不但能够改善代码的组织和可读性,还能够创建可扩展程序,消除类型之间的耦合关系。(不管导出类的存在,编写的代码只与基类打交道)
  2. 只要都从同一基类导出而来,允许同一类型表现出与其他相似类型之间的区别。
  3. 多态是动态绑定,运行时才能产生正确的方法(也称后期绑定,运行时绑定)

动态意味着“不同的形式”,在面向对象的程序设计中,我们持有从基类继承而来的相同接口,以及使用该接口的不同形式:不同版本绑定的动态方法。

绑定:将一个方法调用和一个方法主题关联起来叫做绑定。
1、前期绑定:编译时绑定
2、后期绑定:运行时确定对象引用,产生正确的行为。

java中除了static方法和final方法之外,其他所有的方法都是后期绑定(动态绑定)。比如,构造器的隐式static的,private方法是final的(不可覆写)等等,这些都是编译时绑定对象引用。final可以有效地关闭动态引用(大多数情况下,用final不会对程序的整体性能有什么改观,而是更多的用于设计来决定是否使用使用final)。

1、向上转型:

把某个导出类的引用视为其基类的引用。向上转型是安全的。

 Animal dog=new Dog();

多态的构造器调用顺序:
按照继承层次依次向上链接,反复递归调用基类构造器,由外深入到继承层次的内部。(首先调用继承树的根构造器,初始化,再依次向下按照继承树构造。)导出类只可以访问public和protected的成员。
构造前根据继承树绑定对象引用,再从基类构造开始递归构造并且初始化,逐层执行,一直到叶子导出类,如果在构造函数内部调用动态绑定的方法,可能就会直接调用了叶子导出类的覆写基类的方法,可此时甚至基类的初始化都没有完成,就会出现错误,也许还不会报错。
避免构造时出现问题的方法:
尽可能用简单的方法使对象进入正常状态,构造器内部避免调用其他方法(构造器唯一能安全调用的是基类的final和private方法,因为它们不能被导出类覆写,当调用的时候不会动态调用到导出类覆写的方法。)
基类可以接收发送给导出类的任何消息,因为两者有着完全相同的接口。

向上转型可以越很多层基类,也可以调用多层基类的方法,但是导出类只能使用直接父类的成员变量。

super.eat();
super.age=10;

多态的重新绑定

  Animal dog=new Dog();
  dog=new Cat();

创建的对象会被替代、重新绑定,重新绑定到另一个继承自Animal的导出类对象,在运行期间就会得到一种动态灵活性。在编译期间确定继承的基类对象,在运行期间动态的改变引用的具体类型。这种动态重新绑定,不仅仅是灵活,还可以节约内存开销。

2、向下转型:

由于多态创建对象时的向上转型会丢失具体的类型信息,通过基类创建的对象不能调用导出类的扩展方法,所以有时需要向下转型到具体导出类,才可以调用其扩展方法。

Dog dogs=(Dog)dog;

java中所有的转型都会检查。(比如加括弧形式的类型转换)
向下转型会在进入运行期时对其进行检查,如果转型发生异常,会返回一个ClassCastException类转型异常,在运行期对类型进行检查的行为称作“运行时类型识别RTTI”

理解:因为动态绑定是绑定一个对象的引用,所以向下转型时,不会发生安全问题,因为这不是强制类型转换会丢失精度,这是一个引用的转换。

继承与清理

  1. 当遇到需要手动清理对象时,为类创建dispose()方法清理方法时,在其导出类中覆盖dispose()方法,当调用的时候,务必在导出类的dispose()方法中调用super.dispose(),否则基类的清理动作不会发生。
  2. 对于基类,应该首先对其导出类进行清理,,然后才能清理基类。(遵循C++中析构函数的形式),因为导出类的清理可能会调用基类中的某些方法,多以需要使用基类中的构件仍起作用,而不应该过早的销毁基类。

一句话总结:销毁顺序和继承树顺序相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值