this關鍵字
this關鍵字,this指向對象本身,一個類可以通過this來獲得一個代表它自身的對象變 量。this使用在如下三種情況中:
- 調用實例變量。
- 調用實例方法。
- 調用其他構造方法。
使用this變量的示例代碼:
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;
birthDate = d;
System.out.println(this.toString());
}
public Person(String name, int age) {
// 調用三個參數構造方法
this(name, age, null);
}
public Person(String name, Date d) {
// 調用三個參數構造方法
this(name, 30, d);
}
public Person(String name) {
// System.out.println(this.toString());
// 調用Person(String name, Date d)構造方法 ,這裏會發生編譯錯誤
this(name, null);
}
@Override
public String toString() {
return "Person [name=" + name
+ ", age=" + age
+ ", birthDate=" + birthDate + "]";
}
}
注意:使用this調用其他構造方法時,this語句一定是該構造方法的第一條語句。
super關鍵字
super關鍵字指代當前對象的超類對象。即:當前對象的父類對象。super關鍵字一般用在子類中。
super關鍵字的作用:
- 調用父類的成員變量。
- 調用父類的方法。
- 調用父類的構造方法。
父類Person代碼如下:
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;
birthDate = d;
System.out.println(this.toString());
}
public Person(String name, int age) {
// 調用三個參數構造方法
this(name, age, null);
}
public Person(String name, Date d) {
// 調用三個參數構造方法
this(name, 30, d);
}
public Person(String name) {
// System.out.println(this.toString());
// 調用Person(String name, Date d)構造方法 ,這裏會發生編譯錯誤
this(name, null);
}
}
子類Student代碼如下:
public class Student extends Person {
// 所在學校
private String school;
public Student(String name, int age, Date d, String school) {
super(name, age, d);
this.school = school;
}
public Student(String name, int age, String school) {
// this.school = school;//編譯錯誤
super(name, age);
this.school = school;
}
public Student(String name, String school) { // 編譯錯誤 3
// super(name, 30);
this.school = school;
}
}
注意:super語句必須位於子類構造方法的第一行。
代碼第③行構造方法由於沒有super語句,編譯器會試圖調用父類默認構造方法(無參數構造方法), 但是父類Person並沒有默認構造方法,因此會發生編譯錯誤。解決這個編譯錯誤有三種辦法:
- 在父類Person中添加默認構造方法,子類Student會隱式調用父類的默認構造方法。
- 在子類Studen構造方法添加super語句,顯式調用父類構造方法,super語句必須是第一條語句。
- 在子類Studen構造方法添加this語句,顯式調用當前對象其他構造方法,this語句必須是第一條語 句。
super和this的異同:
- super(參數):調用基類中的某一個構造函數(應該爲構造函數中的第一條語句)
- this(參數):調用本類中另一種形成的構造函數(應該爲構造函數中的第一條語句)
- super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數據或函數,基類與派生類中有相同成員定義時如:super.變量名 super.成員函數據名(實參)
- this:它代表當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;如果函數的形參與類中的成員數據同名,這時需用this來指明成員變量名)
- 調用super()必須寫在子類構造方法的第一行,否則編譯不通過。每個子類構造方法的第一條語句,都是隱含地調用super(),如果父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
- super()和this()類似,區別是,super()從子類中調用父類的構造方法,this()在同一類內調用其它方法。
- super()和this()均需放在構造方法內第一行。
- 儘管可以用this調用一個構造器,但卻不能調用兩個。
- this和super不能同時出現在一個構造函數裏面,因爲this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。
- this()和super()都指的是對象,所以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
- 從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!