初学java,发现很多地方会用到this关键字,但是挺多地方都不太明白为什么要用它,或者说在什么地方什么情况下应该用this关键字,那我们一起来总结一下。
this关键字除了强调本类中的方法之外,还可以有以下作用
- 表示类中的属性
- 强调本类的构造方法
- 用this表示当前对象
1、表示类中的属性
class Person{
private String name;
private int age;
public Person(String name, int age){ // 通过构造方法赋值
// this.name = name;
// this.age = age;
// 如果用这样的方式赋值
name = name; // 为 name 属性赋值
age = age; // 为 age 属性赋值
}
public String getInfo(){
return "姓名:" + name + " 年龄:" + age;
}
}
public class ChapterFive {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
System.out.println(p1.getInfo());
}
}
运行结果:
姓名:null 年龄:0
可以看到,其实并没有将正确的内容赋值给属性,就好比你想拿笔写字,你现在面前已经有一支笔了,另外在隔壁屋里还有一支一模一样的,那你会选择用那一只呢?肯定是会就近用眼前的,所以此时操作的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 ChapterFive {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
System.out.println(p1.getInfo());
}
}
运行结果:
姓名:张三 年龄:22
2、用 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;
}
}
可以看到,在上述构造方法里,都会有重复的代码出现,当属性少的时候没有太大影响,当属性数量大的时候弊端就立马体现,会有大量的冗余代码。
- 使用 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;
}
}
注意点
- this 调用构造方法时必须放在构造方法的第一行
- 用 this 调用其它构造方法时,必须至少有一个不用 this 调用的
3、用 this 进行对象比较
class Person{
private String name;
private int age;
public Person(String name, int age){
this.setName(name);
this.setAge(age);
}
public String getInfo(){
return "姓名:" + name + " 年龄:" + age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean compare(Person per){
// 调用此方法时里面存在两个对象:当前对象和传入的对象
Person p1 = this; // 当前对象
Person p2 = per; // 传入的对象
if(p1==p2){
return true;
}else{
return false;
}
}
}
public class ChapterFive {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
Person p2 = new Person("张三",22);
System.out.println(p1.getInfo());
if(p1.compare(p2)){
System.out.println("两个对象相等");
}else{
System.out.println("两个对象不相等");
}
}
}
输出结果:
姓名:张三 年龄:22
两个对象不相等
地址相等,则两个对象相等,如果地址不相等,则依次判断每一个属性的值是否相等。