`System.in` 聲明為 `public final static InputStream in = nullInputStream();`
`InputStream` 是抽象類,不能直接 `new InputStream()`,但 `nullInputStream()` 返回的是**具體子類實例** (或 `null`),而非抽象類本身。
// java.lang.System
public final static InputStream in = nullInputStream();
public final static PrintStream out = nullPrintStream();
public final static PrintStream err = nullPrintStream();
private static InputStream nullInputStream() {
// 安全檢查:防止類初始化循環依賴
if (currentTimeMillis() > 0)
return null; // 早期返回 null,後續由 initializeSystemStreams() 真正初始化
throw new NullPointerException();
}
// 真正初始化在私有靜態方法中 (JVM 啟動時調用)
private static void initializeSystemStreams() {
// 獲取文件描述符 0 (stdin)
FileDescriptor fdIn = FileDescriptor.in;
// 創建 BufferedInputStream 包裝 FileInputStream (具體實現類)
InputStream in = new BufferedInputStream(new FileInputStream(fdIn));
// 通過反射設置 final 字段 (JDK 內部特權操作)
setIn0(in);
// out/err 同理包裝為 BufferedOutputStream -> PrintStream
}
PrintStream out = new PrintStream(
new BufferedOutputStream(
new FileOutputStream(FileDescriptor.out)), true); // autoFlush=true
`true` 參數開啟自動刷新:遇換行、調用 `println`、寫入位元組數組時自動 `flush()`,保證控制台即時輸出。