我刚刚下载了jdk的源代码,我对System.out.println函数感兴趣
。通过查看java.lang中的类System,我了解了这一部分:
public final class System {
public final static PrintStream out = null;
在 java.io 中,类 PrintStream 是这样声明的:
public class PrintStream extends FilterOutputStream
implements Appendable, Closeable {
public void println() {
所以如果我们在主函数中调用函数 System.out.println((
如果 out 对象为空,怎么会发生这种情况。为什么没有java.lang.NullPointerException。此外,类 PrintStream 不是静态的,以防止对象的实例化。
我真的是java的初学者,所以请用我在这里缺少的部分来启发我
谢谢
System
类有一个静态块,用于调用registerNatives
方法,这是一个本机方法。源代码中有以下注释:
VM 将调用初始化系统类方法来完成 此类的初始化与 clinit 分离。 请注意,若要使用 VM 设置的属性,请参阅约束 在初始化系统类方法中描述。
因此,当从静态块调用registerNatives
时,上面注释中提到的initializeSystemClass
方法由 JVM 调用。此方法对out
字段具有初始化功能。
在类加载期间调用静态块。因此,您可以确定,无论何时从代码调用System.out.println
,都已调用此静态块,并且已初始化out
字段。