为了账号安全,请及时绑定邮箱和手机立即绑定

在静态工厂方法中使用重写方法创建实例时,如何访问封闭类中的私有字段?

在静态工厂方法中使用重写方法创建实例时,如何访问封闭类中的私有字段?

吃鸡游戏 2021-10-06 10:20:03
我不确定这里发生了什么。导致错误的行位于具有名为“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 答案中的类型转换),您明确表示您不想访问子类中的字段,而是从超类中访问该字段。


查看完整回答
反对 回复 2021-10-06
?
慕村225694

TA贡献1880条经验 获得超4个赞

在您的匿名子类中,您可以替换this.string((Printer) this).stringsuper.string


查看完整回答
反对 回复 2021-10-06
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信