Java this关键字的分析和使用
0x01 this可以做的三件事
- 调用本类属性
- 调用本类方法
- 普通方法:public static void method(){}
- 构造方法:方法名与类名相同,无返回值的方法
- this表示当前对象
0x02 使用this表示本类属性
-
示例:
class Person{ private String name; private int age; // 通过构造方法为name和age属性进行初始化操作 public Person(String n,int a) { name = n; age = a; } public String getInfo() { return "姓名:"+name+"\n年龄:"+age; } } public class Demo { public static void main(String[] args) { System.out.println(new Person("张三",20).getInfo()); } }
虽然程序可以正常运行,但是现在构造方法的参数声明不准确“public Person(String n,int a)”。解决这个问题的最好做法就是将参数的名称和属性名称统一起来。
class Person{ private String name; private int age; public Person(String name,int age) { name = name; age = age; } public String getInfo() { return "姓名:"+name+"\n年龄:"+age; } } public class Demo { public static void main(String[] args) { System.out.println(new Person("张三",20).getInfo()); } }
那么这个时候就可能会产生参数与属性同名的问题,所以为了明确的标记出要使用的是属性还是方法的参数,需要在属性前面加上“this”的形式。
class Person{ private String name; private int age; public Person(String name,int age) { // this.属性 当前对象中的属性 this.name = name; this.age = age; } public String getInfo() { return "姓名:"+this.name+"\n年龄:"+this.age; } } public class Demo { public static void main(String[] args) { System.out.println(new Person("张三",20).getInfo()); } }
0x03 使用this表示本类方法
- 类中的方法一共有两种:
- 普通方法:this.方法名称(参数…);
- 构造方法:this(参数…);
示例:调用本类方法(普通方法)
class Person{
private String name;
private int age;
public Person(String name,int age) {
// this.属性 当前对象中的属性
this.name = name;
this.age = age;
this.print(); // 调用本类方法
}
public void print() {
System.out.println("********************");
}
public String getInfo() {
return "姓名:"+this.name+"\n年龄:"+this.age;
}
}
public class Demo {
public static void main(String[] args) {
System.out.println(new Person("张三",20).getInfo());
}
}
虽然调用本类的普通方法可以不使用this,但建议还是加上,目的是可以区分方法的定义来源。
示例:调用构造方法
构造方法与普通方法最大区别:使用关键字new实例化类新对象的时候使用一次,而普通方法是在对象实例化完成后(构造方法以及执行过了)可以调用多次。
class Person{
private String name;
private int age;
public Person() { // 无参构造
System.out.println("***** 新的Person对象产生了 *****");
}
public Person(String name) {
this(); // 调用本类中的无参构造
this.name = name;
}
public Person(String name,int age) {
this(name); // 调用本类中的有参构造
// this.属性 当前对象中的属性
this.age = age;
}
public String getInfo() {
return "姓名:"+this.name+"\n年龄:"+this.age;
}
}
public class Demo {
public static void main(String[] args) {
System.out.println(new Person().getInfo());
System.out.println(new Person("张三").getInfo());
System.out.println(new Person("李四",20).getInfo());
}
}
虽然使用this可以实现构造方法的互相调用,但是有两点如下要求:
- this()调用构造方法的语句必须放在构造方法的首行;
- 使用this()调用构造方法的时候需要注意避免出现递归调用;
0x04 this表示当前对象
-
示例:观察当前对象
class Person{ public void fun() { System.out.println("[FUN方法: ]"+this); } } public class Demo { public static void main(String[] args) { Person p1 = new Person(); System.out.println("[P1主方法:]"+p1); p1.fun(); // p1对象调用了fun方法 System.out.println("==========================="); Person p2 = new Person(); System.out.println("[P2主方法:]"+p2); p2.fun(); // p2对象调用了fun方法 } }
在整个操作过程之中,this定义没有变,只要有某一个对象调用了本类中的方法,那么这个this就表示当前执行的对象。