开发者社区> 问答> 正文

关于HelloWorld源码研究的问题?

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(); 这里是为什么呢?该如何理解呢?

展开
收起
爵霸 2016-03-23 14:54:51 2303 0
1 条回答
写回答
取消 提交回答
  • 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);
     }
    2019-07-17 19:11:09
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载