6

出于好奇,我正在查看docjar.com上的一些 Java API 类的源代码。我看到了 java.lang.System 类,看到 PrintStream “out”(即 System.out)有以下代码:

public final static PrintStream out = null;

并在评论中说:

The "standard" output stream. This stream is already
open and ready to accept output data.

我的问题是,我知道最终变量无法修改,那么为什么声明时为空?为什么调用“out”的方法时 Java 不抛出 NullPointerException?System.in 也是如此。

感谢您的任何澄清。

4

2 回答 2

1

有一个 java.lang.System#registerNatives() 本机方法。如果您在 jvm 源代码中查看它,它会从本机代码中分配 sysin、sysout 和 syserr。在 java 7 之前,这些声明看起来像public final static InputStream in = nullInputStream();,但我猜他们将它更改为 null,并在 javac 中进行了一些黑客攻击,而不仅仅是内联它。

于 2013-10-04T05:35:54.383 回答
0
  • 看看 private static void initializeSystemClass() - 这个方法被调用来启动,它调用 setOut0() 这是一个本地方法。这将 Stream 与它应该在的位置联系起来。

    因此,即使该字段可能看起来是 public static final 但实际上不是,本机代码会更改它。

    JVM 调用初始化它的私有静态 void initializeSystemClass()方法。

于 2013-10-04T05:41:47.290 回答