该计划是:
class A
{
int i = 10;
}
class B extends A
{
int j = 20;
}
class C extends B
{
int k = 30;
}
class D extends C
{
int m = 40;
}
public class asg2
{
public static void main(String[] args)
{
A[] a = {new A(),new B(), new C(), new D()};
System.out.println(a[3].i); //No error!!!
System.out.println(a[2].j); //throws error
System.out.println(a[1].k); //throws error (Understood why error)
System.out.println(a[0].m); //throws error (Understood why error)
}
}
我理解为什么最后两次抛出错误。 但我不明白为什么第二个print语句会抛出错误。 第一个顺利运行。
asg2.java:29: error: cannot find symbol
System.out.println(a[2].j);
^
symbol: variable j
location: class A
答案 0 :(得分:5)
编译器看不到类型a[2]
的元素C
。它看到类型为A
,因为它是声明的数组的类型。因此,它不能接受访问属于A
的子类的字段。如果将元素强制转换为C
,则编译将接受它:
System.out.println(((C) a[2]).j); // compiles OK
答案 1 :(得分:2)
数组SELECT
中的每个条目都是a
类型。它实际上可能包含A
或B
或C
的实例,但该变量的类型为D
,因为这是您的数组的声明方式。因此,您无法访问A
没有的字段(除非您转换为其他类型,明确告诉编译器您认为该对象是什么类型)。