关于HelloWorld源码研究的问题?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

关于HelloWorld源码研究的问题?

爵霸 2016-03-23 14:54:51 1157

package com.xukaiqiang.code.code; /** * @ProjectName:code * @ClassName:App * @Description:研究HelloWorld源码程序 * @date : Apr 14, 201612:16:09 PM * @author : bruce * @version: V1.0 */ public class App { public static void main(String[] args) { /** * 1.System为final类,不能被继承,相当于"太监"了 * 2.out为System类的一个成员属性,由PrintStream类实例化 * 3.println为PrintStream的方法 */ System.out.println("Hello World!"); } } ------------------------------------------------------------------------------------------------ 如上,是每个初学者入门的一个Java的HelloWorld打印输出到控制台的代码。 我们可以看一下源代码: public final class System{}表示System类,不可以被继承。 public final static PrintStream out = null; out对象为System类的一个成员属性,注意,这里这个对象并没有实例化。 我们看一下PrintStream类, public class PrintStream extends FilterOutputStream implements Appendable, Closeable{} 以及它下面的println方法 public void println(String x) { synchronized (this) { print(x); newLine(); } } ---------------------------------------------------好看的分割线------------------------------ 问题来了,为什么可以直接通过点进行调用? System.out.println(); 为什么out并没有实例化,为什么可以调用println()方法? 大家都知道: 如果调用一个类中的方法,可以有以下两种方式: 1.实例化这个类。 比如 A a =new A(); a.save(); 2.这个方法是静态方法 可以用类名.add(); 比如: public class A{ public static void add(){} } 调用:A.add(); 这里是为什么呢?该如何理解呢?

Java
分享到
取消 提交回答
全部回答(1)
  • 爵霸
    2019-07-17 19:11:09

    out肯定是实例化了的啊,initializeSystemClass —>setIn0:

    JNIEXPORT void JNICALL
     Java_java_lang_System_setIn0(JNIEnv *env, jclass cla, jobject stream)
     {
         jfieldID fid =
             (*env)->GetStaticFieldID(env,cla,"in","Ljava/io/InputStream;");
         if (fid == 0)
             return;
         (*env)->SetStaticObjectField(env,cla,fid,stream);
     }
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程