为何调用方法中赋值null不影响调用者?Java代码输出解析求助
Java值传递下的对象引用解析:为什么赋值null不影响原对象?
首先明确核心规则:Java中所有参数传递都是按值传递,对于引用类型(比如Student对象),传递的是对象引用的副本——方法参数拿到的是原引用的拷贝,和原变量是完全独立的两个变量,只是它们指向同一个对象而已。
为什么第5行打印的是Student对象而非null?
看change方法的执行流程:
- main方法中
Student s = new Student("A");:堆内存中创建一个名为"A"的Student对象,栈内存的变量s保存着指向这个对象的引用(可理解为对象在堆里的地址)。 - 调用
change(s)时,Java会把栈中s的引用值复制一份,传给change方法的参数s——这个方法内的s是局部变量,和main里的s是两个完全不同的变量,只是此刻它们指向同一个Student对象。 change方法里执行s = null;:仅将方法内的局部变量s的引用改为null,让这个局部变量不再指向任何对象,但main里的s仍保存着原来的对象引用,完全不受影响。
回到main方法后,System.out.println(s)打印的还是原来的Student对象,输出Student [name=A]。
为什么第8行打印出更新后的对象?
再看changeValue方法的执行流程:
- 调用
changeValue(s)时,同样把main里s的引用值复制一份,传给方法的参数s,此时方法内的s和main里的s指向堆中同一个Student对象。 - 执行
s.name = "B";:通过方法内的s引用找到堆里对应的Student对象,修改它的name属性为"B"——因为两个引用指向同一个对象,这个修改会直接反映到原对象上。
回到main方法后,System.out.println(s)打印的就是被修改后的对象,输出Student [name=B]。
一句话总结
- 给方法参数的引用赋值(比如
s = null):只修改方法内局部变量的引用指向,和原变量无关。 - 通过方法参数的引用修改对象属性:因为指向同一个对象,所以会影响原对象。
内容的提问来源于stack exchange,提问作者user2186831
相关产品推荐
相关产品推荐

