考虑这段简单的代码:
class A {}
class B extends A {}
public class TestClass {
public static void main(String args[]) {
A[] a, a1;
B[] b;
a = new A[10];
a1 = a;
b = new B[20];
a = b; // 1
b = (B[]) a; // 2
b = (B[]) a1; // 3
}
}
仔细看一下我评论的1、2和3行。行1在编译期间将被允许,因为是从子类引用赋值给超类引用。
第2行中的转换是必需的,因为将超类引用分配给子类引用变量。并且这在运行时起作用,因为由a引用的对象实际上是B的数组(第1行)。
现在,这就是我的困惑所在:第3行将抛出java.lang.ClassCastException。现在,这意味着在运行时,程序意识到实际对象不是B的数组,而是A的数组。
这正是我不理解的地方。B不是扩展了A吗?这样就满足了B IS-A A的条件,对吧?因此,在运行时,第3行不应该抛出任何异常,是吗?
a1 = a; a = b;//1
-通过更改引用a
,您不会更改a1
。它仍然指向同一个A []
。 - Fildor