You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中对象引用如何传递给方法?代码示例解惑

Java方法参数传递:引用类型的"值传递"详解

Java确实只有值传递,你的核心猜测完全正确:调用方法时,引用类型传递的是「指向同一对象的引用副本」——也就是两个独立的指针变量,但指向同一个内存中的对象。下面结合你的代码拆解具体逻辑:

你的代码运行结果分析

先看这段代码的实际输出:两次打印都是String a,和你预期的第二次输出String b不符,原因如下:

public class test {
    static String a = "String a";
    static String b = "String b";
    
    public static void main(String[] args) {
        System.out.println(a);     // 输出 String a
        doSomething(a);
        System.out.println(a);     // 还是输出 String a
    }
    
    static void doSomething(String someString) {
        someString = b;
    }
}
  1. 变量的本质:a和b都是引用变量,它们存储的是对应String对象在内存中的地址,而非对象本身。
  2. 方法调用时的传递:调用doSomething(a)时,Java会把a存储的地址值复制一份,赋值给方法的参数someString。此时a和someString是两个完全独立的变量,但它们指向同一个"String a"对象。
  3. 方法内的赋值操作:someString = b;这句话是把b存储的地址(指向"String b"的地址)赋值给someString——这只是修改了someString这个局部变量的指向,和原变量a没有任何关联,因为someString只是个副本。

对比可变对象的情况(帮助理解)

如果用可变对象(比如StringBuilder),你就能看到不同的效果,因为此时修改的是对象的内部状态,而非引用本身:

public class Test {
    static StringBuilder sb = new StringBuilder("初始内容");
    
    public static void main(String[] args) {
        System.out.println(sb);  // 输出 初始内容
        modifySb(sb);
        System.out.println(sb);  // 输出 初始内容+新增内容
    }
    
    static void modifySb(StringBuilder someSb) {
        someSb.append("+新增内容"); // 修改的是对象内部状态,而非引用指向
    }
}

这里因为someSb是sb的引用副本,指向同一个StringBuilder对象,所以修改对象内部的内容会影响原变量sb的输出,但如果在方法里执行someSb = new StringBuilder("新对象");,原变量sb的指向依然不会改变。

核心结论

  • 基本类型:传递的是值的副本,方法内修改副本不会影响原变量。
  • 引用类型:传递的是引用(内存地址)的副本:
    • 若方法内修改引用副本的指向(比如你的代码里someString = b;),不会影响原变量的引用指向。
    • 若方法内通过引用副本修改对象的内部状态,原变量指向的对象会同步变化,因为两个引用指向同一个对象。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:05:12