JavaSE 多态

多态:

对象的多种表达形式(废话).

同一个接口使用不同的实例

为什么要重写:

因为父类的方法不满足使用要求时.

方法的参数使用父类类型时,可以接收其下所有子类的对象作为参数,同时在执行时仍按照子类重写的方法,从而降低代码重复度.


体现

重载和重写

重载:一个类中方法的多态性体现(多态的静态体现)

重写:子父类中方法的多态性体现(多态的动态体现)

多态的三个条件

继承

重写

向上转型

被重写的方法不再是子类的方法,不能用子类的对象使用.

多态的使用

向上转型:父类引用指向子类对象(自动转换)

父类 父类引用 = 子类实例;
Parent p = null;
Child c = new Child();
p = c;

向下转型:将父类对象转换为子类实例

子类 子类引用 = (子类)父类实例;

强转前需要额外检测,否则可能出错

类型转换异常ClassCastException

需要用instanceof进行检测

JavaSE 多态_第1张图片

向上转型的重点

编译时按照父类的方法编译,即只能调用父类名下的方法

执行时,如果名下的方法被重写了,那将调用子类重写的方法.

(需要注意的是,向上转型后,不能调用子类有但是父类没有的方法,并且可以调用父类有但是子类没有的方法).例:

JavaSE 多态_第2张图片

首先A的对象只有两个方法,B的对象有三个方法

AA-AA-AD- BA-BA-AD-BB-BB- AD

总结:

首先,前提:

对象只能使用声明类型(即创建对象时=左边的类型)的所包含属性和方法

特例:

子类可以使用父类的不重名属性和方法.(因为继承)

发生重写时,向上转型的父类执行同名方法时按照子类的方法来执行,其余方法(不同名方法)仍按照父类自己的方法执行.(即多态)

父类对象

只能使用自己的属性和方法,

无法使用子类的属性和方法.

子类对象.

属性:

可以使用自己的属性和父类的不重名(与子类属性不重名)的属性(因为继承).

但是在子类的内部,可以使用"super."来调用父类的与子类重名的属性.因为子类内包含一个引用super指向其父类对象,本质上仍是使用父类对象来调用父类属性.
由于该过程只能在子类内部发生,不能通过子类对象直接实现,所以与多态无关.

方法:

可以使用自己的方法和父类的未被重写的方法(因为继承).

子类内部可以使用指向父类对象的引用super来调用父类被重写的方法,本质上仍是父类对象使用自己的方法.所以也与多态无关.

子类对象向上转型

属性:

向上转型后,即为父类类型,所以只能使用父类的属性.且不能使用子类的属性.

方法:

向上转型后,即为父类类型,所以只能使用父类名下的方法,但是由于存在方法重写,发生重写的方法在执行时按照子类的方法来执行.


对于静态方法,由于静态方法无法重写,也就不产生多态.即使使用对象进行调用,也是在各自类的方法区的静态域中找到并执行,因此互不影响.静态属性类似.

你可能感兴趣的:(java)