今天,在研究值传递和引用传递的时候,突然发现了这个问题,以前都是理解值传递就是复制一个值过去,引用传递就是传地址,现在看来当时的理解真的是太片面了。
简单理解一句话: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); }
运行结果:
我们可以看到,在方法里面的变量的值已经修改了,但是并没有影响到外层的age,这个就是值传递,java基本数据类型都为值传递(int、long、char、byte、float、double、short、boolean)。
我们用一张图来简单描述一下:
值传递相当于把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]); }
输出结果:
我们看到,引用数据类型在方法内修改之后,方法外的值也发生了改变。String、类、数组这些都属于引用数据类型。
图解:
引用类型,相当于拷贝过去地址,地址在堆中实际是一块内存,所以二者操作的是同一内存,在方法中修改,方法外面也会改变。