Java 中的值传递和引用传递 ?

农妇山泉一亩田  金牌会员 | 2023-7-11 21:52:25 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 884|帖子 884|积分 2652

一. 介绍
  值传递:值传递(Pass-by-Value)当我们向方法传递参数时,实际上是将该参数的值进行拷贝,并将拷贝后的值传递给方法内部。在方法内部对参数进行修改不会影响原始变量的值。
  引用传递:引用传递(Pass by reference)是指方法调用时实参(即传入方法的参数)是一个对象的引用,而不是对象本身。当一个对象的引用被传递给一个方法时,方法内部对该引用的操作会影响到原始对象。
  1.     public static void main(String[] args) {
  2.         int value = 10;
  3.         StringBuilder reference = new StringBuilder("Hello");
  4.         // 值传递
  5.         changeValue(value);
  6.         System.out.println("Value after method call: " + value);
  7.         // 引用传递
  8.         changeReference(reference);
  9.         System.out.println("Reference after method call: " + reference);
  10.     }
  11.     public static void changeValue(int number) {
  12.         number = 20;
  13.     }
  14.     public static void changeReference(StringBuilder str) {
  15.         str.append(" World");
  16.     }
  17. // 输出结果:
  18.     Value after method call: 10
  19.     Reference after method call: Hello World
复制代码
 
二. 执行过程:
    值传递:
      - 首先,在调用方法时,将实际参数的值复制一份,并将这份副本传递给方法进行操作。
      - 在方法内部,这个副本的值被赋给一个新的局部变量。
      - 在方法执行过程中,对该局部变量的任何改动都不会影响原始的变量,因为它们指向的是不同的内存空间。
      - 当方法执行完毕后,这个局部变量和方法的栈帧都会被销毁,而原始的变量的值保持不变。
    基本数据类型的传递过程中,传入的值被复制到方法内部,并在方法内部进行操作,但不会影响原始变量的值。
    
    引用传递:
      - 创建一个对象并将其引用赋值给一个变量。 
      - 将这个变量作为参数传递给一个方法。
      - 在方法内部,参数变量接收到了对原始对象的引用。
      - 在方法内部修改参数变量所指向的对象时,原始对象也会受到影响。
      - 方法执行完毕后,返回到原始调用处,可以通过原始变量访问到被修改后的对象。
    对象的引用传递意味着传递的是对象的引用,通过引用可以访问和修改原始对象的属性。

 
三. 扩展
  引用类型传递:
  1. public class User {
  2.     private String name;
  3.     private int age;
  4. // 略:构造方法、getter、setter、toString() 等
  5. }
  6. public class Main {
  7.     public static void main(String[] args) {
  8.         // 创建一个实体对象, 存储在堆内存中。
  9.         User user = new User("小明", 18);
  10.         System.out.println(method(user));
  11.         System.out.println(user);
  12.     }
  13.     //创建一个method(),将实体参数传入
  14.     public static User method(User user) {
  15.         user.setName("小美");
  16.         user.setAge(20);
  17.         return user;
  18.     }
  19. }
  20. 输出结果:
  21.     User{name='小美', age=20}
  22.     User{name='小美', age=20}
复制代码
 
    ① 在栈中分配内存空间,创建一个名为 "user" 的引用变量;
    ② 在堆中分配内存空间,创建一个 User 类的实例对象,并将其地址赋值给 "user" 引用变量。
    ③ 调用 User 类的构造方法,传入参数 "小明" 和 18,初始化实例对象的属性值。
    ④ method() 方法进栈,并传递user变量的引用地址值作为参数。
    ⑤ 进入方法体中,执行setter 方法,改变user变量中的属性值,user.setName("小美"); user.setAge(20);并return user; 此时已经改变了引用地址值内的属性;
    ⑥  打印输出结果。
 
  
  
 
 
 
 
完 
 
  
 

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表