Java中的System.out.println - out在本地方法中被初始化了吗?

3
我想知道在System.out.println()中,out变量是否在System类的静态块中初始化。 out字段被声明为final static变量,其等于null(public final static PrintStream out = null;)。由于out指向null,我假设它在某个地方指向PrintStream对象。但是除了一个名为registerNatives()的本地方法之外,我看不到代码。它是否在本地方法中被指向?这样做有什么性能优势吗? 此外,在System的文档中,对out变量的描述如下:

“标准”输出流。该流已经打开并准备好接受输出数据。通常,该流对应于由主机环境或用户指定的显示输出或其他输出目标。”

谢谢。

我猜想out只是在不同的平台上有所不同。因此,在Java中初始化它没有任何意义。每个平台都必须根据其相应的架构创建对象。 - Gaktan
2
众所周知,JVM对out进行了一些特殊处理。例如,如果outfinal,那么你如何调用System.setOut()呢?答案是它并不是真正的final,JVM已经硬编码忽略了这个修饰符(虽然分配仍然是线程安全的--这也是硬编码实现的)。 - markspace
1个回答

5

参考 JDK 1.8

输出注册流程

Java虚拟机(JVM)调用

private static void initializeSystemClass()line-1155 行处

函数调用

setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")))line-1192 行处调用

实际的本地方法定义为

private static native void setOut0(PrintStream out);line-258 行处;

然后setOut0初始化out类成员。


注意:库引用 jdk 1.8 - Shinde Arjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接