关于访问外部 class 的私有成员

Regarding access to private member of outer class

内部成员 class 可以访问其外部 class 的成员(甚至是私有成员)。但是,包含在方法中的局部内部 class 却没有。

为什么?

给我的一个原因是,JVM 没有内部 class 的概念,它为每个内部 class 创建顶层 class 这就是为什么他们不应该可以访问私人成员,但对他们两个来说仍然应该如此。

此外,本地内部 class 实际上可以访问 final 成员。为什么会这样?

这是一个全面的例子,说明什么是可访问的,什么是不可访问的:

public class Outer {

    private static String staticOuterField;
    private String outerField;

    public void method() {
        class MethodInner {
            public void methodInnerMethod() {
                System.out.println(staticOuterField); // OK
                System.out.println(outerField); // OK
            }
        }
    }

    public static void staticMethod() {
        class StaticMethodInner {
            public void staticMethodInnerMethod() {
                System.out.println(staticOuterField); // OK
                System.out.println(outerField); // Not accessible
            }
        }
    }

    static class StaticInner {
        public void staticInnerMethod() {
            System.out.println(staticOuterField); // OK
            System.out.println(outerField); // Not accessible
        }
    }

    class Inner {
        public void innerMethod() {
            System.out.println(staticOuterField); // OK
            System.out.println(outerField); // OK
        }
    }
}

外部静态字段始终可以从内部 classes 访问。仅当内部 class 绑定到外部实例时,外部实例字段才可访问。如果内部 class 是非静态内部 class 或在实例方法中声明的 class 就是这种情况。

内部 classes 背后的整个想法是他们可以完全访问外部 class 成员,也可以访问私有成员。这使得它们与适用一般访问规则的顶级(非内部)classes 不同。 final 修饰符在这里没有任何作用。