【发布时间】:2017-06-16 16:08:18
【问题描述】:
考虑一下这个简单的代码:
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 行不应该在运行时不抛出任何异常吗?
【问题讨论】:
-
请花时间格式化您提供的代码。目前真的,真的很难阅读,没有缩进,一行中有多个语句。请记住,Stack Overflow 的目的是创建一个高质量问题和答案的存储库 - 花时间让您的问题真正高质量。
-
“所以它满足条件 B IS-A A,对吗?”正确的。但是你需要的是“A IS-A B”——但你没有那个。我想混乱来自这里:
a1 = a; a = b; // 1- 通过更改引用a您不会更改a1。它仍然指向同一个A[]。
标签: java inheritance casting