如何覆盖构造函数



这是我的代码:

import java.io.*;
public class WrappedWriter extends PrintWriter {
  public WrappedWriter(OutputStream o){
    super(o);
  }
  public WrappedWriter(File f) throws FileNotFoundException{
    super(f);
  }
  public WrappedWriter(String s) throws FileNotFoundException{
    super(s);
  }
}

如您所见,该课程正在扩展PrintWriter。在WrappedWriter类中,我继续创建一个字符串,可以将其打印到终端或写入文件。有人告诉我,要将其写入文件,我必须在此处插入第二个和第三个构造函数。我已经放置了super()来调用父类,但是我正在尝试找出如何通过在构造函数中键入代码来写入文件f的字符串。谁能向我指向正确的方向?这是当我将某些输入以交互式模式放置时,应该发生的事情。

 WrappedWriter out = new WrappedWriter(System.out)
 out = new WrappedWriter("gettysburg.txt");
 out.println("Four score and seven years ago our fathers brought forth, upon this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.")
 out.close();

out.close键入,应该将字符串写入gettysburg.txt,但是它没有这样做。

我被告知要写入文件,我必须将某些内容插入第二和第三个构造函数[s]

您被误导了。这两个构造函数都将导致作者写入文件。请参阅Javadoc的PrintWriter。

您不能真正"覆盖"构造函数,因为这样做会打开允许某些"超级类实例"跳过初始化的可能性。

您可以通过编写具有相同参数列表的子类构造函数来"链"构造函数。如果执行此操作,则编译器将添加(如果您忘记明确添加)super(...)调用,将参数匹配为子类Constructor块的第一行。

至于您关于close()方法的问题...嗯,这不是构造函数,您也可以覆盖关闭方法,即使是它没有关闭文件。不建议这样做,因为它会违反Liskov替代原则,这会造成很多问题,但可以完成。

最新更新