this关键字
1.作用:
用于调用本类的成员(变量、方法),区分局部变量和成员变量的重名,this修饰的变量用于指代成员变量
2.在局部变量中,若局部变量和成员变量同名,不带this修饰变量指的是形参变量,带this修饰变量指的是成员变量
3.为了见名之意,将上述代码中局部变量与成员变量改为一样的名字,在用局部变量给成员变量赋值时,用this指明谁是成员变量
4.this代表所在类的对象引用(即对象的地址)。方法被哪个对象调用,this就代表哪个对象
示例:
学生类:
测试类:
this内存图:
代码在内存中运行的步骤:
<1>首先有main方法的调用进入栈内存
<2>声明Student类型的s1变量进入栈内存
New Student 创建一个Student类的实例对象,在堆内存中开辟空间产生地址,成员变量也会存入堆内存,且成员变量有默认初始值
<3>堆内存中开辟的空间地址返回给栈内存告诉s1
<4>打印双引号内文字
<5>打印s1的地址
<6>s1.setName(“张三”) 将setName方法加载到栈内存,方法中的局部变量(形式参数)接收到“张三”。
<7>因为此方法被s1调用,所以方法中的this就指的是s1这个对象,s1又记录的是对象在堆内存中的地址。所以打印this,输出的就是s1对象在堆内存中的地址,和前面打印的s1的地址一样
<8>this.name指向堆内存中成员变量name的地址,this.name=name就是局部变量name值赋给成员变量,此时堆内存中成员变量默认初始化值改为了“张三”。
<9>setName方法执行完毕后退出栈内存
<10>再次声明Student类型的s2变量进入栈内存
<11>New Student 创建一个Student类的实例对象,在堆内存中开辟新空间
<12>堆内存中开辟的空间地址返回给栈内存告诉s2
<13>打印双引号内文字
<14>打印s2的地址
<15>s2.setName(“李四”) 将setName方法加载到栈内存,方法中的局部变量(形式参数)接收到“李四”。
<16>因为此方法被s2调用,所以方法中的this就指的是s2这个对象。栈内存中的s2记录的是对象在堆内存中的地址。所以打印this,输出的就是s2对象在堆内存中的地址,和前面打印的s2的地址一样
<17>this.name指向堆内存中成员变量name的地址,this.name=name就是局部变量name值赋给成员变量,此时堆内存中成员变量默认初始化值改为了“李四”。
<18>setName方法执行完毕后退出栈内存
<19>主方法也退出栈内存
总运行截图:
由输出结果可以看出,方法被哪个对象调用,this就代表哪个对象。
所以调用setName 时打印this打印的就是该对象的地址