面試高頻題:
P1 = V1;
P2 = V2;
method(P1, P2) {
P1 = V3;
P2 = V4;
}
// 結果:P1 = V1; P2 = V4;
問:P1、P2 是什麼類型時會出現這種情況?
P1 是基本類型,P2 是引用類型(且方法內修改了 P2 所指對象的內部狀態,而非重新賦值 P2 本身)。
param = new Object()) → 不影響外部引用。param.setXxx(), param.add()) → 影響外部對象。public class ParamPassingDemo {
public static void main(String[] args) {
// 基本類型
int p1 = 1; // V1
// 引用類型:StringBuilder (可變對象)
StringBuilder p2 = new StringBuilder("V2");
method(p1, p2);
System.out.println("p1 = " + p1); // 輸出 1 (V1) - 未改變
System.out.println("p2 = " + p2); // 輸出 V2V4 - 內部狀態被修改
}
static void method(int p1, StringBuilder p2) {
p1 = 3; // 修改副本,外部無影響
p2.append("V4"); // 修改對象內部狀態,外部可見!
// p2 = new StringBuilder("V4"); // 若這樣寫,外部 p2 不變
}
}
| 變量 | 題目現象 | 推斷類型 | 關鍵操作 |
|---|---|---|---|
| P1 | 方法後保持 V1 不變 | 基本類型 (int, long, boolean 等) | 方法內賦值 P1 = V3 只改副本 |
| P2 | 方法後變為 V4 | 引用類型且為可變對象 (StringBuilder, List, Map, 自定義類) | 方法內調用修改狀態方法 (如 append, add, setXxx) |
String p2 = "V2";
method(p2);
// 方法內 p2 = "V4" 或 p2 += "V4" 都會創建新對象,外部 p2 仍為 "V2"
// 所以 String 不會出現題目現象
int vs StringBuilder/ArrayList/自定義 Bean。int[] 或 AtomicInteger,或返回新值賦值。這道題考察的不是語法,而是對內存模型(棧/堆)與參數傳遞本質的理解,是區分初中級 Java 開發者的分水嶺。