Java 社群常爭辯參數傳值還是傳址。誤解源於兩事實並存:
兩者能共存?能! Java 從未傳遞物件本身,僅傳遞物件參考。簡單說:Java 是「傳遞參考的值」(Pass-by-value of reference)。
C++ 支援雙機制,C++ 程式設計師轉 Java 易混淆。Java 為簡化僅支援「參數傳值」。
Java 變數分基本型別與參考型別,皆為傳值。差異在於:
C++ 參考型別參數傳遞參考/位址(傳址),Java 傳遞參考副本(傳值)。此區別至關重要!
public static void swap(Integer ia, Integer ib) {
Integer temp = ia; ia = ib; ib = temp; // 僅交換區域參考副本
}
public static void swap(int li, int lj) {
int temp = li; li = lj; lj = temp; // 僅交換區域值副本
}
呼叫後原變數 a、b、i、j 均未改變,證明 Java 參數傳遞一律為傳值。
void change(StringBuffer sb) { sb.append(" ok?"); } // 修改物件內容,影響原物件
void change(int i) { i = 10; } // 修改區域副本,不影響原值
傳遞參考型別時,可修改物件內部狀態(因副本指向同一物件),但無法替換呼叫端的參考指向。這也是誤解來源之一。