我只是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+ 用于其他文件

PrintStreamwraps 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为.nullnull
规范实际上保证的是 的值System.out将具有与赋值兼容的类型PrintStream。