8.4 this关键字
成员变量和局部变量同名的问题:
当在方法中出现了局部变量和成员变量同名的时候,可以在成员变量名前面加上this.来区别成员变量和局部变量
class Person {
private intage;
private String name;
public voidspeak() {
this.name = "小强";
this.age = 18;
System.out.println("name=" + this.name + ",age="+ this.age);
}
}
class PersonDemo {
public staticvoid main(String[] args) {
Person p = newPerson();
p.speak();
}
}
对象的内存解释:
class Person {
private intage;
public intgetAge() {
returnthis.age;
}
public voidsetAge(int age) {
this.age = age;
}
}
public class PersonDemo {
public staticvoid main(String[] args) {
Person p = newPerson();
p.setAge(30);
System.out.println("大家好,今年我" + p.getAge() + "岁");
}
}
程序执行流程:
1、先执行main方法(压栈),执行其中的 Person p = new Person();
2、在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量
3、继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,将30赋值为setAge方法中的“age”变量;执行this.age= age语句,将age变量值30 赋值给成员变量this.age为30;
4、setAge()方法执行完毕后(弹栈),回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。
this的应用:
class Person {
private intage;
private String name;
public intgetAge() {
returnage;
}
public voidsetAge(int age){
this.age = age;
}
public String getName() {
returnname;
}
public voidsetName(String name) {
this.name = name;
}
public voidspeak() {
System.out.println("name=" + this.name + ",age="+ this.age);
}
// 判断是否为同龄人
public booleanequalsAge(Person p) {
// 使用当前调用该equalsAge方法对象的age和传递进来p的age进行比较
// 由于无法确定具体是哪一个对象调用equalsAge方法,这里就可以使用this来代替
/*
* if(this.age == p.age) { return true; } returnfalse;
*/
returnthis.age== p.age;
}
}