我只是Java的新手。我想知道System.out.println()
的使用方式。 Out是System
类中的静态字段。 out
的类型为PrintStream
。但是当我看到PrintStream
类的构造函数时,它接受类型为OutputStream
的参数,据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将一些子类的对象传递给PrintStream
的构造函数。那课是什么?同样是System.in
。它也是InputStream
的引用,但它指向的对象类型是什么,因为InputStream
是抽象的?
答案 0 :(得分:3)
查看类结构的一种简单方法是在调试器中检查它。
正如你所看到的,@ Andremonify的描述基本上就是你所拥有的。
FileDescriptor
答案 1 :(得分:2)
PrintStream
包裹BufferedOutputStream
,其中包含FileOutputStream
,它正在写入控制台,该控制台有自己的FileDescriptor
。
答案 2 :(得分:1)
是out
属于PrintStream
类型。 PrintStream
的构造函数采用OutputStream
类型。 OutputStream
是抽象类。 但是任何超类引用都可以在不转换的情况下引用子类对象,因此PrintStream的构造函数具有OutputStream
引用,但这种引用必须引用OutputStream
的子类之一{{1} }
答案 3 :(得分:1)
关于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
兼容的类型。