Java 中的值传递和引用传递 ?
一. 介绍
值传递:值传递(Pass-by-Value)当我们向方法传递参数时,实际上是将该参数的值进行拷贝,并将拷贝后的值传递给方法内部。在方法内部对参数进行修改不会影响原始变量的值。
引用传递:引用传递(Pass by reference)是指方法调用时实参(即传入方法的参数)是一个对象的引用,而不是对象本身。当一个对象的引用被传递给一个方法时,方法内部对该引用的操作会影响到原始对象。
public static void main(String[] args) { int value = 10; StringBuilder reference = new StringBuilder("Hello"); // 值传递 changeValue(value); System.out.println("Value after method call: " + value); // 引用传递 changeReference(reference); System.out.println("Reference after method call: " + reference); } public static void changeValue(int number) { number = 20; } public static void changeReference(StringBuilder str) { str.append(" World"); } // 输出结果: Value after method call: 10 Reference after method call: Hello World
二. 执行过程:
值传递:
- 首先,在调用方法时,将实际参数的值复制一份,并将这份副本传递给方法进行操作。
- 在方法内部,这个副本的值被赋给一个新的局部变量。
- 在方法执行过程中,对该局部变量的任何改动都不会影响原始的变量,因为它们指向的是不同的内存空间。
- 当方法执行完毕后,这个局部变量和方法的栈帧都会被销毁,而原始的变量的值保持不变。
基本数据类型的传递过程中,传入的值被复制到方法内部,并在方法内部进行操作,但不会影响原始变量的值。
引用传递:
- 创建一个对象并将其引用赋值给一个变量。
- 将这个变量作为参数传递给一个方法。
- 在方法内部,参数变量接收到了对原始对象的引用。
- 在方法内部修改参数变量所指向的对象时,原始对象也会受到影响。
- 方法执行完毕后,返回到原始调用处,可以通过原始变量访问到被修改后的对象。
对象的引用传递意味着传递的是对象的引用,通过引用可以访问和修改原始对象的属性。
三. 扩展
引用类型传递:
public class User { private String name; private int age; // 略:构造方法、getter、setter、toString() 等 } public class Main { public static void main(String[] args) { // 创建一个实体对象, 存储在堆内存中。 User user = new User("小明", 18); System.out.println(method(user)); System.out.println(user); } //创建一个method(),将实体参数传入 public static User method(User user) { user.setName("小美"); user.setAge(20); return user; } } 输出结果: User{name='小美', age=20} User{name='小美', age=20}
① 在栈中分配内存空间,创建一个名为 "user" 的引用变量;
② 在堆中分配内存空间,创建一个 User 类的实例对象,并将其地址赋值给 "user" 引用变量。
③ 调用 User 类的构造方法,传入参数 "小明" 和 18,初始化实例对象的属性值。
④ method() 方法进栈,并传递user变量的引用地址值作为参数。
⑤ 进入方法体中,执行setter 方法,改变user变量中的属性值,user.setName("小美"); user.setAge(20);并return user; 此时已经改变了引用地址值内的属性;
⑥ 打印输出结果。
完