当把一个子类对象直接赋给父类引用变量时,编译时类型是父类类型,运行时类型是子类类型。当运行时调用该引用变量的方法时,其方法行为总是子类方法的行为,而不是父类方法行为,所以就出现了相同类型的变量,执行同一个方法时出现不同的行为特征,这就是多态。
引用变量在编译阶段只能调用其编译时类型所具有的方法,但是运行时执行它运行时类型所具有的方法。因此,引用变量只能调用声明该变量时所用类里包涵的方法。
如果需要让一个引用变量调用它运行时类型的方法(即子类的方法),则必须把这个引用变量强制类型转换为运行时类型,但在转换之前,最好先用instanceof 运算符判断是否可以成功转换,从而避免出现ClassCastException:
eg.
if (objPri instanceof String) { String str = (String)objPri; }
instanceof运算符前一个操作符通常是一个引用对象,后一个操作符是一个类或接口,它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。是返回true,不是返回false。
instanceof运算符前面操作符的编译时类型要么与后面的类相同,要么是后面类的父类,否则会引起编译错误。
原文:http://www.cnblogs.com/IvySue/p/6298358.html