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

时间:2018-12-19 16:41:50

标签: java intellij-idea

我无法弄清楚这是我从未发现的隐藏功能还是IntelliJ Idea中的错误。

有这堂课,

var categories = [{
  engine: [1, 2, 3, {
    piston: [4, 5, 6]
  }]
}, {
  tire: [7, 8, 9]
}];

console.log("categories:");
console.log(categories);

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

我通过abc访问abc时,它开始工作。

super

2 个答案:

答案 0 :(得分:2)

没有错误或隐藏功能。您可能正在混合继承和内部类。

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

public class StackOverflow {
    private String abc;
    public class StackOverflowExtended extends StackOverflow {
        public StackOverflowExtended() {
            abc = "";
        }
    }
}

静态内部类无法访问其外部类的字段,因为它是静态的。它可以存在而无需外部类的实例。

super.abc对静态内部类起作用的原因是由于它是其子类。与其范围无关的可访问性再次由于它是一个内部类。

答案 1 :(得分:1)

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

如果内部类是非静态的,则它将绑定到外部类的实例,因此您可以访问私有实例变量。

在您的情况下,内部类是静态的,因此您需要指定外部类的对象实例,例如super(因为在这种情况下,内部类扩展了外部类)。

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