Java中this與super關鍵字詳解

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關鍵字。

以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

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