代碼輸出順序「3號 → 1號 → 2號」讓新手困惑。核心規則:**new A1(s1,s2) 會立即調用構造方法,構造方法內的打印先於 main 方法後續語句執行**。
main() 執行到:
A1 s = new A1(s1, s2); // 1. 分配內存
// 2. 調用構造方法 A1(String, String)
// ├─ 參數賦值給字段 s1, s2
// ├─ 修改局部參數 str1, str2 (不影響外部)
// └─ 打印 "3號 No pain, no gain!"
// 3. 構造完成,返回引用賦給 s
System.out.println("1號" + s1 + s2); // 4. 繼續執行
System.out.println("2號" + s.toString()); // 5. 調用 toString()
new 表達式求值過程中,在賦值給變量之前完成。str1/str2 只影響局部副本,外部 s1/s2 引用不變。s.toString() 調用 A1 重寫的方法,返回字段拼接 s1+s2。
棧: main棧桢
s1 ──────► 堆: "Hello!" (String對象)
s2 ──────► 堆: "I love JAVA."
s ──────► 堆: A1對象
s1 ───► "Hello!"
s2 ───► "I love JAVA."
理解「構造器在 new 表達式中同步執行」,輸出順序不再神秘。