目錄
this
this是什麼?
在Java中, this關鍵字比較難理解,它的作用和其詞義很接近。
- 它在方法內部使用,即這個方法所屬對象的引用;
- 它在構造器內部使用,表示該構造器正在初始化的對象。
this理解爲:當前對象 或 當前正在創建的對象
this關鍵字的使用
this 可以調用類的屬性、方法和構造器
this修飾屬性和方法:
-
在類的方法中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果方法的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
-
在類的構造器中,我們可以使用"this.屬性"或"this.方法"的方式,調用當前正在創建的對象屬性或方法。但是,通常情況下,我們都選擇省略"this."。特殊情況下,如果構造器的形參和類的屬性同名時,我們必須顯式的使用"this.變量"的方式,表明此變量是屬性,而非形參。
this調用構造器
① 我們在類的構造器中,可以顯式的使用"this(形參列表)"方式,調用本類中指定的其他構造器
② 構造器中不能通過"this(形參列表)"方式調用自己
③ 如果一個類中有n個構造器,則最多有 n - 1構造器中使用了"this(形參列表)"
④ 規定:"this(形參列表)"必須聲明在當前構造器的首行
⑤ 構造器內部,最多隻能聲明一個"this(形參列表)",用來調用其他的構造器
什麼時候使用this關鍵字呢?
-
在任意方法或構造器內,如果使用當前類的成員變量或成員方法可以在其前面添加this,
增強程序的閱讀性。不過,通常我們都習慣省略this。 -
當形參與成員變量同名時,如果在方法內或構造器內需要使用成員變量,必須添加this來表明該變量是類的成員變量
-
使用this訪問屬性和方法時,如果在本類中未找到,會從父類中查找
-
this可以作爲一個類中構造器相互調用的特殊格式
this的注意事項
- 可以在類的構造器中使用"this(形參列表)"的方式,調用本類中重載的其他的構造器!
- 明確:構造器中不能通過"this(形參列表)"的方式調用自身構造器
- 如果一個類中聲明瞭n個構造器,則最多有 n - 1個構造器中使用了"this(形參列表)"
- "this(形參列表)"必須聲明在類的構造器的首行!
- 在類的一個構造器中,最多隻能聲明一個"this(形參列表)"
super
使用
在Java類中使用super來調用父類中的指定操作:
- 我們可以在子類的方法或構造器中。通過使用"
super.屬性
“或”super.方法
“的方式,顯式的調用父類中聲明的屬性或方法。但是,通常情況下,我們習慣省略"super.” - 特殊情況:當子類和父類中定義了同名的屬性時,我們要想在子類中調用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調用的是父類中聲明的屬性。
- 特殊情況:當子類重寫了父類中的方法以後,我們想在子類的方法中調用父類中被重寫的方法時,則必須顯式的使用"super.方法"的方式,表明調用的是父類中被重寫的方法。
注意
- 尤其當子父類出現同名成員時, 可以用super表明調用的是父類中的成員
- super的追溯不僅限於直接父類,如果沒有找到,會追溯間接父類
- 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調用父類構造器
-
我們可以在子類的構造器中顯式的使用"super(形參列表)"的方式,調用父類中聲明的指定的構造器
-
我們在類的構造器中,針對於"this(形參列表)"或"super(形參列表)"只能二選一,不能同時出現,必須聲明在子類構造器的首行!
-
在構造器的首行,沒有顯式的聲明"this(形參列表)“或"super(形參列表)”,則默認調用的是父類中空參的構造器:super()
-
在類的多個構造器中,至少有一個類的構造器中使用了"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
會直接去父類找。