Java只有值传递:所有参数传递都是拷贝实参的值,基本类型拷贝数据,引用类型拷贝地址副本;修改对象内部状态影响外部,重赋引用本身不影响;String等不可变类型绝对安全,可变对象需防御性拷贝,可用System.identityHashCode验证同址。

Java 只有值传递——这句话必须脱口而出,但光说这句拿不到高分。面试官想听的是你能不能用三句话讲清本质、举对例子、踩准陷阱。
第一句定调:先说“传什么”,再拆“值”是什么
所有参数传递都是把实参的值拷贝一份给形参。这个“值”分两类:
• 基本类型(int、boolean等):拷贝的是真实数据,比如 5、true;
• 引用类型(String、ArrayList、自定义对象等):拷贝的是对象地址的副本,不是对象本身,也不是变量本身的内存地址。
第二句破误区:用两个典型操作对比说明“改什么才影响外部”
关键不在“传的是什么”,而在“你动的是哪一层”:
• 修改对象内部状态(如 list.add()、user.setName()、arr[0] = "x")→ 影响外部,因为地址副本指向同一块堆内存;
• 重赋引用本身(如 user = new User()、list = new ArrayList())→ 不影响外部,只改了形参栈帧里的地址值,实参还指着原来的对象。
第三句显深度:落到设计意识和验证手段
真正加分的回答会自然带出工程视角:
• 知道 String、Integer 是不可变类型,方法里任何“修改”都生成新对象,原实参绝对安全;
• 遇到可变对象(如 StringBuilder、List),若接口语义是只读,就该主动做防御性拷贝或加注释说明;
• 验证是否指向同一对象?用 System.identityHashCode(obj) 打印哈希值,相等即同址,比看 toString() 更可靠。


















