5

我只是Java的新手。我想知道使用的方式System.out.println()。Out 是System类内的静态字段。的类型outPrintStream。但是当我看到PrintStream类的构造函数时,它需要一个类型的参数,OutputStream据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将某个子类的对象传递给PrintStream. 那是什么课?也是一样System.in。它也是InputStream' 的引用,但它指向的对象类型是什么,因为它InputStream是抽象的?

4

4 回答 4

3

查看类结构的一种简单方法是在调试器中检查它。

如您所见,@Andremonify 的描述基本上就是您所拥有的。

文件描述符

  • 0 是 System.in
  • 1 是 System.out
  • 2 是 System.err
  • 3+ 用于其他文件

在此处输入图像描述

于 2013-01-21T09:03:11.817 回答
3

PrintStreamwraps BufferedOutputStream,它 wraps FileOutputStream,它正在写入控制台,它有自己的FileDescriptor.

于 2013-01-21T08:51:35.600 回答
1

outPrintStream类型。并且构造函数PrintStream采用OutputStream类型。OutputStream是抽象类。但是任何超类引用都可以引用子类对象而无需强制转换,因此 PrintStream 的构造函数具有OutputStream引用,但是此引用必须引用OutputStream的子类之一FileOutputStream

于 2013-01-21T09:02:33.517 回答
1

关于System.out.

  1. 的实际实现类System.out指定。javadocs 没有说明它是什么。 我们(以各种方式)观察到 Oracle Java 和 OpenJDK Java 以特定方式实现“堆栈”(请参阅​​其他答案),但这可能会在未来发生变化。

  2. System::setOut(PrintStream)方法可用于修改System.out绑定的内容。如果发生这种情况,任何关于实现类的假设都可能是不正确的。

  3. 事实证明,您可以这样做:

      System.setOut(null);
    

    System.out 可能是这样null。但是,对于当前的实现,除非您将其设置System.out为.nullnull

规范实际上保证的是 的值System.out将具有与赋值兼容的类型PrintStream

于 2017-10-26T11:45:45.927 回答