欢迎访问宙启技术站
智能推送

Java函数参数 - 传递值和引用

发布时间:2023-06-23 17:31:54

Java函数参数的传递方式可以按值传递或按引用传递,这两种传递方式的区别及应用场景需要我们了解。

按值传递

按值传递意味着函数中对参数的任何修改都不会影响到函数外部的变量。Java的基本类型变量都是按值传递传递的。例如:

public static void main(String[] args) {
    int x = 3;
    changeValue(x);
    System.out.println(x);
}
public static void changeValue(int value) {
    value = 5;
}

运行结果为3,因为函数changeValue中的value是参数变量,传递后相当于建立了另一个副本,对参数的修改不会影响到变量x的值。

按引用传递

按引用传递意味着函数中对参数的修改会反映在函数外部的变量上。Java的对象变量是按引用传递传递的。例如:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(3);
    changeValue(list);
    System.out.println(list.get(0));
}
public static void changeValue(List<Integer> value) {
    value.set(0, 5);
}

运行结果为5,因为函数changeValue中的value是对象变量,传递后相当于传递了该对象的引用,对参数的修改会反映在原对象上。

需要注意的是,在按引用传递时,对参数的重新赋值不会反映在原对象上。例如:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(3);
    System.out.println(list.get(0));
    changeValue(list);
    System.out.println(list.get(0));
}
public static void changeValue(List<Integer> value) {
    value = new ArrayList<>();
    value.add(5);
}

运行结果为3和3,因为函数changeValue中的value被重新赋值后指向了一个新的对象,原对象并未受到影响。

应用场景

按值传递适用于基本类型变量传递和无需修改参数的情况。

按引用传递适用于对象变量传递和需要修改参数的情况。

在实际开发中,按引用传递也有可能导致错误,比如在函数中修改了参数对象的值可能会影响到其他调用该对象的地方,因此应该尽量避免滥用按引用传递。如果需要修改参数对象的值,建议将对象的修改封装成方法,以便控制操作的粒度。例如:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(3);
    changeValue(list, 5);
    System.out.println(list.get(0));
}
public static void changeValue(List<Integer> value, int newValue) {
    value.set(0, newValue);
}

运行结果为5,这种方式将修改操作封装到了changeValue方法中,避免了对参数的重新赋值。