听说过 Java 中的参数传递,可知道是按值还是按引用?

126 阅读2分钟

在 Java 中,参数传递是按值进行的。这意味着无论是传递基本数据类型(如 int、double 等)还是对象引用,实际上传递给方法的都是这些值的副本。下面详细解释这两种情况:

基本数据类型 (Primitives)

当传递基本数据类型作为参数时,实际上是传递了该类型的值的副本。这意味着在方法内部对这个值所做的任何修改都不会影响到原始值。

示例代码:

public class Main {
    public static void main(String[] args) {
        int x = 10;
        changeInt(x);
        System.out.println(x);  // 输出 10,因为 x 的值没有改变
    }

    public static void changeInt(int num) {
        num = 20;  // 这里的修改只影响局部变量 num,不会影响原始的 x
    }
}

对象引用 (Object References)

当传递对象引用作为参数时,传递的是引用的副本。这意味着在方法内部,你实际上操作的是指向同一个对象的引用的副本。因此,如果修改了对象的内容,会影响到原始对象。然而,如果在方法内部重新赋值这个引用,那么原始引用不会受到影响。

示例代码:

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass(10);
        changeObject(obj);
        System.out.println(obj.getValue());  // 输出 20,因为对象的内容被改变了
    }

    public static void changeObject(MyClass object) {
        object.setValue(20);  // 修改对象的内容
        object = new MyClass(30);  // 重新赋值 object,但不影响原始引用 obj
    }
}

class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

总结

  • 基本数据类型:传递的是值的副本,因此方法内部的修改不会影响到原始值。
  • 对象引用:传递的是引用的副本,但方法内部对对象内容的修改会影响原始对象。如果重新赋值引用,原始引用不会受到影响。

注意事项

  • 传递的是引用的副本:在 Java 中,传递的是对象引用的副本,而不是对象本身的副本。这意味着你不能在方法内部创建一个完全独立的副本对象。
  • 不可变对象:对于不可变对象(如 String、Integer 等),即使传递了引用,也不能修改对象的内容,因为这些类设计为不可变的。

结论

Java 中的参数传递遵循按值传递的原则。对于基本数据类型,传递的是值的副本;对于对象引用,传递的是引用的副本。在方法内部对对象内容的修改会影响原始对象,但如果重新赋值引用,则不会影响到原始引用。