向上向下转型

假设有两个类: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的实例化对象。

猜你喜欢

转载自linxiwd.iteye.com/blog/1726020