Java 参数传递机制解析 Java 参数传递机制解析Java 只有值传递Pass by Value没有引用传递示例代码publicclassParameterPassing{publicstaticvoidmain(String[]args){inta5;modifyPrimitive(a);System.out.println(After modifyPrimitive: a);// 输出: 5MyObjectobjnewMyObject();obj.value10;modifyObject(obj);System.out.println(After modifyObject: obj.value);// 输出: 20resetReference(obj);System.out.println(After resetReference: obj.value);// 输出: 20}publicstaticvoidmodifyPrimitive(intnum){num10;// 仅仅修改了副本不影响原始变量}publicstaticvoidmodifyObject(MyObjectobj){obj.value20;// 修改了对象的属性会影响原始对象}publicstaticvoidresetReference(MyObjectobj){objnewMyObject();// 修改的是引用的副本不影响原始对象obj.value30;}}classMyObject{intvalue;}Case 1基本类型传递inta5;modifyPrimitive(a);System.out.println(a);// 输出 5main 栈帧 modifyPrimitive 栈帧 ┌─────────┐ ┌─────────┐ │ a 5 │ ───► │ num 5 │ ← 复制了一份 └─────────┘ │ num 10│ ← 只改了副本 └─────────┘结论传入的是值的拷贝方法内修改不影响外部的aCase 2修改对象属性MyObjectobjnewMyObject();obj.value10;modifyObject(obj);System.out.println(obj.value);// 输出 20main 栈帧 堆内存 ┌──────────────┐ ┌──────────────┐ │ obj ─────────┼─────────────►│ value 10 │ └──────────────┘ └──────┬───────┘ │ obj.value 20 modifyObject 栈帧 │ 修改的是堆中同一个对象 ┌──────────────┐ ┌──────▼───────┐ │ obj(副本)────┼─────────────►│ value 20 │ └──────────────┘ └──────────────┘结论传入的是引用的拷贝但两个引用指向同一个堆对象所以通过副本修改属性原对象也会变Case 3重新赋值引用resetReference(obj);System.out.println(obj.value);// 输出 20不是 30main 栈帧 堆内存 ┌──────────────┐ ┌──────────────┐ │ obj ─────────┼─────────────►│ value 20 │ ← main 的 obj 始终指向这里 └──────────────┘ └──────────────┘ resetReference 栈帧 ┌──────────────┐ ┌──────────────┐ │ obj(副本) ┼──────────X │ value 20 │ │ │ │ └──────────────┘ │ ▼ │ ┌──────────────┐ │ 重新指向 ───┼─────────────►│ value 30 │ ← new MyObject()新对象 └──────────────┘ └──────────────┘ 方法结束后这个新对象直接被 GC结论obj new MyObject()只是让副本引用指向了新对象main 中的obj完全不受影响三种情况总结情况传递的内容能否影响原值基本类型值的拷贝❌ 不能对象修改属性引用的拷贝同一对象✅ 能对象重新赋值引用的拷贝断开连接❌ 不能一句话总结Java 传递的永远是副本。基本类型副本是值对象副本是引用地址。你可以通过地址修改房间里的家具属性但你无法让别人搬去另一套房子重新赋值引用。