多态
需提前了解的概念:
- 前期绑定:程序执行前绑定,由编译器和执行程序实现
- 后期绑定:运行时绑定,在运行时根据对象的类型进行绑定
Java中除了static和final(private也属于final),其余都是后期绑定,会自动发生
多态的作用: 编写只与基类打交道的代码,但这些代码对所有导出类可正确运行;所做的代码修改不会对程序中其它不应受到影响的部分产生破坏,如向基类添加方法、加入新类
如:动态绑定实例
基类:
Shape{
draw();
erase(); }
导出类:
Circle{
draw();
erase(); }
Square{
draw();
erase(); }
Shape s=new Circle(); //新建了Circle对象,引用赋给Shape
s.draw(); //draw()在导出类中被覆盖,所以调用的是Circle.draw()
注意事项:
-
私有方法不可覆盖
-
直接访问域,访问会在编译期进行解析,所以不存在多态
-
静态方法与类而不是对象关联,不具有多态性
多态会涉及到的问题:
构造器的调用顺序:
-
调用基类构造器,多层继承从最低层的构造器开始调用
-
按声明顺序导出类中调用成员的初始化方法
-
调用导出类构造器的主体
继承与清理:
通过组合与继承创建新类的子对象一般由垃圾回收器清理
但遇到清理问题时,可能要手动创建清理函数,如为新类创建dispose(),当覆盖被继承类的dispose(),要记得调用基类版本的dispose(),否则基类的清理动作不会发生,即用super关键字,在导出类dispose()内部声明super.dispose()
且清理时,销毁顺序与初始化顺序相反
特: 当某成员对象存在对象共享情况,即多个类调用同一个共享对象,则不可当其中一个类不用时就销毁其调用对象,需要统计共享对象使用情况,设置引用计数跟踪仍访问着共享对象的对象数量,当引用数为0时,再销毁共享对象
构造器内部调用正在构造的对象的某个动态绑定方法:
可能会调用某个方法,但方法操作的成员可能还未初始化,会输出错误
所以编写构造器的准则——
尽可能用简单的方法使对象进入正常状态,避免调用其它方法;
构造器中唯一能安全调用方法为基类中的final/private(也属于final),因为不可被覆盖
协变返回类型:
导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型
即:
基类Girl有一函数,返回类型为
Boy Method(); //Boy类型,Method方法名
导出类Mother想要写一函数覆盖Method方法,可
Father Method(); //Father类是Boy类的导出类,满足协变返回类型可以返回基类方法的返回类型的某种导出类型这一条件
技术学习中,欢迎批评指正
码字不易,转载请注明来处