首页 /  技术专区  /  Java 宽屏模式 >

java中的值传递和引用传递

今天,在研究值传递和引用传递的时候,突然发现了这个问题,以前都是理解值传递就是复制一个值过去,引用传递就是传地址,现在看来当时的理解真的是太片面了。

简单理解一句话:java只有值传递。

我们先来了解一下什么是值传递和引用传递。

值传递:

@Test
public void demo(){

    int age = 999;

    System.out.println(age);
    setAge(age);
    System.out.println(age);
}

public void setAge(int age){
    age = 123;
    System.out.println("setAge方法中的age:" + age);
}

运行结果:image.png

我们可以看到,在方法里面的变量的值已经修改了,但是并没有影响到外层的age,这个就是值传递,java基本数据类型都为值传递(int、long、char、byte、float、double、short、boolean)。

我们用一张图来简单描述一下:

image.png

值传递相当于把age复制了一份,在相当于在内存中又开辟了一块空间来存储,在方法中修改了age(备份)是修改的备份的age,所以对本体的age没有影响。

引用传递:

@Test
public void demo3(){

    int[] arr = {1, 2, 3};

    System.out.println(arr[0]);
    setArr(arr);
    System.out.println(arr[0]);
}

public void setArr(int[] arr){
    arr[0] = 999;
    System.out.println("setArr方法中的arr[0]:" + arr[0]);
}

输出结果:

image.png

我们看到,引用数据类型在方法内修改之后,方法外的值也发生了改变。String、类、数组这些都属于引用数据类型。

图解:

image.png

引用类型,相当于拷贝过去地址,地址在堆中实际是一块内存,所以二者操作的是同一内存,在方法中修改,方法外面也会改变。





头像
0/200
图片验证码