Java所有参数传递均为值传递:基本类型传数值副本,引用类型传地址副本;方法内可修改对象内容但不能改变外部变量指向,String等不可变类因自身特性无法被修改。

Java里没有“对象引用传递”这回事——所有参数传递都是值传递,区别只在于“传的是什么值”。
基本类型:传数值副本
int、char、boolean这些类型,变量本身存的就是具体数值。传参时,JVM复制这个数值,放进方法的局部变量里。改副本,不影响原变量。
- 比如
int a = 5传进方法,方法里改成了10,a还是5 - 本质:栈中两个独立空间,存着相同的数,互不干扰
引用类型:传地址副本
对象(包括数组、ArrayList、StringBuffer等)变量存的不是对象本身,而是堆内存中对象的地址。传参时,复制的是这个地址值,不是对象。
- 所以方法内通过该地址修改对象属性(如
user.name = "张三"),原对象会变 - 但若在方法内让参数指向新对象(如
user = new User()),只是改了副本的指向,原变量仍指向旧对象 - 关键点:地址副本 ≠ 对象副本,但也不是直接传地址本身(那才是引用传递)
String 和包装类:看似特殊,实则统一
它们也是引用类型,同样传地址副本。但因为不可变(immutable),任何“修改”操作(如 str.concat()、i++)实际都生成新对象,原引用不变。
立即学习“Java免费学习笔记(深入)”;
-
String s = "a"; change(s);方法里s += "b"不会影响外面的s - 不是传递方式不同,而是对象设计决定行为——值传递规则始终没变
一句话判断法
看方法内能否让**外部变量指向另一个对象**:
- 能——那是引用传递(Java不支持)
- 不能,但能改对象内容——就是值传递(传地址副本)
- 连内容都改不了(如String)——还是值传递,只是对象自己拒绝被改


















