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