【问题标题】:Regarding access to private member of outer class关于访问外部类的私有成员
【发布时间】:2015-09-29 07:51:15
【问题描述】:

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

为什么?

给我的一个原因是,对于 JVM,没有内部类的概念,它为每个内部类创建顶级类,这就是为什么它们不应该访问私有成员,但对于两者来说仍然应该是正确的时间。

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

【问题讨论】:

  • “方法中包含的本地内部类没有so”不正确。

标签: java oop inner-classes


【解决方案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 修饰符在这里没有任何作用。

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 2020-01-19
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多