Java只有值传递:基本类型传副本,修改不影响原值;引用类型传地址副本,可改对象内容但不能改变原引用指向。应避免重赋引用、善用return、命名清晰、职责单一。

Java 中只有值传递,这个底层事实直接影响你每次写方法时的逻辑设计。理解它不是为了应付面试,而是避免改了参数却没生效、或以为改了对象引用结果外面变量还指着老地方这类典型问题。
基本类型传参:别指望方法里改数值能影响外面
整型、布尔、字符这些类型,传进去的就是一个实实在在的数字副本。你在方法里给形参重新赋值,等于在另一个盒子里换了个数,和原来的盒子毫无关系。
- 想交换两个 int 变量?不能靠写个 swap(int a, int b) 方法实现,得靠返回值、数组包装,或者直接在调用处操作
- 方法需要修改原始数值,比如要“把输入的年龄加一并返回新值”,就该用 return age + 1,而不是试图在方法内改形参
- 调试时发现“明明在方法里设了 a = 100,出来还是旧值”,先确认是不是基本类型——大概率就是值传递在起作用
引用类型传参:能改对象内容,但改不了谁指向谁
传的是引用变量里的地址值(比如 0x7f8a),这个地址被复制了一份传进方法。副本和原变量都指向堆里同一个对象,所以通过它修改对象字段(如 user.setName("张三"))会生效;但如果你在方法里让形参指向新对象(如 u = new User()),原变量仍指着原来的对象。
- 常见误操作:在方法开头写 list = new ArrayList(),以为清空了外面的 list——其实只是让形参换了地方,外面的 list 还在原地
- 安全做法:要清空列表,用 list.clear();要替换内容,用 list.addAll(newData);这些是操作对象本身,不是重赋引用
- 如果真需要让调用方拿到新对象(比如构建并返回一个修改后的 DTO),就老老实实 return newObj,别试图在方法里“替掉”实参变量
写方法时的三个实用习惯
把值传递机制转化成日常编码直觉,靠的是形成条件反射式的写法。
立即学习“Java免费学习笔记(深入)”;
- 形参命名不和实参重复:避免像 void process(User user) 里又写 User user = new User(),容易混淆作用域和归属
- 方法职责单一且明确:如果方法既想读对象状态,又想换掉整个对象,说明它承担了太多事——拆成“读取+构造+赋值”三步更可控
- 对不可变对象保持敏感:String、LocalDateTime 等一旦创建就不能改内部状态,传进去再怎么调方法都不会改变原变量指向的内容,这点和可变对象行为一致,但效果上更“安全”


















