假如在一个类中使用变量表示年龄时,构造方法中使用的是pAge,成员变量使用的是age,这样程序的可读性很差。这时我们将一个类中表示年龄的变量进行统一的命名,例如都声明为age,但这样做又会导致另一个新的问题:成员变量和局部变量的名字冲突,在方法中无法访问成员变量age。所以为了解决这个问题,Java中提供了一个关键字 “this” 来指代当前对象,用在方法中访问对象的其他成员。
指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)
例如:
class Person{
int age;
public Person(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
上面的代码中,构造方法的参数被定义为age,它是一个局部变量,在类中还定义了一个成员变量,名称也是age。在构造方法中如果使用"age",则是访问局部变量,但如果使用"this.age"则是访问成员变量(属性)。
用来访问本类的成员方法
例如:在下面的 “speak()” 方法中,使用this关键字调用 “openMouth()” 方法。
class Person{
public void openMouth(){
...
}
public void speak(){
this.openMouth();
}
}
注意,此处的this关键字可以省略不写,也就是在上面的代码中,“this.openMouth()” 与 "openMouth()"的效果是完全一样的。
访问本类的构造方法
构造方法是在实例化对象时被Java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在一个构造方法中使用 “this([参数 1, 参数 2…])” 的形式来调用其他的构造方法。
例如:
class Person{
public Person(){
System.out.println("无参的构造方法被调用了");
}
public Person(String name){
this(); //调用无参构造方法
System.out.println("有参的构造方法被调用了");
}
}
public class t{
public static void main(String[] args){
Person p = new Person("coco"); //实例化对象
}
}
Console:
无参的构造方法被调用了
有参的构造方法被调用了
在实例化Person对象时,调用了有参的构造方法,在该方法中通过 this() 调用了无参的构造方法,因此运行结果中显示两个构造方法都被调用了。
在 this 调用构造方法注意的点:
定义Person类,里面有name、age属性,并提供compareTo比较方法,用于判断是否和另一个人相同,提供类用于测试,名字和年龄完全一样就返回true,否则就返回false。
代码实现:
public class Test{
public static void main(String[] args){
Person p1 = new Person("mary",20);
Person p2 = new Person("mary",30);
System.out.println("p1和p2比较的结果:" + p1.compareTo(p2));
}
}
class Person{
String name;
int age;
//构造器
public Person(String name,int age){
this.name = name;
this.age = age;
}
//compareTo比较方法
public boolean conpareTo(Person p){
// if(this.name.equals(p.name) && this.age == p.age){
// return true;
// } else {
// return false;
// }
return this.name.equals(p.name) && this.age == p.age;
}
}
Console:
p1和p2比较的结果:false