The declaration of
System.in
说它有类型InputStream
:
public static final InputStream in
但是InputStream
是一个抽象类。
默认情况下in
的实际类型是什么?这是具体的吗?
InputStream
的子类?
我们可以更改in
引用的对象的类型吗?我猜不是,因为final
?
同样the declaration of
System.out
说它有类型PrintStream
:
public static final PrintStream out
为什么声明out
具有具体的类类型,而in
不是
答案 0 :(得分:1)
这是以下各项的组合:
1,历史原因:类XxxxStream以字节为单位工作,而XxxxWriter工作于字符,对吧?不完全的。也有例外。 System.out是一个PrintStream,适用于字符!为什么不是PrintWriter。历史原因。
2,编程到接口。 System.out声明为PrintStream,但这并不一定意味着其运行时具体类型实际上是PrintStream。它可以很容易地成为PrintStream的子类。为什么System.out不是声明为抽象类型?仅仅因为它决定它应该提供PrintStream中可用的方法,而PrintStream不需要任何其他具体的东西。
由于InputStream是抽象的,我们知道System.in绝对是一个子类。为什么不宣布它是具体的类?因为这可能使它变得不灵活。也许在某些情况下(例如STDIN重定向)它可能是一个FileInputStream,在其他情况下它可能是另一种类型的InputStream。最有可能的是,它是一个具体的类,其定义是私有的。