Java的System.out.println()深入解析理解

在Java程序(特别是控制台)中常用System.out.println()语句来输出信息,从开始学习Java就知道用它来输出Hello World,没有深究其实现原理,现在查阅文档、源代码后记录一下。

首先查阅文档和源码可知Systemjava.lang包里的一个final类,而每个Java程序是默认import java.lang.*的,因此即使程序中没有手动导入,也可访问到System类。

main()方法是static修饰的,根据Java语法,它只能调用static方法和变量,那么查看System类的源码有public static final PrintStream out = null;这一行,说明System.outpublicstatic的,因此能在main()中访问。
在这里插入图片描述
System.out是一个PrintStream类型的变量,而在PrintStream中有多个print()println()方法重载,因此可输出多种类型的数据。
继承关系如图所示,所有类都间接或直接继承Object类。
继承关系图

想必还有一个疑问,就是System类中public static final PrintStream out = null;,那么out变量是在哪里、什么时候初始化,从而可以直接使用的呢?因为outstatic变量,我们通过System.out(类名.变量名)的方式调用,再查看System类源码可发现在static{}代码块中调用了registerNatives(),而native方法registerNatives()由C/C++实现,这里只是一个接口,在System类第一次被加载时,调用这个方法将out变量进行了初始化,让它指向控制台,于是就可以直接使用了。
在这里插入图片描述
看到这里,似乎还有println()方法没有研究。
查看java.io包中的PrintStream类寻找println()方法,可以看到有形参为boolean、char、int…等类型的println()的重载,而println()其实调用了print()再调用newLine()来实现换行。
在这里插入图片描述
而在不同类型形参的print()方法中,除char[]变量,都调用String.valueOf()转换成String再传递给write()方法。
在这里插入图片描述
而在write()方法中,调用textOut.write()来输出字符串。
在这里插入图片描述
textOut是在PrintStream中声明的BufferedWriter类型变量。下面还有一行private OutputStreamWriter charOut;
在这里插入图片描述
接着看,在构造方法中,先是初始化了OutputStreamWriter类型变量charOut,再用它初始化textOut
在这里插入图片描述
至此可以清楚,System.out.println()System.out.print()(不换行),其实最终调用了Writer类中的write()方法进行字符流输出,只是整个过程封装了许多方法来支持各种类型的变量、以及自动初始化等,使得用户能够方便快捷在控制台打印数据。

有不妥之处欢迎补充纠正。

  • 39
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值