Java方法参数传递均为按值调用:基本类型传数值副本,互不影响;包装类传引用地址副本,指向同一对象,但因不可变性,赋值操作不改变原引用。

Java 中基本类型和包装类在方法参数传递时看似相似,实则逻辑不同——关键不在“是值还是引用”,而在于“传的是什么的副本”。两者都属于按值调用,但副本的内容不同,导致行为表现差异明显。
基本类型参数:传数值副本,完全隔离
基本类型(如 int、boolean)作为参数时,方法收到的是实参值的一份独立拷贝。形参的任何修改,不影响原始变量。
- 例如:
int x = 5;调用change(x),即使方法内把形参改成 100,x仍是 5 - 内存上,数值直接存于栈帧中,副本也是栈上的新空间,彼此无关联
- 不存在空指针风险,也不涉及对象生命周期问题
包装类参数:传引用地址副本,指向同一对象(但对象本身可能不可变)
包装类(如 Integer、Boolean)是引用类型,参数传递的是对象引用的副本。这个副本和原引用指向堆中同一个对象——但要注意:大多数包装类对象是不可变的(immutable)。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 比如:
Integer a = 10;传入方法后,形参也指向这个Integer实例;但一旦执行num = 20(自动装箱),其实是创建了新对象并让形参指向它,原引用仍指向旧对象 - 真正能体现“共享对象”的操作,是调用可变对象的方法(如
StringBuilder.append()),但Integer没有这类方法 - 所以表面看像“值传递”:改形参赋值不改变实参;但若方法内通过反射或特殊手段修改对象内部状态(极少见),才可能影响实参
特别注意:Integer 等缓存机制带来的“假共享”现象
Integer.valueOf(127) 和 Integer.valueOf(127) 返回的是同一个对象(-128 到 127 缓存),而 valueOf(128) 每次新建对象。这会影响 == 判断,但不改变参数传递本质。
立即学习“Java免费学习笔记(深入)”;
- 两个
Integer变量若都通过valueOf获取小整数,它们的引用可能相等;但传参时仍各自持有该引用的副本 - 不要因 == 返回 true 就误以为“引用被修改了”,这只是缓存复用的结果
- 判断相等应优先用
.equals(),避免被缓存干扰
实际开发中的建议
- 需要可变数值容器时,别硬改包装类,改用
AtomicInteger或自定义可变包装类 - 方法设计尽量接收基本类型(性能好、语义清晰),除非需表达 null(如数据库字段可能为空)
- 泛型、集合、反射等场景必须用包装类——这是语言限制,不是风格选择
- 调试时遇到“没改成功”,先确认是赋值操作(
a = ...)还是方法调用(a.set(...)),前者永远不影响实参

















