这里的关键是,传递的参数的作用范围。
传递的参数“值” 会在 函数当前运行栈上 复制一份。所有的 操作和赋值 都是对那个 参数“值”副本 进行的。操作能够 改变成员变量,因为参数“值”副本 是一个 地址,能够正确指向成员变量的位置。而赋值 则根本没用,因为只是改变了当前函数栈内 参数“值”副本 的内容,而没有改变上一层函数栈内的 对应“值”。
这里涉及到的基本功常识为:
1. 每个Thread有自己的 运行栈。Stack
2. 每次函数调用,运行栈顶部上都会为 该函数调用 分配一个Stack Frame. 这也称为Context.
3. 函数调用结束,栈指针回到上一级函数调用的Context, Stack Frame, 刚才分配的顶部Stack Frame 就失效。上一级函数成为当前Stack Frame, Context。
4. 每次函数调用, 参数都会 压栈 压入运行栈。注意,这是非常重要的。
5. 压入运行栈内的 参数,是 Copy 了一份。注意,这也是非常重要的。所以,对参数 赋值,对上一级函数调用来说,是根本没有意义的。
因为只是改变了顶部Stack Frame里面 参数Copy的内容,根本不对上一级 Stack Frame 造成任何影响。