Java学习笔记之this关键字

初学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
两个对象不相等

地址相等,则两个对象相等,如果地址不相等,则依次判断每一个属性的值是否相等。

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/84065967