先下定义,java的参数传递机制为值传递。但是为什么在方法中基本数据类型,和引用数据类型会产生两种不同的效果。看如下代码
public class ParamPass2 {
public static void main(String[] args) {
ParamPass2 p = new ParamPass2();
User user = new User();
user.setName("张三");
user.setAge(18);
System.out.println("pass方法调用前,user=" + user.toString());
p.pass(user);
System.out.println("pass方法调用后,user=" + user.toString());
}
public void pass(User user) {
user.setName("李四");
System.out.println("pass方法中,user = " + user.toString());
}
}
此时在调用完pass方法之后,user的name值会发生变化。
再看如下代码
public class ParamPass1 {
public static void main(String[] args) {
ParamPass1 p = new ParamPass1();
int i = 10;
System.out.println("pass方法调用前,i的值为=" + i);
p.pass(i);
System.out.println("pass方法调用后,i的值为=" + i);
}
public void pass(int i) {
i *= 3;
System.out.println("pass方法中,i的值为=" + i);
}
}
此时的i值却不会发生变化。
这是为什么?
我的理解是由于他们的存放的位置造成的。
局部变量i是基本数据类型,他的变量名和变量值存放在方法栈中(全局变量是存放在堆中的,因为new出来的对象是存在在堆中的。),当传入方法时,会把i值复制一份,所以它传入的是数值10,经过处理后,不会影响到i。
但是引用类型变量,引用是放在栈空间的,存放的内容为引用和地址值,实际的对象是存放在堆空间中的,地址指向堆中的对象,这时就会发现,它并没有将对象复制,而是将地址复制,所以拥有两个相同地址的引用操作实际对象时都会使对象发生改变。所以当引用数据类型作为参数传递的时候,传递的是将地址传到了方法中,这和基本数据类型其实是一样的。所以导致了引用数据类型会使对象发生变化,而基本数据类型的值则不会发生变化。
总结来说,基本数据类型是将基本数据类型的值传入到方法中,而引用类型数据是将地址值传入到了方法中,两个相同的地址,肯定指向的是同一个对象,所以都会影响堆中的对象,最终导致引用类型数据进入方法后发生了改变。



