多态的作用是消除类型之间的耦合关系。(依赖于父类,减少子类耦合)
多态也称为动态绑定、后期绑定或者运行时绑定。
1、什么是多态
(1)将一个”方法调用“同一个”方法主体“关联起来称为绑定。
(2)在程序执行前进行绑定(比如编译时),叫前期绑定, C语言属于前期绑定。
(3)在运行时根据对象的类型进行绑定,叫做后期绑定或动态绑定,即为多态,java中除了static方法和final方法(private方法属于final)之外,其他方法都是后期绑定。即 static方法和final方法没有多态。
(4)任何域访问操作都将由编译器解析,属于前期绑定。即 直接访问成员变量没有多态。注意:这里是指的是通过“点”访问成员变量没有多态,如果调用被覆写过的方法(发生多态),方法内访问的成员变量,则访问的是当前方法体所属类的成员变量。即也发生了多态。
2、通常对象的清理由GC负责,如果有某些资源,需要手动清理,那么新增dispose方法,清理顺序和 初始化顺序完全相反即可。
如果对象成员对象存在共享(如:被当做构造参数传入,增加了引用数量),则需要记录引用计数,每次使用则引用加1,如果引用变为0才允许清理。
3、构造器类似static方法,不具备多态性。但在构造器内调用方法,存在多态,如果调用的是被覆盖的方法。则动态绑定到子类的方法,此时子类还没有被构造,因此即使代码中成员变量有初始化值,也会应为没有执行到这里,从而成员变量都会初始化为0 或者null。会造成意想不到的错误。
因此,用尽量简单的方法使对象进入正常状态,如果可以的话,避免使用其他方法。在构造器内部唯一安全调用的是final方法。(private也是final)
4、协变返回类型,覆盖方法中返回类型可以返回基类方法的返回类型的导出类型。
5、“用继承表达行为间的差异,用字段表达状态上的变化” 其实就是状态模式含义:把状态封装为类,差异的行为则是状态类的方法。要改变类的行为,只用改变状态即可。
6、继承类与扩展
(1)如果导出类除了继承基类所有方法,还扩展了自己独特的方法。那么他们的关系不再是is-a 而是is-like-a(像一个)。
(2)导出类向上转型为基类,使用基类已有的方法是没有问题,
(3)但是如果使用导出类独特的方法。则需要进行向下转型(使用括号强制转换),转型前都得检查,这称为运行时类型识别(RTTI),如instanceof等。
来源:https://www.cnblogs.com/shineon/p/11453131.html