gpt4 book ai didi

java - System.out 被声明为 static Final 并用 null 初始化?

转载 作者:行者123 更新时间:2023-12-02 00:40:54 25 4
gpt4 key购买 nike

当我浏览System.class时我发现了一些对我来说似乎很奇怪的东西。当您查看 System.in, System.out, System.err 的声明时这些被标记为 final static但也用 null 初始化

public final static InputStream in = null;  
public final static PrintStream out = null;
public final static PrintStream err = null;

final只能初始化一次,那么如何管理它们?
当我们使用System.out.print("...");时显然out不是null但作为 final static怎么不是null

那么有人可以解释一下已经声明为final的out是如何初始化的吗?

最佳答案

它是用静态初始化程序中的 native 代码初始化的。在 System.java 的顶部有:

/* register the natives via the static initializer.
*
* VM will invoke the initializeSystemClass method to complete
* the initialization for this class separated from clinit.
* Note that to use properties set by the VM, see the constraints
* described in the initializeSystemClass method.
*/
private static native void registerNatives();
static {
registerNatives();
}

registerNatives() 方法将初始化 in/out/err - 它是在 native 代码中这样做的 - native 代码几乎可以做任何它想做的事情,并且不限于所有 java 语言规则。 (尽管您也可以通过反射在 Java 中设置已初始化的 Final 字段)

关于java - System.out 被声明为 static Final 并用 null 初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com