和你想象中不一样的Hello World

相信大家接触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类对象outprintln();方法,这个方法调用了本类的print();方法和newLine();方法。

发布了34 篇原创文章 · 获赞 27 · 访问量 5833

猜你喜欢

转载自blog.csdn.net/weixin_46192593/article/details/105677965