为什么我不能将PrintStream类的属性扩展(继承)到新派生的类

时间:2017-12-06 19:27:17

标签: java inheritance

我想通过将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?

2 个答案:

答案 0 :(得分:1)

  1. Newer根本没有构造函数,所以它得到一个默认的no-args构造函数,由编译器创建,调用super(),即基类的no-args构造函数
  2. 基类是PrintStream,它没有no-args构造函数。
  3. 所以你得到一个编译错误。您需要为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中可以找到的构造函数,你会得到编译错误。