Java 只有「傳值」一種機制,但這個值可能是基本型別的數值,也可能是物件的參考位址。理解這一點是掌握 Java 參數傳遞行為的關鍵。
基本型別(int、double、boolean 等)傳遞的是實際數值的副本,方法內修改不影響原變數。
public void badSwap(int var1, int var2) {
int temp = var1;
var1 = var2;
var2 = temp;
// 僅交換區域副本,呼叫端變數不變
}
物件傳遞的是「參考的副本」。方法內可透過此參考修改物件內容,但無法讓呼叫端的參考指向新物件。
public void tricky(Point arg1, Point arg2) {
arg1.x = 100; // 修改物件屬性:影響原物件
arg1.y = 100;
Point temp = arg1; // 僅交換區域參考變數
arg1 = arg2; // 不影響呼叫端的 pnt1、pnt2
arg2 = temp;
}
Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'
Java 以參考操作物件,但將物件參考以傳值方式傳給方法。
回調是一種雙向呼叫模式:「If you call me, I will call back」。被呼叫方在執行時會主動呼叫呼叫方提供的方法。
// 1. 回調介面
public interface CallBackInterface {
void save();
}
// 2. 實作回調邏輯的類別
public class ClassB implements CallBackInterface {
public void save() {
System.out.println("執行儲存操作!");
}
public void add() {
// 呼叫 ClassA 並傳遞自己作為回調處理者
new ClassA().executeSave(this);
}
}
// 3. 執行流程並觸發回調的類別
public class ClassA {
public void executeSave(CallBackInterface callback) {
getConn(); // 取得資源
callback.save(); // 回調:呼叫對方的 save()
release(); // 釋放資源
}
private void getConn() { System.out.println("取得資料庫連線!"); }
private void release() { System.out.println("釋放資料庫連線!"); }
}
實務上常使用匿名內部類別直接實作介面,避免建立額外類別:
new ClassA().executeSave(new CallBackInterface() {
@Override
public void save() {
System.out.println("匿名類別實作的儲存邏輯");
}
});
掌握參數傳遞本質與回調模式,能讓你設計出更靈活、解耦的 Java 架構,也是理解主流框架運作原理的基礎。