我刚刚下载了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对象为null,如何发生?为什么没有java.lang.NullPointerException。此外,PrintStream类不是静态的,以防止实例化该对象。
我真的是Java的初学者,所以请向我介绍我在这里缺少的部分
谢谢
答案 0 :(得分:5)
System
类具有一个静态块,该块调用registerNatives
方法,即native method。在源代码中有以下注释:
VM将调用initializeSystemClass方法来完成 该类的初始化与clinit分开。 请注意,要使用VM设置的属性,请参见约束 在initializeSystemClass方法中进行了介绍。
因此,当从静态块中调用registerNatives
时,JVM将调用上述注释中提到的initializeSystemClass
方法。此方法具有out
字段的初始化。
在类加载期间将调用一个静态块。因此,您可以确保每次从代码中调用System.out.println
时,都会调用此静态块,并且已经初始化out
字段。