相信大家接触Java的第一行代码应该就是System.out.println("Hello World!");
了,但是大家有没有想过这个语句是怎么输出的呢?
我们先扒开System
类看看:
public final class System {
public final static PrintStream out = null;
}
里头有一段代码是这样的(jdk8中在第110行),我们可以看到有一个静态常量叫做out。对于out,它是PrintStream的一个对象,我们继续扒开它的源代码,可以发现在jdk8版本中的第695行有这样一个方法public void println() { newLine(); }
,这就是我们经常使用的System.out.println();
的真面目了!
对于这个方法不难理解,它就是一个输出换行,那么对应的newLine();
方法就是单纯的换行。
当我们继续向下阅读代码时,不难发现这里头有好多println()
的重载方法,这就满足可以输出任意类型的数据。
下面就是一个输出浮点数的一个方法:
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}
我们可以看到他的结构是一个print();
方法和newLine();
方法,我们继续深入:
public void print(float f) {
write(String.valueOf(f));
}
我们可以发现print();
方法里头实际上是调用了wirte();
方法。对于数字和Object以及字符来说,传入的参数是一个通过valueOf();
的方法转换成的字符串;对于布尔型则使用三目运算符write(b ? "true" : "false");
,但是其本质上还是字符串;对于字符数组和字符串来说,则是直接输出。
总结一下,传入write();
方法中的参数都是字符串,我们随便打开一个方法中的write();
方法,会发现print();
方法所调用的write();
都是这个方法private void write(String s) {}
,这样似乎就不难解释这个问题了。
总结一下,System.out.println();
这句话实质上是调用System
类里头的PrintStream
类对象out
的println();
方法,这个方法调用了本类的print();
方法和newLine();
方法。