目录

​1 值传递​

​2 引用传递​

​3 结论​

​4 多个变量指向同一个对象​


1 值传递

Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。

在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

2 引用传递

引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。

在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象

3 结论

基本数据类型传值,对形参的修改不会影响实参;引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。String, Integer, Double 等 immutable(常量) 的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象

4 多个变量指向同一个对象

/**
* 测试参数传值机制
* @author 赵广陆
*
*/
public class User4 {
int id; //id
String name; //账户名
String pwd; //密码

public User4(int id, String name) {
this.id = id;
this.name = name;
}

public void testParameterTransfer01(User4 u){
u.name="张三";
}

public void testParameterTransfer02(User4 u){
u = new User4(200,"高三");
}

public static void main(String[] args) {
User4 u1 = new User4(100, "李四");

u1.testParameterTransfer01(u1);
System.out.println(u1.name);

u1.testParameterTransfer02(u1);
System.out.println(u1.name);
}
}

执行结果如图4-所示:

JAVA参数传值机制中值传递和引用传递_值传递