Jes*_*mes 4 java inheritance casting
考虑这个简单的代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
仔细查看我评论1,2和3的行.在编译期间将允许第1行,因为赋值是从子类引用到超类引用完成的.
第2行中的强制转换是必需的,因为超类引用被分配给子类引用变量.这在运行时工作,因为a引用的对象实际上是B的数组(第1行).
现在,这就是我的困惑所在:第3行将抛出java.lang.ClassCastException.现在,这意味着在运行时,程序意识到实际对象不是B的数组,而是A的数组.
这正是我不明白的地方.B不延伸A吗?所以它满足条件B IS-A A,对吗?因此,第3行不应该在运行时抛出任何异常吗?
a1
是一个A
元素数组.由于B
扩展A
的所有实例B
也的实例A
,但不是所有情况下A
都是实例B
.您可以定义一个类C
,该类也会扩展A
并将该类的实例分配给该a1
数组.这种情况不是实例B
.
因此,您无法将A
元素数组转换为B
元素数组.