【发布时间】:2015-04-06 20:22:24
【问题描述】:
我很难理解我认为 Java 中的一个基本问题。 下面给出的答案是第 3 行倾向于类转换异常。我可以看到最初 a1 指向对象 A 的数组。但是在第 1 行上,a 没有设置为指向对象 b 的数组吗?因此,如果 a1 指向 a,它现在不应该也指向 b吗?
来自Enthuware的解释:-
程序运行时会在标记为 3 的行抛出 java.lang.ClassCastException。
编译期间允许使用 //1 行,因为赋值是从子类引用到超类引用完成的。 需要在 //2 行进行转换,因为超类引用被分配给子类引用变量。这在运行时有效,因为 a 引用的对象实际上是 B 的数组。 现在,第 //3 行的强制转换告诉编译器不要担心,我是一个优秀的程序员,我知道自己在做什么,并且超类引用 (a1) 引用的对象在运行时实际上属于 B 类时间。所以没有编译时错误。但在运行时,这会失败,因为实际对象不是 B 的数组,而是 A 的数组。
public static void main(String args[]) {
A[] a, a1;
B[] b;
a = new A[10];
a1 = a;
b = new B[20];
a = b; //line 1
b = (B[]) a; //line 2
b = (B[]) a1; //line 3
}
}
class A {
}
class B extends A {}
【问题讨论】:
标签: java reference pass-by-reference pass-by-value