我无法弄清楚这是我从未发现的隐藏功能还是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
答案 0 :(得分:2)
没有错误或隐藏功能。您可能正在混合继承和内部类。
非静态内部类可以访问其外部类的变量,即使它们是私有的。
public class StackOverflow {
private String abc;
public class StackOverflowExtended extends StackOverflow {
public StackOverflowExtended() {
abc = "";
}
}
}
静态内部类无法访问其外部类的字段,因为它是静态的。它可以存在而无需外部类的实例。
super.abc
对静态内部类起作用的原因是由于它是其子类。与其范围无关的可访问性再次由于它是一个内部类。
答案 1 :(得分:1)
任何私有成员(字段,构造函数或方法)的范围和可访问性是其声明类(包括任何嵌套类)的完整主体。
如果内部类是非静态的,则它将绑定到外部类的实例,因此您可以访问私有实例变量。
在您的情况下,内部类是静态的,因此您需要指定外部类的对象实例,例如super
(因为在这种情况下,内部类扩展了外部类)。
唯一“奇怪”的事情是,当您尝试使用this.abc
访问它时,它失败了,因为显然,子类无法访问其父母的私有成员的规则优先。