我想通过将PrintStream类扩展为新定义的类来覆盖println(int)。
import java.io.PrintStream;
class Newer extends PrintStream
{ public void println(int x) {
System.out.println(x);
}
public static void main(String[] args)
{
Newer n=new Newer();
n.println(2);
}
}
我有编译错误说
extendsprintstream.java:3: cannot find symbol
symbol : constructor PrintStream()
location: class java.io.PrintStream
class Newer extends PrintStream
^
1 error
为什么我无法继承类PrintStream?
答案 0 :(得分:1)
Newer
根本没有构造函数,所以它得到一个默认的no-args构造函数,由编译器创建,调用super()
,即基类的no-args构造函数PrintStream
,它没有no-args构造函数。所以你得到一个编译错误。您需要为Newer()
提供一个构造函数,该构造函数通过PrintStream
调用super(...)
的现有构造函数之一。例如:
public Newer()
{
super(System.out);
}
然后您根本不需要覆盖println()
。
为什么你这样做是另一个谜。您根本不需要Newer
:您只需要System.out
。
答案 1 :(得分:0)
这里的问题不是 extends ,而是因为你没有使用 super fir你的类构造函数。 你不能扩展另一个类并忽略这个类的初始化。
在Java中,当你没有构造函数时实际发生的事情-Java编译器会生成一个调用空的super()调用的默认编译器 - 所以它实际上看起来像:
public Newer{
super();
}
因为在你的情况下 PrintStream 没有空构造函数,只有你在Oracle help center中可以找到的构造函数,你会得到编译错误。