1、簡介
this與super是類執行個體化時通往Object類通道的打通者;this和super在程式中由于其經常被隐式的使用而被我們忽略,但是了解其作用和使用規範肯定是必須的。接下來将詳述this與super的作用和差別。
2、引子
先來看兩段代碼,無報錯代碼示例:
package com.liziba.ts;
/**
* <p>
* 父類示例代碼
* </p>
*
* @Author: Liziba
*/
public class Father {
private String name;
public String getName() {
return name;
}
}
* 子類示例代碼
public class Son extends Father{
public Son(String name) {
此時将Father類中的構造函數修改為有參的構造函數,有錯誤的代碼示例:
public Father(String name) {
this.name = name;
子類代碼不修改,此時子類報錯:
這就是super()的隐式使用導緻的報錯,具體原因是因為子類Son的構造函數中隐式的調用了父類的無參構造器,相當于隐式的super(),上面報錯的代碼和下面這個是等價的。
但是由于父類沒有顯示的申明無參構造函數,此時無參構造函數被有參構造函數覆寫了,所有super()調用無法抵達父類。此時的解決辦法有兩種:
1、父類中聲明無參構造函數
public String name;
// 父類什麼無參構造函數
public Father() {
public class Son extends Father {
super(); // 可以省略
2、子類顯示的通過super調用父類的有參構造函數
// 調用父類的有參構造函數
super(name);
接下來将詳細分析this和super的作用和差別。
3、this
this相當于目前對象執行個體,或者目前對象的一個引用,this有如下作用:
- 調用目前對象中的方法和屬性
- 區分對象屬性和方法形參
- 調用構造方法(必須在構造函數的第一行)
this相當于目前對象執行個體舉例:
private String homework = "Java程式設計思想";
public void doSomething() {
// this 相當于目前Son對象執行個體
synchronized (this) {
}
調用目前對象中的方法和屬性舉例:
// this 擷取目前對象的屬性
String hn = this.homework;
// this 調用目前對象的方法
this.doSomething2();
public void doSomething2() {
// toDo
區分對象屬性和方法形參舉例:
public Son(String homework) {
// 區分對象屬性與方法形參
this.homework = homework;
調用其他構造方法舉例:
// 調用其他構造方法,必須在第一行
this(homework, "你們未來都是架構師");
public Son(String homework, String name) {
4、super
super可以了解為父類(直接父類,如果有多層繼承關系這裡指的是最近的父類)對象的引用。super有如下的作用:
- 調用父類非私有的屬性和方法
- 區分目前類與父類同名的屬性和方法
- 調用父類的構造函數(必須在構造函數的第一行)
調用父類屬性和方法示例:
* 父類
public void doSomething3() {
public void doSomething4() {
* 子類
public void doSomething() {
// 調用父類的非私有方法
super.doSomething3();
super.doSomething4();
// 調用父類的非私有屬性
String name = super.name;
}
區分目前類與父類同名的屬性和方法示例:
* 子類代碼修改成如下
// super可以區分父類方法與目前對象的方法
doSomething3();
doSomething4();
super.doSomething3();
super.doSomething4();
// 區分目前父類的屬性與目前類的屬性
String fatherName = super.name;
String sonName = name;
@Override
// todo
5、總結
5.1 對比差異
this 基本概念
- 通路本類執行個體屬性和方法
super 基本概念
- 通路父類執行個體屬性和方法
this 查找範圍
- 先查找本類,不存在再查找父類
super 查找範圍
- 直接查找父類
this 其他功能
- 單獨使用表示目前對象
super 其他功能
- 子類複寫父類方法,用于通路父類同名方法
5.2 相同點
- 都是關鍵字,起指代作用
- 構造方法中必須在第一行調用其它構造函數