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

我不确定这里发生了什么。导致错误的行位于具有名为“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();

  }


}


吃鸡游戏
浏览 166回答 2
2回答

撒科打诨

您可以通过以下方式修复它:System.out.println(super.string);问题是私有成员不会被子类继承,尽管它们可以在声明私有成员的顶级类的整个主体内访问。因此,来自编译器的错误消息令人困惑(并且可能会说“错误”)。有关可访问性,请参阅JLS 6.6.1:否则,如果成员或构造函数被声明为私有,则当且仅当它发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。此处就是这种情况,因为您是从Printer包含声明的的主体内访问私有成员。但是JLS第8.2节“类成员”有关于继承的规则:声明为私有的类的成员不会被该类的子类继承。所以你不能说this.string,因为该字段string不存在于Printer你的printString方法所在的匿名子类中。通过显式引用super(或使用 Hero 答案中的类型转换),您明确表示您不想访问子类中的字段,而是从超类中访问该字段。

慕村225694

在您的匿名子类中,您可以替换this.string为((Printer) this).string或super.string。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java