无法从同一.java文件中包含的静态扩展类访问字段

无法从同一.java文件中包含的静态扩展类访问字段,java,intellij-idea,Java,Intellij Idea,我不知道这是我从未发现的隐藏功能还是IntelliJ Idea的bug 上这个课, public class StackOverflow { private String abc; public static class StackOverflowExtended extends StackOverflow { public StackOverflowExtended() { abc = ""; } } } In

我不知道这是我从未发现的隐藏功能还是IntelliJ Idea的bug

上这个课,

public class StackOverflow {
    private String abc;

    public static class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            abc = "";
        }
    }
}
IntelliJ告诉我,我无法访问abc,因为它具有私有访问权限,或者因为我处于静态上下文中

只要我通过
super
访问
abc
,它就开始工作

public class StackOverflow {
    private String abc;

    public static class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            super.abc = "";
        }
    }
}

任何私有成员(字段、构造函数或方法)的作用域和可访问性都是其声明类的完整主体,包括任何嵌套类

如果内部类是非静态的,那么它将绑定到外部类的实例,因此您可以访问private instance变量

在本例中,内部类是静态的,因此需要指定外部类的对象实例,例如
super
(因为在本例中,内部类扩展了外部类)


唯一“奇怪”的是,当您尝试使用
this.abc
访问它时,它失败了,因为显然,子类不能访问其父类的私有成员的规则是优先的。

没有错误或隐藏的功能。您可能混淆了继承和内部类

非静态的内部类可以访问外部类的变量,即使它们是私有的

public class StackOverflow {
    private String abc;
    public class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            abc = "";
        }
    }
}
静态内部类无法访问其外部类的字段,因为它是静态的。它可以在没有外部类实例的情况下存在


super.abc
在静态内部类上工作的原因是它是它的子类。独立于其作用域的可访问性,也是因为它是一个内部类。

第二个类也不应该起作用,子类可以访问其父类的
private
字段。@daniu似乎起作用(至少Eclipse没有抱怨),可能是因为
StackOverflowExtended
是在
StackOverflow
中定义的?如果我将
StackOverflowExtended
放在外部,它确实会说字段不可见。@daniu子类不能*访问它们的私有字段parents@balsick当然是打字错误。不能再编辑了:/事实上,我在超级和私人abc上试过了,它对我有效:另外,问题是它对我无效。IntelliJ Idea说没问题,javac说没问题。我还尝试了其他工具,比如ideone和playerly.java,它可以在他们的机器上运行。在我的javac1.8.0¿上没有,我也不知道为什么