【问题标题】:How To Override Constructor如何覆盖构造函数
【发布时间】:2014-04-11 08:23:16
【问题描述】:

这是我的代码:

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,但它没有这样做。

【问题讨论】:

  • 对不起,我不知道你在问什么。如果f 是一个文件,而你用new WrappedWriter(f) 构造了一个WrappedWriter,那么你还没有String。所以无论你想做什么,它可能都不涉及向构造函数添加任何东西。
  • 您的问题非常不清楚,但您可能不应该扩展 PrintWriter。您应该改用 PrintWriter。

标签: java inheritance constructor overriding


【解决方案1】:

您不能真正“覆盖”构造函数,因为这样做会导致允许某些“超类实例”跳过初始化。

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

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

【讨论】:

  • Liskov替换原理?
【解决方案2】:

有人告诉我,为了写入文件,我必须在第二个和第三个构造函数中插入一些东西

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多