HelloWorld源码研究问题?

双人鱼XKQ 发布于 2016/04/14 13:54
阅读 151
收藏 0
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(); 这里是为什么呢?该如何理解呢?大神求救
加载中
0
妹子楼顶有鸽子
妹子楼顶有鸽子

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);
}

返回顶部
顶部