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

3
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);

    }
}

我知道静态嵌套类可以访问外部类的数据成员,所以为什么我无法通过内部类引用访问外部类变量,但可以在内部类中直接使用它呢?

请花些心思将您的代码格式化成您想要阅读的方式——缩进,不要有大量的垂直空白... - Jon Skeet
可能是因为a是私有的?尝试改成受保护的。 - Luatic
2个回答

3

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

◆ 如果字段是静态的:

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

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

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

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

当您在类的方法中访问字段时,会使用不同的规则集。当编译器看到a时,它将在

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

当它搜索类本身时,如果该字段不存在,则会继续搜索外部类。编译器在这里找到了a,因此表达式可以正确编译。

注意:通过非静态表达式访问静态成员是一个不好的想法。 请参阅此Q&A以获得解释


0
你还没有展示给我们一个内部类,StaticInnerClass不是一个内部类。在Java中不存在所谓的“静态内部类”,因为按照定义,内部类是一个嵌套的非静态类。只有内部类才能直接访问包含类型的成员。因为StaticInnerClass不是内部类,所以它没有这样的访问权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接