我只是Java的新手。我想知道使用的方式System.out.println()
。Out 是System
类内的静态字段。的类型out
是PrintStream
。但是当我看到PrintStream
类的构造函数时,它需要一个类型的参数,OutputStream
据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将某个子类的对象传递给PrintStream
. 那是什么课?也是一样System.in
。它也是InputStream
' 的引用,但它指向的对象类型是什么,因为它InputStream
是抽象的?
4 回答
查看类结构的一种简单方法是在调试器中检查它。
如您所见,@Andremonify 的描述基本上就是您所拥有的。
文件描述符
- 0 是 System.in
- 1 是 System.out
- 2 是 System.err
- 3+ 用于其他文件
PrintStream
wraps BufferedOutputStream
,它 wraps FileOutputStream
,它正在写入控制台,它有自己的FileDescriptor
.
是out
的PrintStream
类型。并且构造函数PrintStream
采用OutputStream
类型。OutputStream
是抽象类。但是任何超类引用都可以引用子类对象而无需强制转换,因此 PrintStream 的构造函数具有OutputStream
引用,但是此引用必须引用OutputStream
的子类之一FileOutputStream
关于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
。