一、为什么要用this关键字
我们先写不用this关键字的代码:
Student类:
package 封装;
public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public String getName() {
return name;
}
public void setAge(int a) {
if (a < 0) {
System.out.println("您输入的年龄有误!!!");
return;
}
age = a;
}
public int getAge() {
return age;
}
public void show() {
System.out.println("name=" + name + ", " + "age=" + age);
}
}
main类:
package 封装;
public class class_1 {
public static void main(String[] args){
Student student=new Student();
student.setName("奥特曼");
student.setAge(18);
student.show();
}
}
输出:
name=null, age=18
此时name等于null,使用setName并没有把"奥特曼"传进去
这是因为Student类中的name=name,这两个name都是setName这个方法的局部变量,成员变量的内容可以被show方法输出,而局部变量的不可以,所以要把“奥特曼”传到成员变量才可以
此时修改代码:
修改Student类中setName方法中的name = name;
改为this.name = name;
输出为:
name=奥特曼, age=18
二、this用法总结
this可以指代一个变量,变量被指代之后,这个变量就是成员变量
setName被s1调用那么this代表的就是s1这个对象
setName被s2调用那么this代表的就是s2这个对象
三、this的内存原理
第一步:
首先执行main方法,main方法进栈,进栈之后创建了第一个对象s1
第二步:
s1调setName方法,setName 方法进栈
第三步:
在setName方法中有一个形参name,他的值是我们传递过来的林青霞
第四步:
这个方法是被s1调用的,所以调用者是s1,s1的地址是001
第五步:
这个时候在setName方法中有一个this,这个this就是s1
第六步:
this通过001访问到堆内存的空间
第七步:
然后name就找到了001的name
第八步:
最后把参数“林青霞”赋值给this.name,也就是修改name的值为“林青霞”
第九步:
调用完setName方法,setName就从栈内存里消失
第十步:
然后创建第二个对象,堆内存多了第二个对象
第十一步:
s2的修改name方式与s1相同
第十二步:
最后main方法执行完毕从栈内存消失,留下这两个