1. 程式人生 > >Java學習筆記之this關鍵字

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
兩個物件不相等

地址相等,則兩個物件相等,如果地址不相等,則依次判斷每一個屬性的值是否相等。