Skip to content

参数传递

Java 只有值传递(Pass by Value),但根据参数类型不同,表现出不同的效果。

类型传递方式说明
基本类型值传递传递副本,原值不变
引用类型值传递传递引用副本,可修改对象内容

基本类型传递

传递的是值的副本,方法内部修改不影响原值。

java
public class PrimitivePassDemo {

    public static void main(String[] args) {
        int num = 10;
        modify(num);
        System.out.println("main 中 num: " + num);  // 10,未改变
    }

    static void modify(int num) {
        num = 20;
        System.out.println("modify 中 num: " + num);  // 20
    }
}

引用类型传递

传递的是引用的副本,方法内部可以通过引用副本修改对象内容。

java
public class ReferencePassDemo {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        modify(arr);
        System.out.println("main 中 arr[0]: " + arr[0]);  // 100,改变了
    }

    static void modify(int[] arr) {
        arr[0] = 100;  // 通过引用副本修改数组
    }
}

引用不变

如果在方法内部重新赋值引用变量,只是改变了局部变量的引用副本,原引用不受影响。

java
public class ReferenceNotChangeDemo {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        reassign(sb);
        System.out.println("main 中 sb: " + sb);  // Hello,未改变
    }

    static void reassign(StringBuilder sb) {
        sb = new StringBuilder("World");  // 重新赋值,引用副本指向新对象
        // 原来的 sb 引用副本不受影响
    }
}

要点总结

  1. 值传递:Java 总是传递值的副本
  2. 引用副本:引用类型传的是引用的副本,而非引用本身
  3. 修改内容:通过引用副本可以修改对象内容
  4. 重新赋值:重新赋值引用变量不影响原引用

基于 VitePress 构建