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; 此时已经改变了引用地址值内的属性;

    ⑥  打印输出结果。

 

  

  

 

 

 

 

完 

 

  

 

热门相关:有个人爱你很久   万古至尊   富贵不能吟   跟踪狂1/2   万古至尊