Java继承和Scope变量

时间:2015-06-22 20:56:59

标签: java inheritance scope

该计划是:

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                                              

2 个答案:

答案 0 :(得分:5)

编译器看不到类型a[2]的元素C。它看到类型为A,因为它是声明的数组的类型。因此,它不能接受访问属于A的子类的字段。如果将元素强制转换为C,则编译将接受它:

System.out.println(((C) a[2]).j); // compiles OK

答案 1 :(得分:2)

数组SELECT中的每个条目都是a类型。它实际上可能包含ABC的实例,但该变量的类型为D,因为这是您的数组的声明方式。因此,您无法访问A没有的字段(除非您转换为其他类型,明确告诉编译器您认为该对象是什么类型)。