java只有值传递:基本类型传数值副本,引用类型传地址副本;改对象属性生效因地址相同,但重新赋值对象不影响外部。

先说结论:Java 里没有引用传递,只有值传递
很多初学者一听到“对象传进去能改内容”,就以为是引用传递。其实不是——Java 所有参数,一律是值传递。区别只在于:“值”是什么:基本类型传的是数字本身(比如 10),引用类型传的是地址本身(比如 0x7a8b1c)。这个地址,也是个“值”,所以照样是拷贝一份给你。
用两个小实验看懂本质
实验一:改基本类型,外面不变
- main 里定义
int x = 5,调用change(x) - 方法里把形参改成
100,打印出来是100 - 但 main 里再打印
x,还是5 - 原因:传进来的是
5的副本,改副本不影响原变量
实验二:改对象属性,外面跟着变;但换对象,外面没反应
- main 里
Dog d = new Dog("旺财"),调用rename(d) - 方法里写
d.name = "来福"→ 外面的狗名字真变成了“来福” - 但如果方法里写
d = new Dog("大黄")→ 外面的d还指着“旺财”,完全没变 - 原因:传进来的是“旺财”的地址副本;你用它改名字,等于用钥匙开了同一扇门;但你拿新钥匙(新地址)去开另一扇门,原钥匙不受影响
一句话记住关键点
Java 不传“东西”,只传“东西在哪”。
传基本类型 → 传“数字几”;
传对象 → 传“对象在内存里的门牌号”。
而这个“门牌号”,本身也是个值,所以照样复制一份给你——这正是值传递。
开发中要注意什么
- 别指望在方法里
new一个新对象,就能让调用方变量指向它 - 想让外部看到新对象?要么返回新对象,让调用方自己重新赋值;要么用包装类或容器(如
AtomicReference、List)间接操作 - 修改对象字段(如
list.add()、person.age = 25)是安全且生效的,因为用的是同一个地址
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











