农妇山泉一亩田 发表于 2023-7-11 21:52:25

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; 此时已经改变了引用地址值内的属性;
    ⑥  打印输出结果。
 
  
  https://img2023.cnblogs.com/blog/3234883/202307/3234883-20230711205300281-1622323687.png
 
 
 
 
完 
 
  
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Java 中的值传递和引用传递 ?