关于访问外部私人成员的问题

时间:2015-09-29 07:51:15

标签: java oop inner-classes

成员内部类可以访问其外部类的成员(甚至是私有成员)。但是,方法中包含的本地内部类没有这样的内部类。

为什么?

给我的一个原因是,对于JVM而言,没有内部类的概念,它为每个内部类创建了顶级类,这就是为什么他们不能访问私有类的原因成员,但对于他们两个人来说都应该是真的。

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

1 个答案:

答案 0 :(得分:1)

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

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
        }
    }
}

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

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