System.in和System.out的类型

时间:2017-11-18 23:42:39

标签: java

  1. The declaration of System.in 说它有类型InputStream

    public static final InputStream in
    

    但是InputStream是一个抽象类。

    默认情况下in的实际类型是什么?这是具体的吗? InputStream的子类?

    我们可以更改in引用的对象的类型吗?我猜不是,因为final

  2. 同样the declaration of System.out 说它有类型PrintStream

    public static final PrintStream out
    

    为什么声明out具有具体的类类型,而in 不是

1 个答案:

答案 0 :(得分:1)

这是以下各项的组合:

  1. 历史原因
  2. 具体类型的灵活性(例如根据实现和/或运行时环境)并且仅提供所需的方法(例如,“程序到界面,而不是具体类”)
  3. 1,历史原因:类XxxxStream以字节为单位工作,而XxxxWriter工作于字符,对吧?不完全的。也有例外。 System.out是一个PrintStream,适用于字符!为什么不是PrintWriter。历史原因。

    2,编程到接口。 System.out声明为PrintStream,但这并不一定意味着其运行时具体类型实际上是PrintStream。它可以很容易地成为PrintStream的子类。为什么System.out不是声明为抽象类型?仅仅因为它决定它应该提供PrintStream中可用的方法,而PrintStream不需要任何其他具体的东西。

    由于InputStream是抽象的,我们知道System.in绝对是一个子类。为什么不宣布它是具体的类?因为这可能使它变得不灵活。也许在某些情况下(例如STDIN重定向)它可能是一个FileInputStream,在其他情况下它可能是另一种类型的InputStream。最有可能的是,它是一个具体的类,其定义是私有的。