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();
这里是为什么呢?该如何理解呢?
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);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。