查看System.out.println的内部代码是否想了解其工作原理?

时间:2018-09-16 12:27:36

标签: java

我刚刚下载了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的初学者,所以请向我介绍我在这里缺少的部分

谢谢

1 个答案:

答案 0 :(得分:5)

System类具有一个静态块,该块调用registerNatives方法,即native method。在源代码中有以下注释:

  

VM将调用initializeSystemClass方法来完成   该类的初始化与clinit分开。         请注意,要使用VM设置的属性,请参见约束        在initializeSystemClass方法中进行了介绍。

因此,当从静态块中调用registerNatives时,JVM将调用上述注释中提到的initializeSystemClass方法。此方法具有out字段的初始化。

在类加载期间将调用一个静态块。因此,您可以确保每次从代码中调用System.out.println时,都会调用此静态块,并且已经初始化out字段。