java是引用传递还是值传递

在 Java 中,所有参数传递都是值传递(pass by value),但具体行为因数据类型(基本类型 vs. 引用类型)而有所不同。以下是详细解释:

1. 基本类型:值传递

  • 定义:传递的是基本类型值的副本。
  • 行为:方法内部对参数的修改不会影响原始变量。
  • 示例
    public static void main(String[] args) {
        int num = 10;
        modify(num);
        System.out.println(num); // 输出 10(未被修改)
    }
    
    public static void modify(int n) {
        n = 20; // 修改的是副本,不影响原变量
    }
    

2. 引用类型:引用的值传递

  • 定义:传递的是对象引用的副本(即内存地址的拷贝)。
  • 行为
    • 修改对象状态:方法内部通过引用修改对象的状态(如属性),会影响原始对象
    • 重新赋值引用:方法内部将引用指向新的对象,不会影响原始引用
  • 示例
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        modify(sb);
        System.out.println(sb); // 输出 "Hello World"(状态被修改)
    
        changeReference(sb);
        System.out.println(sb); // 输出 "Hello World"(引用未被改变)
    }
    
    public static void modify(StringBuilder builder) {
        builder.append(" World"); // 修改对象状态
    }
    
    public static void changeReference(StringBuilder builder) {
        builder = new StringBuilder("New"); // 引用指向新对象,不影响原引用
    }
    

3. 关键结论

  • Java 没有引用传递(pass by reference),只有值传递。
  • 对于引用类型
    • 传递的是引用的值(即内存地址的拷贝)。
    • 方法内部可以通过引用修改对象的状态,但无法改变原始引用的指向。
  • 类比
    • 传递基本类型:int a = 5; 传递的是 5 的拷贝。
    • 传递引用类型:StringBuilder sb; 传递的是 sb 存储的地址的拷贝。

4. 图解说明

  • 基本类型传递

    原始变量:num = 10
    方法参数:n = 10(拷贝)
    修改 n 为 20 → 原始 num 仍为 10
    
  • 引用类型传递

    原始引用:sb → 地址 0x123(指向 "Hello" 对象)
    方法参数:builder → 地址 0x123(拷贝)
    修改 builder.append() → 修改地址 0x123 处的对象
    重新赋值 builder → 地址变为 0x456(新对象),但原始 sb 仍指向 0x123
    

总结

  • Java 始终是值传递,但引用类型的值传递会让人产生“引用传递”的错觉。
  • 理解这一机制的关键在于区分“修改对象状态”和“修改引用指向”的不同。
posted @ 2025-07-14 10:44  2一念轮回2  阅读(50)  评论(0)    收藏  举报