interface Foo{}
class A implements Foo{}
class B extends A{}
class C extends B{}pulbic static void main(String[] args){
B x = new B();
//insert code here
} 下面哪个选项会引起java.lang.ClassCastException 是?1) A a = x;
2) Foo f= (C)x;
3) Foo f= (A)x;
4) B b =(B)(A)x;答案为2),请问各位高人是不是因为类C 没有继承Foo{}接口而引起的错误呀?? 子类转化为父类有没有什么条件呀?本人菜鸟,请多指教!
class A implements Foo{}
class B extends A{}
class C extends B{}pulbic static void main(String[] args){
B x = new B();
//insert code here
} 下面哪个选项会引起java.lang.ClassCastException 是?1) A a = x;
2) Foo f= (C)x;
3) Foo f= (A)x;
4) B b =(B)(A)x;答案为2),请问各位高人是不是因为类C 没有继承Foo{}接口而引起的错误呀?? 子类转化为父类有没有什么条件呀?本人菜鸟,请多指教!
A x = new B(); Foo x = new B();Object o = new B();是正确的。
但是B x = new A(); 就不正确了。
2) (B)(A)x的意思是先将x强转成基类,然后有转回(A)x父类吗?
B b =(B)(A)x;这个为什么是正确的呢。首先看(A)x,因为x是一个B,而B是A的子类,B在内存中的空间大于A,因此(A)x是可行的,此时的(A)x实际是一个B对象,但是他表现的类型是一个A。这就是多态了。(B)(A)x,这个表面上看是把父类对象强转成子类对象,可是内存中不是这样的。因为(A)x,虽然是一个A,但是他在内存中的存储是B,并不是说你吧x搞成了A,原本属于B的那部分空间会被释放(如果是这样,那多态就无从谈起了),所以,(B)(A)x是正确的。不要只看表面,而要看内存分布。