只要写过 Java,十有八九跟 System.out.println() 打过照面。它几乎是每个“Hello, World”的起点。
但这行看起来理所当然的代码,到底在干嘛?不妨拆开来瞧一眼。

先看一个更简单的例子:

class Demo {
  static String s = "Hello World";
}

这里我们定义了一个 Demo 类,在类里声明了一个静态字符串变量 s,值是 "Hello World"。 现在,如果我想获取字符串 s 的长度,可以这么写:

Demo.s.length();

来按顺序拆一下这行代码:

  • Demo:类名,也就是刚才定义的那个类。
  • s:定义在 Demo 类中的一个 静态 String 变量。
  • length()String 类提供的,用来获取字符串长度的方法。

所以整行可以读成:

“从 Demo 这个类里,拿到静态变量 s,然后调用 s 这个字符串的 length() 方法。”


有了这个基础,再回头看今天的主角:System.out.println()

如果你去翻一下 JDK 源码,会在 System 类里看到和 out 相关的声明,大致是这样:

public static final PrintStream out;

不用太纠结初始化的细节,只要记住这件事:

out 是定义在 System 类中的一个 公有的、静态的 PrintStream 对象,用来代表“标准输出”。

于是把 System.out.println() 拆开看,就很像刚才那个 Demo.s.length() 的结构:

  • System:一个和“外部环境”打交道的类,负责标准输入 / 标准输出 / 错误输出等。
  • outSystem 类里声明的一个静态 PrintStream 对象,表示“标准输出流”。
  • println()PrintStream 提供的方法,用来把内容打印到标准输出(通常就是控制台),并在末尾换行。

把它翻译成人话,大概就是:

System 这个类,拿出它的标准输出流 out, 然后在这个输出流上,调用 println(),把我要打印的东西丢到控制台上,并顺便换个行。

所以下次再看到 System.out.println("Hello World"); 的时候,你可以在脑子里自动附送一行注释:

“从 System 里拿标准输出流,把 "Hello World" 打印到屏幕上,然后换行。”

看似平平无奇的一行代码,其实已经帮你走完了:找到类 → 拿到静态字段 → 调用方法 → 输出到终端 这一整套流程。