对象的多态性:父类的引用指向子类的对象

Person p2 = new Man()


多态性的使用:虚拟方法调用

有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法

总结:编译看左边,执行看右边(多态是一个运行时行为)


多态性使用的前提:

1.类的继承关系(没有继承就没有多态性)

2.要有方法的重写


对象的多态性只适用于方法  不适用于属性(编译和运行都看左边)

例:父类Person里有属性ID=1001  子类Man里也有属性ID=1002

       则Person p = new Man();   p.ID这时=1001,是父类的属性

关于向上转型与向下转型


向上转型:多态


向下转型:

为什么使用向下转型

有了对象的多态性以后,内存中实际上是加载了子类特有的方法和属性的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。使用向下转型可以解决这个问题


如何实现向下转型:

使用强制类型转换符:()


使用时的注意点:

1.使用强转时,可能出现ClassCastException的异常

2.为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型,返回false则不进行向下转型


instanceof的使用:

a instanceof A :判断对象a是否是类A的实例。如果是,返回true

如果a instanceof A 返回true 且类B是类A的父类    则a instanceof B也返回true

要求a所属的类必须与类A是子类和父类的关系  不然编译错误


面试题:

1.多态是编译时行为还是运行时行为?

答:运行时行为