多态:
对象的多种表达形式(废话).
同一个接口应用不同的实例
为什么要重写:
因为父类的办法不满足应用要求时.
办法的参数应用父类类型时,能够接管其下所有子类的对象作为参数,同时在执行时仍依照子类重写的办法,从而升高代码反复度.
体现
重载和重写
重载:一个类中办法的多态性体现(多态的动态体现)
重写:子父类中办法的多态性体现(多态的动静体现)
多态的三个条件
继承重写
向上转型
被重写的办法不再是子类的办法,不能用子类的对象应用.
多态的应用
向上转型:父类援用指向子类对象(主动转换)
父类 父类援用 = 子类实例;
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来调用父类被重写的办法,实质上仍是父类对象应用本人的办法.所以也与多态无关.
子类对象向上转型
属性:
向上转型后,即为父类类型,所以只能应用父类的属性.且不能应用子类的属性.
办法:
向上转型后,即为父类类型,所以只能应用父类名下的办法,然而因为存在办法重写,产生重写的办法在执行时依照子类的办法来执行.
对于静态方法,因为静态方法无奈重写,也就不产生多态.即便应用对象进行调用,也是在各自类的办法区的动态域中找到并执行,因而互不影响.动态属性相似.