目录
this 关键字的作用
- 表示类中的属性
- 可使用 this 调用本类的构造方法
- this 表示当前对象
一 、this 表示本类中的属性
现有以下一个类:
class Person {
private String name;
private int age;
public Person(String n, int a) { //为类中的属性赋值
name = n; //表示将传递过来的参数 n 值 赋给类中 name 属性
age = a; //表示将传递过来的参数 a 值 赋给类中 age 属性
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo01 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
程序运行结果:
本类中的构造方法为类中的属性赋值,但构造方法传递的两个参数,从名称上很难看出 n 表示的意义或者 a 表示的意义。为了清楚地表示参数的意义,现将参数 n 的名称修改为 name ,参数 a 的名称修改为 age , 代码如下,观察其变化
class Person {
private String name;
private int age;
public Person(String name, int age) { //参数 n 的名称修改为 name, 参数 a 的名称修改为 age
name = name; //此处是哪个 name ?
age = age; //此处是哪个 age ?
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo02 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
代码运行结果:
从程序的运行结果可以发现,构造方法中传递进去的参数并没有赋值给类中的属性,那是因为类中的属性并没有被明确指出,所以程序采取了就近原则,上面的 "name = name;" 、"age = age" 中的两个name 和两个 age 都是构造方法中的参数。 所以此时就可以使用 this 关键字表示类中的属性,代码修改如下:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name; //明确表示为类中 name 属性赋值
this.age = age; //明确表示为类中 age 属性赋值
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo03 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
程序运行结果:
此时程序在进行赋值操作时就不会产生歧义,程序正常执行
二 、使用 this 调用构造方法
如果一个类有多个构造方法,也可以使用 this 关键字互相调用
现有一个类如下:
class Person {
private String name;
private int age;
public Person() { //无参构造
System.out.println("构造方法被调用了"); //每一个构造方法都执行此条语句
}
public Person(String name) { //一个参数构造方法
System.out.println("构造方法被调用了"); //每一个构造方法都执行此条语句
this.name = name;
}
public Person(String name, int age) { //两个参数构造方法
System.out.println("构造方法被调用了"); //每一个构造方法都执行此条语句
this.name = name;
this.age = age;
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo04 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
以上代码,构造方法中有代码重复,此时可以使用 this(若干参数) 的形式,让构造方法间相互调用,代码修改如下:
class Person {
private String name;
private int age;
public Person() { //无参构造
System.out.println("构造方法被调用了");
}
public Person(String name) { //一个参数构造方法
this(); //表示调用本类中的无参构造方法
this.name = name;
}
public Person(String name, int age) { //两个参数构造方法
this(name); //表示调用有一个参数的构造方法
this.age = age;
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo05 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
注意:在使用 this 关键字调用其它构造方法时,有以下几点限制:
- this() 调用构造方法的语句只能放在构造方法的首行
程序报错:
程序编译报错:
因为构造方法在实例化对象时就会被自动调用,所以使用 this() 调用构造方法必须放在构造方法的第一行
- 使用 this() 调用本类的构造方法时,至少有一个构造方法的没用 this() 调用的,否则将会出现构造方法之间反复调用,造成死循环
class Person {
private String name;
private int age;
public Person() { //无参构造
this("小红",18); //调用两个参数的构造方法
System.out.println("构造方法被调用了");
}
public Person(String name) { //一个参数构造方法
this(); //调用本类中的无参构造方法
this.name = name;
}
public Person(String name, int age) { //两个参数构造方法
this(name); //调用有一个参数的构造方法
this.age = age;
}
public String getInfo() {
return "姓名:" + name + ", 年龄:" + age;
}
}
public class ThisDemo05 {
public static void main(String[] args) {
Person per = new Person("小明",20);
System.out.println(per.getInfo());
}
}
所有构造方法都使用了 this() 互相调用,造成递归调用,程序报错:
程序编译报错:
三 、使用 this 表示当前对象
class Person{ // 定义Person类
public String getInfo(){ // 取得信息的方法
System.out.println("Person类 --> " + this) ; // 直接打印this
return null ; // 为了保证语法正确,返回null
}
};
public class ThisDemo06{
public static void main(String args[]){
Person per1 = new Person() ; // 调用构造实例化对象
Person per2 = new Person() ; // 调用构造实例化对象
System.out.println("MAIN方法 --> " + per1) ; // 直接打印对象
per1.getInfo() ; // 当前调用getInfo()方法的对象是per1
System.out.println("MAIN方法 --> " + per2) ; // 直接打印对象
per2.getInfo() ; // 当前调用getInfo()方法的对象是per2
}
};
程序运行结果:
从程序的运行结果来看,直接打印输出 和 调用 getInfo() 方法打印的结果都是一样的,这说明了 哪个对象调用了类中的方法,则 this 就表示哪个对象