java - 查看 System.out.println 的内部代码想了解它是如何工作的?

标签 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() {

所以如果我们在主函数中调用函数 系统.out.println()

如果 out 对象为空,怎么会发生这种情况。为什么没有 java.lang.NullPointerException。此外,类 PrintStream 不是静态的,以防止对象的实例化。

我真的是 java 的初学者所以请用我在这里缺少的部分启发我

谢谢,

最佳答案

System 类有一个调用 registerNatives 方法的静态 block ,它是一个 native method .源代码中有如下注释:

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.

所以当从静态 block 中调用registerNatives时,JVM会调用上面注释中提到的initializeSystemClass方法。此方法对 out 字段进行了初始化。

在类加载期间调用静态 block 。因此,您可以确定无论何时从您的代码中调用 System.out.println,此静态 block 都已被调用并且 out 字段已被初始化。

关于java - 查看 System.out.println 的内部代码想了解它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52354126/

相关文章:

java - 带有对象集的 Spring 绑定(bind)复选框

java - 从SQL Server 2005升级到SQL Server 2008,JAVA应用程序会出现错误吗?

java - 如何在java中设置1分钟间隔时间逻辑

java - 程序在 LibGDX -desktop 上运行良好,但在 LibGDX - Android 上运行不正常?

Java 异常将 ": null"附加到 "Caused by"子句

java - libGDX Sprite 渲染失败

java - 在 Liferay 5 中获取文章的类别

java - SC Java 程序员 6 考试

java - Tomcat-to-tomcat 连接给出 SSLHandshakeException,而 JavaApp-to-Tomcat 工作正常

java - 使用 php 或 java 打开 Edge 数据库连接