首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

破除 Java 迷思:參數傳遞是傳值而非傳址

     編輯:Java 相關知識

Java 社群常爭辯參數傳值還是傳址。誤解源於兩事實並存:

  1. 物件以參考傳遞
  2. 參數傳遞機制為傳值

兩者能共存?能! Java 從未傳遞物件本身,僅傳遞物件參考。簡單說:Java 是「傳遞參考的值」(Pass-by-value of reference)。

定義釐清

  • 傳值:方法接收原始值副本,修改參數僅影響副本,原值不變
  • 傳址/傳參考:方法接收記憶體位址,修改參數影響原始物件

C++ 支援雙機制,C++ 程式設計師轉 Java 易混淆。Java 為簡化僅支援「參數傳值」。

關鍵差異

Java 變數分基本型別與參考型別,皆為傳值。差異在於:

  • 基本型別:傳遞值的副本
  • 參考型別:傳遞參考的副本(非參考本身)

C++ 參考型別參數傳遞參考/位址(傳址),Java 傳遞參考副本(傳值)。此區別至關重要!

反證範例:swap 方法

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 參數傳遞一律為傳值。

易混淆點:修改物件內容 vs 修改參考

void change(StringBuffer sb) { sb.append(" ok?"); } // 修改物件內容,影響原物件
void change(int i) { i = 10; } // 修改區域副本,不影響原值

傳遞參考型別時,可修改物件內部狀態(因副本指向同一物件),但無法替換呼叫端的參考指向。這也是誤解來源之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved