【问题标题】:What is the type of System.out in Java?Java 中 System.out 的类型是什么?
【发布时间】:2013-01-21 08:47:07
【问题描述】:

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

【问题讨论】:

  • 可以使用java的反射在运行时检查所有重要的对象信息。
  • 试试System.out.println(System.out.getClass()); 或在调试器中查看。 ;)
  • @PeterLawrey 这将打印class java.io.PrintStream 没有别的:) 使用调试器的想法更有效;)

标签: java system.out system.in


【解决方案1】:

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

【讨论】:

  • 我想补充一点,静态字段 System.out 不必由用户实例化。它可以直接使用。我的感觉是 OP 在理解这一点时遇到了一些麻烦。
  • @Fildor 我没有那种感觉。在我看来,这只是理论上的问题。
  • 技术上它是FileDescriptor。未使用 File 类。
  • @PeterLawrey 谢谢,这是我的印刷错误。我会解决的。
【解决方案2】:

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

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

文件描述符

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

【讨论】:

  • FileInputStreamstdinFileOutputStreamstdoutstderr 呢?
  • @overexchange 标准错误与标准输出非常相似。
  • 正确。你也可以评论query的第一部分吗?关于流的想法
【解决方案3】:

是的outPrintStream 类型。 PrintStream 的构造函数采用 OutputStream 类型。 OutputStream 是抽象类。 但是任何超类引用都可以引用子类对象而不需要强制转换,所以 PrintStream 的构造函数有OutputStream 引用,但是这个引用必须引用OutputStream 的子类之一,例如FileOutputStream

【讨论】:

    【解决方案4】:

    关于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

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

    【讨论】:

    • 但是我们知道实现类要么是 PrintStream 要么是 PrintStream 的子类,对吧?
    • 是的。这或多或少是“作业兼容”的意思! (但是……狡辩……null 没有实现类。这就是为什么“赋值兼容”在技术上比你说的更准确。)
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多