学 java 肯定听说过上转型,也肯定遇到过下转型的错误。
很多人理不清,其实很简单,从 多态 的本质去看就可以了。
假设有父类A
class A{
private String name;
get/set…
}
子类B继承A
class B extends A{
private Integer id;
get/set…
}
那么上转型就是:
A a = new B();
下转型就是:
B b = (B)a;
Java运行时,实现多态的办法是后期绑定,就是在运行时根据对象的类型进行绑定,从多态的本质来看,B是A的子类,那么B拥有A的全部属性,所以A a = new B();的本质就是new了一个B对象的空间,把地址给了一个A类型的引用( C语言 中叫指针),但其本质还是B所以再次进行 强制类型转换 为B,即B b = (B)a;是可以的,本质就是把B类型的空间给了一个B类型的引用。这就是下转型。
但是,如果是如下情况就不对了:
A a1 = new A();
B b1 = (B) a1;
这个时候就会报错,这种下转型是错误的。
java.lang.ClassCastException: A cannot be cast to B
理解了本质,也就上下转型的不同了。尤其是在使用框架的时候,一定注意转换的类型。建议不要使用下转型,禁止就行了,因为他会带来程序的可读性差,带来混乱。
最后看一下协变返回类型(java 1.5以上支持):
class C {//基类
c(){
return new A();
}
}
class C extends D{//导出类
c(){
return new B();
}
}
表示在到处类的被覆盖方法可以返回基类方法的返回类型的某种导出类型。