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; } }
- 变量的本质:
a和b都是引用变量,它们存储的是对应String对象在内存中的地址,而非对象本身。 - 方法调用时的传递:调用
doSomething(a)时,Java会把a存储的地址值复制一份,赋值给方法的参数someString。此时a和someString是两个完全独立的变量,但它们指向同一个"String a"对象。 - 方法内的赋值操作:
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
相关产品推荐
相关产品推荐

