Java System.in和System.out的类型
表示它具有类型Java System.in和System.out的类型,java,Java,表示它具有类型InputStream: public static final InputStream in public static final PrintStream out 但是,InputStream是一个抽象类 默认情况下,中的的实际类型是什么?是混凝土的吗 InputStream的子类 我们能否更改中的所指对象的类型?我想没有,因为最终版 同样地 表示它具有类型PrintStream: public static final InputStream in public sta
InputStream
:
public static final InputStream in
public static final PrintStream out
但是,InputStream
是一个抽象类
默认情况下,中的的实际类型是什么?是混凝土的吗
InputStream
的子类
我们能否更改
中的所指对象的类型?我想没有,因为最终版
同样地
表示它具有类型PrintStream
:
public static final InputStream in
public static final PrintStream out
为什么out
声明有一个具体的类类型,而in
不是吗
它是以下因素的组合:
历史原因
具体类型的灵活性(例如,根据实现和/或运行时环境),只提供所需的方法(即“程序到接口,而不是具体类”)
历史原因:类XxxxStream以字节为单位工作,而XxxxWriter以字符为单位工作,对吗?不完全是。也有例外。System.out是一个PrintStream,它可以在chars上工作!为什么它不是一个印刷作家。历史原因
编程到一个接口。System.out声明为PrintStream,但这并不一定意味着其运行时具体类型实际上是PrintStream。它可以很容易地成为PrintStream的一个子类。为什么System.out不声明为抽象类型?这仅仅是因为它决定提供PrintStream中可用的方法,而PrintStream不需要任何其他具体的东西
由于InputStream是抽象的,我们知道System.in肯定是一个子类。为什么不声明它是一个具体的类呢?因为这会使它变得不灵活。可能在某些情况下(例如STDIN重定向),它可能是一个FileInputStream,而在其他情况下,它可能是另一种类型的InputStream。很可能是一个定义为私有的具体类。有一个具体的子类。我不认为它是一个公共的具体子类。@Oliver为什么它是重复的?你注意到链接的问题只讨论了out
和一个不同的问题吗?这两篇文章你都读吗?如果不是,你在这里所做的是非常不恰当的,造成了很大的损害,你能纠正你关闭我的帖子的错误吗?你的问题是许多现有问题的交叉点-我刚才又添加了一个重复的问题。@Tim,1。您可以通过System.in.getClass()
检查运行时类(它为我提供了类java.io.BufferedInputStream
),这正是为什么惯例是每个问题有一个问题。。。(你似乎已经知道你的一个子问题的答案,因为这是在你先前关于C#的回答中提供的。)