Java中System.out的类型是什么?

时间:2013-01-21 08:47:08

标签: java system.out system.in

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

4 个答案:

答案 0 :(得分:3)

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

正如你所看到的,@ Andremonify的描述基本上就是你所拥有的。

FileDescriptor

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

enter image description here

答案 1 :(得分:2)

PrintStream包裹BufferedOutputStream,其中包含FileOutputStream,它正在写入控制台,该控制台有自己的FileDescriptor

答案 2 :(得分:1)

out属于PrintStream类型。 PrintStream的构造函数采用OutputStream类型。 OutputStream是抽象类。 但是任何超类引用都可以在不转换的情况下引用子类对象,因此PrintStream的构造函数具有OutputStream引用,但这种引用必须引用OutputStream的子类之一{{1} }

答案 3 :(得分: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除非您将其设置为null,否则不会null

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