多态:
对象的多种表达形式(废话).
同一个接口应用不同的实例
为什么要重写:
因为父类的办法不满足应用要求时.
办法的参数应用父类类型时, 能够接管其下所有子类的对象作为参数, 同时在执行时仍依照子类重写的办法, 从而升高代码反复度.
体现
重载和重写
重载: 一个类中办法的多态性体现(多态的动态体现)
重写: 子父类中办法的多态性体现(多态的动静体现)
多态的三个条件
继承
重写
向上转型
被重写的办法不再是子类的办法, 不能用子类的对象应用.
多态的应用
向上转型: 父类援用指向子类对象(主动转换)
父类 父类援用 = 子类实例;
Parent p = null;
Child c = new Child();
p = c;
向下转型: 将父类对象转换为子类实例
子类 子类援用 = (子类)父类实例;
强转前须要额定检测, 否则可能出错
类型转换异样 ClassCastException
须要用 instanceof 进行检测
向上转型的重点
编译时依照父类的办法编译, 即只能调用父类名下的办法
执行时, 如果名下的办法被重写了, 那将调用子类重写的办法.
(须要留神的是, 向上转型后,不能调用子类有然而父类没有的办法 , 并且 能够调用父类有然而子类没有的办法). 例:
首先 A 的对象只有两个办法,B 的对象有三个办法
AA-AA-AD-BA-BA-AD-BB-BB-AD
总结:
首先, 前提:
对象只能应用申明类型 (即创建对象时 = 右边的类型) 的所蕴含属性和办法
特例:
子类能够应用父类的不重名属性和办法 .(因为 继承)
产生重写时,向上转型的父类执行同名办法时依照子类的办法来执行 , 其余办法 (不同名办法) 仍依照父类本人的办法执行 .(即 多态)
父类对象
只能应用本人的属性和办法,
无奈应用子类的属性和办法.
子类对象.
属性:
能够应用本人的属性和 父类的不重名 (与子类属性不重名) 的属性 (因为 继承).
然而在 子类的外部, 能够应用 ”super.”来调用父类的与子类重名的属性. 因为子类内蕴含一个援用 super 指向其父类对象,实质上仍是应用父类对象来调用父类属性.
因为该过程只能在子类外部产生, 不能通过子类对象间接实现, 所以与多态无关.
办法:
能够应用本人的办法和 父类的未被重写的办法 (因为 继承).
在 子类外部能够应用指向父类对象的援用 super来调用父类被重写的办法, 实质上仍是父类对象应用本人的办法. 所以也与多态无关.
子类对象向上转型
属性:
向上转型后, 即为父类类型, 所以只能应用父类的属性. 且 不能应用子类的属性.
办法:
向上转型后, 即为父类类型, 所以 只能应用父类名下的办法 , 然而因为存在办法重写, 产生重写的办法在执行时依照子类的办法来执行.
对于静态方法, 因为 静态方法无奈重写, 也就不产生多态. 即便应用对象进行调用, 也是在各自类的办法区的动态域中找到并执行, 因而互不影响. 动态属性相似.