一. 介绍
值传递:值传递(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; 此时已经改变了引用地址值内的属性;
⑥ 打印输出结果。

完
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |