对象的多态性:父类的引用指向子类的对象
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.多态是编译时行为还是运行时行为?
答:运行时行为