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

为何调用方法中赋值null不影响调用者?Java代码输出解析求助

Java值传递下的对象引用解析:为什么赋值null不影响原对象?

首先明确核心规则:Java中所有参数传递都是按值传递,对于引用类型(比如Student对象),传递的是对象引用的副本——方法参数拿到的是原引用的拷贝,和原变量是完全独立的两个变量,只是它们指向同一个对象而已。

为什么第5行打印的是Student对象而非null?

看change方法的执行流程:

  1. main方法中Student s = new Student("A");:堆内存中创建一个名为"A"的Student对象,栈内存的变量s保存着指向这个对象的引用(可理解为对象在堆里的地址)。
  2. 调用change(s)时,Java会把栈中s的引用值复制一份,传给change方法的参数s——这个方法内的s是局部变量,和main里的s是两个完全不同的变量,只是此刻它们指向同一个Student对象。
  3. change方法里执行s = null;:仅将方法内的局部变量s的引用改为null,让这个局部变量不再指向任何对象,但main里的s仍保存着原来的对象引用,完全不受影响。
    回到main方法后,System.out.println(s)打印的还是原来的Student对象,输出Student [name=A]。

为什么第8行打印出更新后的对象?

再看changeValue方法的执行流程:

  1. 调用changeValue(s)时,同样把main里s的引用值复制一份,传给方法的参数s,此时方法内的s和main里的s指向堆中同一个Student对象。
  2. 执行s.name = "B";:通过方法内的s引用找到堆里对应的Student对象,修改它的name属性为"B"——因为两个引用指向同一个对象,这个修改会直接反映到原对象上。
    回到main方法后,System.out.println(s)打印的就是被修改后的对象,输出Student [name=B]。

一句话总结

  • 给方法参数的引用赋值(比如s = null):只修改方法内局部变量的引用指向,和原变量无关。
  • 通过方法参数的引用修改对象属性:因为指向同一个对象,所以会影响原对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:55:20