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

Java 參數傳遞機制深度解析:是傳值還是傳引用?

     編輯:Java 綜合教學

核心結論:Java 唯有傳值

調用方法時,參數傳遞方式直接影響方法內部操作是否影響外部變量。Java 官方文檔明確規定:Java 只有傳值(Call by Value)。但為何許多開發者誤以為對象是傳引用?關鍵在於「傳遞的是對象引用的副本」。

實驗驗證

package test;
import java.util.ArrayList;
import java.util.List;

public class ValueAndAddress {
    public static void f1(int x) { x = x + 5; }
    public static void f2(String s) { s = new String("10000"); }
    public static void f3(List<Integer> list) {
        list.remove(0); list.remove(1); list.remove(2);
    }
    public static void main(String[] args) {
        int x = 5;
        String s = new String("abcdef");
        List<Integer> list = new ArrayList<>();
        list.add(0); list.add(1); list.add(2); list.add(3); list.add(4);
        f1(x); f2(s); f3(list);
        System.out.println("x=" + x);      // 輸出 5
        System.out.println("s=" + s);      // 輸出 abcdef
        for (int i=0; i<list.size(); i++) {
            System.out.println("list[" + i + "]=" + list.get(i)); // 輸出 3,4
        }
    }
}

結果分析

  • 基本類型 (int):傳遞數值副本,方法內修改不影響原變量。
  • 不可變對象:傳遞引用副本,方法內重新賦值(new String)只改變局部引用指向,原對象不變。
  • 可變對象:傳遞引用副本,雖無法改變引用指向,但可通過副本調用方法修改對象內部狀態(如 List.remove()),外部可見。

總結

Java 永遠是傳值。對於對象,傳遞的是「引用的值(即記憶體地址)」。理解這一點,能避免在集合、自定義對象操作中產生難以排查的 Bug。

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