Java 值转递?引用传递?

常见的情况

当我们向方法中传递参数的时候,有时会向方法里传递基本类型的数据,可能会传递引用类型的数据。
在方法里可能会对这个传递参数进行修改,但是不知道会不会对方法外的值造成影响。
通过以下例子则可以完全不再困惑。

/**
 * 值传递和引用传递
 */
public class Test {

    public static void main(String[] args) {

        int a = 1;
        StringBuilder stringBuilder = new StringBuilder();

        change(a);
        System.out.println(a);//输出为1

        change(stringBuilder);
        System.out.println(stringBuilder);//输出为1
    }

    public static void change(int a) {
        a = 2;
    }

    public static void change(StringBuilder stringBuilder) {
        stringBuilder.append("1");//对stringBuilder指向的内存修改
        stringBuilder = null;//对这个地址修改,对外部的stringBuilder无效
    }

}

定义

1、值传递
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
2、引用传递
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

结论

java中只有值传递
如果方法传递的参数是基本数据类型,则真正传入的是这个基本数据的数值拷贝,方法里的任何操作都不会影响方法外的值。
如果方法传递的参数是引用类型,则传入的是这个引用类型指向堆内存地址的拷贝,如果在这个方法里对这个拷贝地址指向的内存区域有所改变,则会影响方法外的引用变量的改变;如果是修改这个拷贝地址的指向,则不会对方法外的变量生效。

posted @ 2020-11-24 14:21  刃牙  阅读(100)  评论(0编辑  收藏  举报