形参和实参共享堆内存地址,修改对象属性会影响实参;但重新赋值形参仅改变其栈中地址,不影响实参。

因为形参和实参指向堆内存中同一个对象,修改属性就是直接操作那个对象本身。
栈里存的是地址,不是对象本身
变量(包括形参和实参)在栈中只保存一个数值——对象在堆内存中的地址。比如实参 person 栈中存的是 0x7a1f,调用方法时,形参 p 的栈空间也复制了这个 0x7a1f。两者地址相同,自然访问的是堆里那一个 Person 实例。
修改属性 = 直接改堆里的数据
执行 p.name = "Tom" 时,JS 或 Java 并不改变 p 自己的栈值,而是顺着地址 0x7a1f 找到堆中对象,把它的 name 字段覆盖成新值。实参 person 也通过同一地址读取,自然看到变化。
重新赋值形参 ≠ 修改原对象
如果在方法里写 p = new Person("Jerry"),只是让形参 p 的栈值变成新地址(如 0x9b3c),而实参 person 的栈值仍为 0x7a1f,两者从此互不影响。
- ✅ 共享地址 → 改属性 → 外部可见
- ❌ 替换形参地址 → 不动实参地址 → 外部无感知











