this 关键字
1 this 修饰的变量用于指代成员变量
▲方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
▲方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
2 什么时候使用 this 呢?
在 局部变量 和 成员变量 同名的时候,解决 局部变量 隐藏 成员变量 的问题
3 this:代表所在类的对象引用
▲记住:方法被哪个对象调用,this就代表哪个对象
在这里,控制台没有赋值成功。
这个 name 是局部变量
这个 name 是成员变量
而在方法中直接写 name ,它看到的只能是 局部变量这个 name ,也就是说 name = name; 参照的都是 (String name) 里的name
想把 局部变量 赋值给 成员变量 该怎么办?
用 this关键字 修改这个代码
用 this 修饰 这个 name 它指代的就是成员变量
this 内存原理
1. 程序执行从 main方法开始。(图 1)
首先main方法进入栈内存中
2,创建了第一个对象 s1
堆内存出现一块内存空间,最终的地址是 001,把 001 赋值给 s1 (图 2)
3. s1 调用 setName 方法 (图 3)
setName 方法进入栈内存
setName方法 有一个 形参 name,它的值是传递过来的 “林青霞”
这个方法是被 s1 调用的,调用者是 s1
方法中的 this 就是 s1
4. setName里面方法的执行 (图 4)
this.name = name;
this通过 001 指向堆内存的内存空间,name 找到 001这块地址的 name
最后,参数“林青霞”赋值给 this.name,也就是修改name的值为“林青霞” (图5)
5. setName 方法 调用完毕,从栈内存消失
6. 创建第二个对象 (图 6)
堆内存出现一块内存空间,最终的地址是 002,把 002 赋值给 s2
7. s2调用 setName 方法 (图 7)
方法首先加载到栈内存,这次参数 name 的值是“张曼玉”,调用者是 s2,this 是 s2
8. this.name = name; (图 8)
this通过 002 指向堆内存的内存空间,name 找到 002这块地址的 name
最后,参数“张曼玉”传递过去修改它的值
9. setName 方法 调用完毕,从栈内存消失
10. 再往下,main方法执行完毕,从栈内存消失
方法被哪个对象调用,哪个方法里面的 this就代表的是哪个对象