如何覆盖构造函数

时间:2014-03-07 23:36:02

标签: java inheritance constructor override

这是我的代码:

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()来调用父类,但我试图找出如何编写String我最终通过在构造函数中键入代码来获取文件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,但它没有这样做。

2 个答案:

答案 0 :(得分:0)

  

我被告知为了写入文件,我必须在第二和第三个构造函数中插入一些东西[s]

你被误导了。这两个构造函数都会导致writer写入文件。请参阅Javadoc for PrintWriter。

答案 1 :(得分:0)

你无法真正“覆盖”构造函数,因为这样做会打开允许某些“超类实例”跳过初始化的可能性。

您可以通过编写具有相同参数列表的子类构造函数来“链接”构造函数。如果这样做,编译器将添加(如果您忘记显式添加)一个super(...)调用,该调用将参数与子类构造函数块的第一行相匹配。

至于你关于close()方法的问题......好吧,那不是构造函数,你可以覆盖close方法,甚至可以不关闭文件。不建议这样做,因为它会违反Liskov替换原则,这会产生很多问题,但可以完成。