在 Java 里“参数丢失”通常不是 JVM 把参数吃掉了,而是我们对“参数传递”和“参数可见范围”的理解有误。下面按常见场景给你梳理一下。
void test(int a) {
a = 10;
}
int x = 1;
test(x);
// x 仍然是 1
✅ 原因:
基本类型传的是值的副本,方法内改的是副本,不影响原变量。
void test(List<String> list) {
list = new ArrayList<>();
}
List<String> l = new ArrayList<>();
test(l);
// l 还是原来的对象
✅ 原因:
对象参数传的是引用的副本:
✅ 正确改法:
void test(List<String> list) {
list.add("a");
}
for (int i = 0; i < 10; i++) {
int x = i;
}
// 外面访问不到 x
✅ 参数只在方法或代码块内有效,出了范围就没了。
void test(Integer a) {}
void test(int a) {}
test(1); // 调的是 int 版本
✅ 有时你以为是“参数丢了”,其实是调错了重载方法。
@GetMapping("/test")
public void test(String name) { } // 可能取不到
✅ 正确:
@RequestParam String name
@PathVariable String id
@RequestBody User user
@RequestBody@JsonProperty)new Thread(() -> {
// 捕获的变量必须是 final 或等效 final
});
✅ 匿名内部类 / lambda 只能捕获事实 final变量。
SerializableJava 参数不会真的“丢失”,而是:
- 值传递导致修改不生效
- 作用域/重载误解
- Web / 框架参数绑定错误
- 线程 / 序列化限制
如果你能贴一段具体代码或场景(比如 Spring、线程、RPC、重载),我可以直接帮你指出“丢在哪一步”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。