java中只有值传递:基本类型传数值副本,引用类型传地址副本;修改对象属性会影响实参,但让形参指向新对象则不会。

Java 中只有值传递,没有真正的引用传递。所谓“引用传递”只是对现象的误解——本质仍是把对象的地址作为值来复制传递。
基本类型:传的是数值本身的一份副本
int、char、boolean 等基本类型变量,内存中直接存值(比如 a = 5,栈里就放着数字 5)。方法调用时,JVM 把这个值拷贝一份给形参,两个变量互不干扰。
- 修改形参,不影响原始变量
- 哪怕在方法里把形参改成 100,实参还是原来的 5
- 因为它们是栈中两个独立的存储单元
引用类型:传的是对象地址的一份副本
String、ArrayList、自定义类实例等,变量实际存的是堆中对象的内存地址(比如 b 存的是 0x7fa2…)。调用方法时,JVM 同样拷贝这个地址,赋给形参——所以形参和实参指向同一个对象。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 通过形参修改对象属性(如 d.name = "张三"),实参看到的也是新值
- 但如果在方法里让形参指向新对象(如 d = new Person()),实参仍指向原对象
- 关键区别在于:改的是“地址指向的内容”,还是“地址本身”
String 和包装类是特例,但原理不变
String、Integer 等虽然属于引用类型,但它们不可变(immutable)。每次“修改”其实都生成了新对象,原引用没变。
- String s = "hello"; change(s); 方法里 s = "world" → 只是让形参指向新字符串,实参 s 还是 "hello"
- 这和 ArrayList.add() 不同:后者直接操作原对象内容,所以实参可见变化
- 不是机制特殊,而是类设计决定行为表现
一句话总结核心逻辑
Java 所有参数都是值传递;基本类型传的是数据值的副本,引用类型传的是地址值的副本。能否影响外部,取决于你操作的是副本所指向的内容,还是副本自身。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










