Java中System.out的类型是什么?
我只是一个Java新手。我想知道如何使用Java中System.out的类型是什么?,java,system.out,system.in,Java,System.out,System.in,我只是一个Java新手。我想知道如何使用System.out.println()。Out是系统类中的静态字段。out的类型是PrintStream。但是当我看到PrintStream类的构造函数时,它采用了OutputStream类型的参数,据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将某个子类的对象传递给PrintStream的构造函数。那是什么课?在中,系统也是如此。它也是InputStream的参考,但它指向的对象类型是什么,因为InputStream是抽象的?PrintSt
System.out.println()
。Out是系统
类中的静态字段。out
的类型是PrintStream
。但是当我看到PrintStream
类的构造函数时,它采用了OutputStream
类型的参数,据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将某个子类的对象传递给PrintStream
的构造函数。那是什么课?在中,系统也是如此。它也是InputStream
的参考,但它指向的对象类型是什么,因为InputStream
是抽象的?PrintStream
包装bufferedoutstream
,包装写入控制台的FileOutputStream
,它有自己的文件描述符
是输出
是打印流
类型。PrintStream
的构造函数采用OutputStream
类型<代码>输出流是抽象类。但是任何超类引用都可以引用子类对象,而无需强制转换,因此PrintStream的构造函数具有OutputStream
引用,但该引用必须引用OutputStream
的子类之一,如FileOutputStream
查看类结构的简单方法是在调试器中检查它
正如您所看到的,@Andremonify的描述基本上就是您所拥有的
文件描述符
- 0是System.in
- 1是System.out
- 2是System.err
- 3+用于其他文件
关于
System.out的实现,还有几件事要说
未指定System.out
的实际实现类。javadocs没有说明它是什么。我们观察到(以各种方式)Oracle Java和OpenJDK Java以一种特定的方式实现了“堆栈”(参见其他答案),但这在将来可能会改变
System::setOut(PrintStream)
方法可用于修改System.out
绑定到的内容。如果发生这种情况,任何关于实现类的假设都可能是错误的
事实证明,您可以这样做:
System.setOut(null);
因此,System.out
可以是null
。但是,在当前的实现中,System.out
不会是null
,除非您将其设置为null
规范真正保证的是System.out的值将具有与PrintStream
兼容的赋值类型 您可以使用java的反射在运行时检查所有重要的对象信息代码>或在调试器中查看它。;)@PeterLawrey这将打印类java.io.PrintStream
其他内容:)使用调试器的想法更有效;)我想补充一点,静态字段System.out不必由用户实例化。它可以直接使用。我的感觉是OP在理解这一点上有些困难。@Fildor我没有这种感觉。在我看来,这只是一个理论问题。从技术上讲,它是一个文件描述符。文件
类未被使用。@PeterLawrey谢谢,这是我的打印错误。我会解决它。FileInputStream
用于stdin
,FileOutputStream
用于stdout
。那stderr呢?
@overexchange stderr和stdout差不多。你也能评论一下第一部分吗?关于Stream的概念,但我们知道实现类是PrintStream或PrintStream的子类,对吗?是的。这或多或少就是“任务兼容”的意思!(但是…quibble…null
没有实现类。这就是为什么“分配兼容”在技术上比您所说的更准确。)