2024.1.17

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

main()方法是static修饰的,根据Java语法,它只能调用static方法和变量,那么查看System类的源码有public static final PrintStream out = null;这一行,说明System.out是public和static的,因此能在main()中访问。
System.out是一个PrintStream类型的变量,而在PrintStream中有多个print()和println()方法重载,因此可输出多种类型的数据。
继承关系如图所示,所有类都间接或直接继承Object类。就是System类中public static final PrintStream out = null;因为out是static变量,我们通过System.out(类名.变量名)的方式调用,再查看System类源码可发现在static{}代码块中调用了registerNatives(),而native方法registerNatives()由C/C++实现,这里只是一个接口,在System类第一次被加载时,调用这个方法将out变量进行了初始化,让它指向控制台,于是就可以直接使用了。
查看java.io包中的PrintStream类寻找println()方法,可以看到有形参为boolean、char、int…等类型的println()的重载,而println()其实调用了print()再调用newLine()来实现换行。
至此可以清楚,System.out.println()或System.out.print()(不换行),其实最终调用了Writer类中的write()方法进行字符流输出,只是整个过程封装了许多方法来支持各种类型的变量、以及自动初始化等,使得用户能够方便快捷在控制台打印数据。

posted @ 2024-01-18 17:59  kuku睡  阅读(31)  评论(0)    收藏  举报