为什么我无法通过内部类引用访问外部类数据成员?

时间:2017-04-29 08:41:05

标签: java inner-classes

class OuterClass1 {

    static private int a = 10;

    void get() {
        System.out.println("Outer Clas Method");
    }

    static class StaticInnerClass {
        void get() {
            System.out.println("Inner Class Method:" + a);
        }
    }

    public static void main(String args[]) {

        OuterClass1.StaticInnerClass b = new OuterClass1.StaticInnerClass();
        b.get();
        System.out.println(b.a);
        System.out.println(b.c);

    }
}

我知道静态嵌套类可以访问外部类数据成员,所以为什么我不能访问外部类变量throgh内部类引用但是可以通过直接在内部类中使用它来访问它?如上所述?

2 个答案:

答案 0 :(得分:3)

Java语言规范提供了以下访问静态字段的规则:

  

◆如果该字段是静态的:

     
      
  • 评估主表达式,并丢弃结果。 [...]
  •   
  • 如果该字段是非空白的final,则结果是类或接口中指定的类变量的值,该类是Primary表达式的类型。
  •   

请注意,规范不允许在其他类中搜索静态字段;只考虑主表达式的直接类型。

在您的情况下,主要表达式只是b。它被评估,其结果被丢弃,没有可观察到的效果。

主要表达式b的类型为OuterClass1.StaticInnerClass。因此,Java将b.a视为OuterClass1.StaticInnerClass.a。由于OuterClass1.StaticInnerClass类不包含静态字段a,因此编译器会产生错误。

当您访问类的方法内的字段时,会生成一组不同的规则。当编译器在

中看到a
System.out.println("Inner Class Method:" + a);

它搜索类本身,并在字段不存在时继续到外部类。这是编译器找到a的地方,因此表达式可以正确编译。

注意:通过非静态表达式访问静态成员是个坏主意。 See this Q&A for an explanation

答案 1 :(得分:0)

你没有向我们展示内部类,StaticInnerClass不是内部类。 Java中没有“静态内部类”这样的东西,因为根据定义,内部类是一个非静态的嵌套类。只有内部类可以直接访问包含类型的成员。因为StaticInnerClass不是内部类,所以它没有这种访问权。