很多朋友都听过你的老师说JAVA只有值传递,但是根本没有理解为啥只有值传递,基本数据类型还可以理解,但是引用类型的时候就产生了疑惑,为什么我将某某对象传递给方法,但是他的值改变了,这不就违背了JAVA只有值传递的说法了么。
首先我们来理解值传递和引用传递。
简单来说:值传递,传递的是对象的复制的值,是对象的副本,方法内部无论怎么改变不会影响到方法外的对象本身。
引用传递:传递的是对象的地址,方法中对对象的改变会导致方法外的对象发生变化。
这里很多人有个理解误区,值传递很好理解,也很好证明,值传递是对对象的值说的,而引用传递是对对象的地址说的。你用值的改变来证明是引用传递这是不对的。
记住一点:是否存在引用传递的关键,就是是否能通过方法来改变实参对象的地址。
在这里我要解释下, 传递一个对象给了方法,在对象中对对象的属性做了修改,然后方法外的对象的属性也跟着做了改变
首先引用对象引用的是对象的地址。
我对声明对象做一个拆开解释
String str=new String("123");
以上代码做了2个关键步骤
1.声明引用
2.将对象的地址指向引用对象
所以拆解后的代码就是
String str;
str=new String("123");
引用对象,引用的是对象的地址。你传递参数给方法的时候,传递的是引用的拷贝。这个和基本数据类型有区别,基本数据类型拷贝的是他的值,而这里拷贝的是引用。正是因为拷贝的是引用所以在方法中2个引用指向了同一个地址,给你的错觉是传递的地址。而在方法中改变了方法中对象的引用地址的时候,方法外的引用地址不会跟随改变。这就是值传递。
下面开始贴代码,每一行我都贴了注释。
/***
* 值传递:传递的是对象的拷贝,方法内部无论怎么修改不会导致参数的本身发生变化
*
* 引用传递:传递的是地址,方法内部改变地址后,会导致原参数的地址跟随改变
*
* 理解盲区:很多人会因为看到引用对象的数值改变了以为是引用传递。
*
* 谨记一点,区分值传递还是引用传递的关键是地址是否发生改变
*
* 因此通过地址的变化来证明JAVA中不存在引用传递来帮助理解,Java中只存在值传递。
*/
public class Test {
public static String getTest(String param) {
param = new String("345"); // 改变引用对象的地址 如果是引用传递会改变原参数的地址,值传递会创建新的地址
return param;
}
public static void main(String[] args) {
String param1 = "123";// 引用对象,原地址上的对象
String result = getTest(param1);// 获得新地址返回后的对象
System.out.println("原对象的地址上的数值为" + param1 + "\n新地址上的数值为" + result);
// 通过实验证明传递的并不是对象的地址,因为对引用的地址改变之后并没有导致原参数的地址跟随一起改变
}
}