假设有两个类:Person类是父类,Man类继承自Person类。
第一个例子:
Person p1 = new Man(); // 这就叫 upcasting (向上转型) Man m1 = (Man)p1; // 这就叫 downcasting (向下转型)
第2个例子:
Person p2 = new Person(); Man m2 = (Man)p2; // 出错,子类引用不能指向父类对象
注意:向上转型,子类对象会遗失跟父类不同的方法。只能保留重写的方法,来动态绑定。
解释&总结:
1.第一个例子中,p1指向一个子类Man对象,Person p1 = new Man(); 子类m1引用当然可以指向子类Man对象。
2.第二个例子中,p2指向一个父类Person对象,Person p2 = new Person();;子类s1引用不能指向父类对象。
3.向上转型,实际上是将父类引用指向子类对象,这是可行的;但是一定注意子类引用不能直接指向父类对象,这会导致编译器无错误,运行时将出错(ClassCastException异常)。这就是麻雀一定是鸟,但鸟不一定是麻雀的道理(麻雀是鸟的子类)。
4.从第一个例子看出,实际使用中,一般地,如果想向下转型,必须先向上转型。如果当前程序段只有Man m1 = (Man)p1,懒得去上面找是否p1是否是向上转型得来的,可以使用instanceof关键字来避免异常。如下:
if(p1 instanceof Man){ Man m1 = (Man)p1 }在第二个例子中, Man m2 = (Man)p2; 就可以采用这种形式。这样,就一定不会报错了。因为这里先使用instanceof
来判断p1是否是Man的实例化对象。