一、值传递
值传递也就是基本类型数据传递,当我们把一个基本类型数据a作为某个方法的参数的时候,相当于把a拷贝一个值作为这个方法的参数,方法内部的任何操作对原始值a没有任何影响,比如:
public static void main(String[] args) {
int a = 0;
System.out.println("a前值:"+a);
change(a);
System.out.println("a后值:"+a);
}
public static void change(int a){
a= 1;
}
执行代码:
发现change方法里面对a值进行了修改,只是对a的拷贝值进行了修改,只作用于当前方法域中,对main方法里面的a值没有任何影响
二、引用传递
引用传递也叫做引用对象地址的传递,就按照大家正常的想法来理解,当我们把一个对象B作为方法A的参数传递时,方法A内部对对象B的操作,会对对象B有影响吗?先看下面一个例子。
public static void main(String[] args) {
User user = new User();
user.setName("wgl");
System.out.println("调用方法前对象user:"+user.toString());
change(user);
System.out.println("调用方法后对象user:"+user.toString());
}
public static void change(User u){
u.setName("wxs");
}
执行代码:
我们画图来分析一下:
步骤:
1、user拷贝了对象u
2、u和user指向同一个引用地址,u修改指向地址对应的内存值
3、u和user对象都发生了改变
总结:当对象user作为参数u传递给方法时,等于是把对象user拷贝了一份传递给了方法。user和u共同指向同一个内存地址。当方法内部对u进行修改时,修改了user、u共用地址所指向的内存值;
但是对于对象的赋值操作,采用=号形式时,我们可以看出来,对象的传递其实还是值传递
看下面代码:
public static void main(String[] args) {
User user = new User();
user.setName("wgl");
System.out.println("调用方法前对象user:"+user.toString());
change(user);
System.out.println("调用方法后对象user:"+user.toString());
}
public static void change(User u){
User newUser = new User();
newUser.setName("wxs");
u=newUser;
}
执行结果:
发现user的值没有发生改变,对象传递不是引用传递吗;引用的是同一个地址,为什么对u进行修改,user却没有变化呢?我们画图展示下:
change方法的调用,其实是user拷贝了u对象,他们两个公共指向name=wgl的内存地址;
当我们new了个新对象newUser,把newUser赋值给u时,其实是把u的引用地址指向了name=wxs,而没有修改user的内存值。
综上所述,我们可以知道值传递和引用传递其实都是值拷贝的过程。只有修改了内存值,才会发生改变;而=号只是把数据的指针指向了新的地址。