我不确定这里发生了什么。导致错误的行位于具有名为“string”的字段的 Printer 类型对象的实现内。整个内容都包含在名为“Printer”的抽象类中。如何在保持“字符串”字段私有的同时实现我想要的?public abstract class Printer { static Printer blahPrinter(){ Printer blahPrinter = new Printer("blah") { @Override void printString() { System.out.println(this.string); //Here is the error: "string has private access in Printer" } }; System.out.println(blahPrinter.string); //No error on this line return blahPrinter; } private final String string; //Compiles and works as expected if I use a more visible access modifier public Printer(String string) { this.string = "I say " + string; } abstract void printString(); public static void main(String[] args) { final Printer blahPrinter = Printer.blahPrinter(); blahPrinter.printString(); }}
2 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
您可以通过以下方式修复它:
System.out.println(super.string);
问题是私有成员不会被子类继承,尽管它们可以在声明私有成员的顶级类的整个主体内访问。因此,来自编译器的错误消息令人困惑(并且可能会说“错误”)。
有关可访问性,请参阅JLS 6.6.1:
否则,如果成员或构造函数被声明为私有,则当且仅当它发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。
此处就是这种情况,因为您是从Printer
包含声明的的主体内访问私有成员。
但是JLS第8.2节“类成员”有关于继承的规则:
声明为私有的类的成员不会被该类的子类继承。
所以你不能说this.string
,因为该字段string
不存在于Printer
你的printString
方法所在的匿名子类中。
通过显式引用super
(或使用 Hero 答案中的类型转换),您明确表示您不想访问子类中的字段,而是从超类中访问该字段。
添加回答
举报
0/150
提交
取消