1.为什么需要this关键字?
在定义类时,可能存在以下几种情况:
- 成员方法的形式参数名与成员变量同名;
- 构造方法的形式参数与成员变量同名;
- 成员方法中的局部变量与成员变量同名。
这不仅给阅读程序带来混淆,还可能使程序隐含错误。
例如:
原本目的:左边为成员变量,右边为形参(局部变量)。
class Person{ //定义类,类名为Person
private String name; //声明成员变量
private int age; //声明成员变量
Person(String name, int age) { //构造定义方法
name = name; //两个name都是局部变量
age = age; //两个age都是局部变量
}
}
在局部变量与成员变量同名的情况下,首先引用的是局部变量,因为Java系统按照就近原则取得变量信息,而局部变量比成员变量更加“靠近Java系统”。故按上图中"name = name ","age = age"该种形式等号两边的name和age均为形参(局部变量)。
由此可见其不仅仅给阅读程序带来混淆,且未达到初始化成员变量的目标。
这时,Java语言提出this关键字,轻松解决局部变量和成员变量同名问题。
2.this关键字的含义
this关键字是隐式参数,表示当前对象的引用。
在创建一个对象后,Java虚拟机就为该对象分配一个自身的引用this。从指针的角度来说,this就是本身对象的一个引用。
在堆内存中,除了为name和age分配空间,还有一个隐式的空间this,保存了xm对象的引用(地址)
Person xm = new Person("小明", 18);
从上图可见,this的内容和xm对象的内容是相同的,都是堆内存的首地址。可以通过this关键字引用当前对象的成员变量、成员方法和构造方法。
3.this引用成员变量
在以后的程序中,不管局部变量与成员变量是否同名,在引用成员变量时均采用this关键字。
【引用语法格式】 this.成员变量名
class Person{ //定义类,类名为Person
private String name;
private int age;
public Person(String name, int age) {
this.name; //this引用成员变量name
this.age; //this引用成员变量age
}
void setName(String name) {
this.name = name; //this引用成员变量name
}
String getName() {
return this.name; //this引用成员变量name
}
}
4.this调用构造方法
类体中的成员方法可以互相调用,采用this关键字可以实现构造方法的互相调用。
- this 调用构造方法的语法格式: this(参数列表);//该语句必须是构造方法的第一条有效语句。
class Person {//定义一个类,类名为Person
private String name;//私有化成员变量
private int age;
Person(String name) {//构造方法1
this.name = name;
}
Person(String name, int age) {//构造方法2
this(name);//构造方法第一条有效语句
this.age = age;
}
}
5.this调用成员方法
this关键字除了引用成员变量和构造方法外,还可以引用成员方法。
- this 调用成员方法的语法格式:this.成员方法名(参数列表);//表示该方法是当前对象的成员方法。
public class Person{//定义一个类,类名为Person
private void show() { }//私有化成员方法
public void display() {
this.show();//调用成员方法
}
}
6.this与对象名的关系
对象名是栈内存存储单元名,保存了堆内存的首地址;
this关键字隐式保存了当前对象的引用(地址)。