如何使用Java關鍵字this和super

this

this是什麼?

在Java中, this關鍵字比較難理解,它的作用和其詞義很接近。

  • 它在方法內部使用,即這個方法所屬對象的引用;
  • 它在構造器內部使用,表示該構造器正在初始化的對象。

this理解爲:當前對象 或 當前正在創建的對象

this關鍵字的使用

this 可以調用類的屬性、方法和構造器

this修飾屬性和方法:

  1. 在類的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果方法的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。

  2. 在類的構造器中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前正在創建的對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果構造器的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。

this調用構造器

① 我們在類的構造器中,可以顯式的使用"this(形參列表)"方式,調用本類中指定的其他構造器

② 構造器中不能通過"this(形參列表)"方式調用自己

③ 如果一個類中有n個構造器,則最多有 n - 1構造器中使用了"this(形參列表)"

④ 規定:"this(形參列表)"必須聲明在當前構造器的首行

⑤ 構造器內部,最多隻能聲明一個"this(形參列表)",用來調用其他的構造器

什麼時候使用this關鍵字呢?

  1. 在任意方法或構造器內,如果使用當前類的成員變量或成員方法可以在其前面添加this,
    增強程序的閱讀性。不過,通常我們都習慣省略this。

  2. 當形參與成員變量同名時,如果在方法內或構造器內需要使用成員變量,必須添加this來表明該變量是類的成員變量

  3. 使用this訪問屬性和方法時,如果在本類中未找到,會從父類中查找

  4. this可以作爲一個類中構造器相互調用的特殊格式

this的注意事項

  1. 可以在類的構造器中使用"this(形參列表)"的方式,調用本類中重載的其他的構造器!
  2. 明確:構造器中不能通過"this(形參列表)"的方式調用自身構造器
  3. 如果一個類中聲明瞭n個構造器,則最多有 n - 1個構造器中使用了"this(形參列表)"
  4. "this(形參列表)"必須聲明在類的構造器的首行!
  5. 在類的一個構造器中,最多隻能聲明一個"this(形參列表)"

super

使用

在Java類中使用super來調用父類中的指定操作:

  1. 我們可以在子類的方法或構造器中。通過使用"super.屬性“或”super.方法“的方式,顯式的調用父類中聲明的屬性或方法。但是,通常情況下,我們習慣省略"super.”
  2. 特殊情況:當子類和父類中定義了同名的屬性時,我們要想在子類中調用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調用的是父類中聲明的屬性。
  3. 特殊情況:當子類重寫了父類中的方法以後,我們想在子類的方法中調用父類中被重寫的方法時,則必須顯式的使用"super.方法"的方式,表明調用的是父類中被重寫的方法。

注意

  1. 尤其當子父類出現同名成員時, 可以用super表明調用的是父類中的成員
  2. super的追溯不僅限於直接父類,如果沒有找到,會追溯間接父類
  3. super和this的用法相像, this代表本類對象的引用, super代表父類的內存空間的標識

使用示例

class protected Person {String name = "張三"; 關鍵字super舉例
	protected int age;
                        
    public String getInfo() {
    	return "Name: " + name + "\nage: " + age;
    }
}
class Student extends Person {
    protected String name = "李四";
    private String school = "New Oriental";
    
    public String getSchool() {
    	return school;
    }
    
    public String getInfo() {
    	return super.getInfo() + "\nschool: " + school;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        Student st = new Student();
        System.out.println(st.getInfo());
    }
}

super調用父類構造器

  1. 我們可以在子類的構造器中顯式的使用"super(形參列表)"的方式,調用父類中聲明的指定的構造器

  2. 我們在類的構造器中,針對於"this(形參列表)"或"super(形參列表)"只能二選一,不能同時出現,必須聲明在子類構造器的首行!

  3. 在構造器的首行,沒有顯式的聲明"this(形參列表)“或"super(形參列表)”,則默認調用的是父類中空參的構造器:super()

  4. 在類的多個構造器中,至少有一個類的構造器中使用了"super(形參列表)",調用父類中的構造器;如果子類構造器中既未顯式調用父類或本類的構造器, 且父類中又沒有無參的構造器, 則編譯出錯必須通過this(參數列表)或者super(參數列表)語 句指定調用本類或者父類中相應的構造器。 同時, 只能”二選一”, 且必須放在構造器的首行

編譯出錯示例
父類
public class Person { 
    private String name; 
    private int age;
    private Date birthDate;
    
    public Person(String name, int age, Date d) {
        this.name = name;
        this.age = age;
        this.birthDate = d;
    }
    
    public Person(String name, int age) {
    	this(name, age, null);
    }
    
    public Person(String name, Date d) {
    	this(name, 30, d);
    }
    
    public Person(String name) {
    	this(name, 30);
    }
}

子類編譯出錯,父類無空參構造器,子類沒有顯示的通過this(參數列表)或者super(參數列表)語 句指定調用本類或者父類中相應的構造器

public class Student extends Person {
	private String school;
    
    public Student(String name, int age, String s) {
        super(name, age);
        school = s;
    }
    
    public Student(String name, String s) {
        super(name);
        school = s;
    }
    
    // 編譯出錯: no super(),系統將調用父類無參數的構造器。
    public Student(String s) {
    	school = s;
    }
    
}

this和super的區別

區別點 this super
訪問屬性 訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續查找 直接訪問父類中的屬性
調用方法 訪問本類中的方法,如果本類沒有此方法則從父類中繼續查找 直接訪問父類中的方法
調用構造器 調用本類構造器,必須放在構造器的首行 調用父類構造器,必須放在子類構造器的首行
注意:

使用this會首先在本類找,然後去父類找;使用super會直接去父類找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章