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

Java中System.out的类型是什么?,java,system.out,system.in,Java,System.out,System.in,我只是一个Java新手。我想知道如何使用System.out.println()。Out是系统类中的静态字段。out的类型是PrintStream。但是当我看到PrintStream类的构造函数时,它采用了OutputStream类型的参数,据我所知,我们无法创建抽象类的对象。在这种情况下,我们必须将某个子类的对象传递给PrintStream的构造函数。那是什么课?在中,系统也是如此。它也是InputStream的参考,但它指向的对象类型是什么,因为InputStream是抽象的?PrintSt

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

PrintStream
包装
bufferedoutstream
,包装写入控制台的
FileOutputStream
,它有自己的
文件描述符

输出
打印流
类型。
PrintStream
的构造函数采用
OutputStream
类型<代码>输出流是抽象类。但是任何超类引用都可以引用子类对象,而无需强制转换,因此PrintStream的构造函数具有
OutputStream
引用,但该引用必须引用
OutputStream
的子类之一,如
FileOutputStream

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

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

文件描述符

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

关于
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
    兼容的赋值类型

    您可以使用java的反射在运行时检查所有重要的对象信息或在调试器中查看它。;)@PeterLawrey这将打印
    类java.io.PrintStream
    其他内容:)使用调试器的想法更有效;)我想补充一点,静态字段System.out不必由用户实例化。它可以直接使用。我的感觉是OP在理解这一点上有些困难。@Fildor我没有这种感觉。在我看来,这只是一个理论问题。从技术上讲,它是一个
    文件描述符。
    文件
    类未被使用。@PeterLawrey谢谢,这是我的打印错误。我会解决它。
    FileInputStream
    用于
    stdin
    FileOutputStream
    用于
    stdout
    。那stderr呢?
    @overexchange stderr和stdout差不多。你也能评论一下第一部分吗?关于Stream的概念,但我们知道实现类是PrintStream或PrintStream的子类,对吗?是的。这或多或少就是“任务兼容”的意思!(但是…quibble…
    null
    没有实现类。这就是为什么“分配兼容”在技术上比您所说的更准确。)