天天看點

this與super

1、簡介

this與super是類執行個體化時通往Object類通道的打通者;this和super在程式中由于其經常被隐式的使用而被我們忽略,但是了解其作用和使用規範肯定是必須的。接下來将詳述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;

子類代碼不修改,此時子類報錯:

this與super

這就是super()的隐式使用導緻的報錯,具體原因是因為子類Son的構造函數中隐式的調用了父類的無參構造器,相當于隐式的super(),上面報錯的代碼和下面這個是等價的。

this與super

但是由于父類沒有顯示的申明無參構造函數,此時無參構造函數被有參構造函數覆寫了,所有super()調用無法抵達父類。此時的解決辦法有兩種:

1、父類中聲明無參構造函數

    public String name;

    // 父類什麼無參構造函數

    public Father() {

public class Son extends Father {

        super(); // 可以省略

2、子類顯示的通過super調用父類的有參構造函數

        // 調用父類的有參構造函數 

        super(name);

接下來将詳細分析this和super的作用和差別。

3、this

this相當于目前對象執行個體,或者目前對象的一個引用,this有如下作用:

  1. 調用目前對象中的方法和屬性
  2. 區分對象屬性和方法形參
  3. 調用構造方法(必須在構造函數的第一行)

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) {

this與super

4、super

super可以了解為父類(直接父類,如果有多層繼承關系這裡指的是最近的父類)對象的引用。super有如下的作用:

  1. 調用父類非私有的屬性和方法
  2. 區分目前類與父類同名的屬性和方法
  3. 調用父類的構造函數(必須在構造函數的第一行)

調用父類屬性和方法示例:

 * 父類

    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

this與super

5、總結

5.1 對比差異

this 基本概念

  • 通路本類執行個體屬性和方法

super 基本概念

  • 通路父類執行個體屬性和方法

this 查找範圍

  • 先查找本類,不存在再查找父類

super 查找範圍

  • 直接查找父類

this 其他功能

  • 單獨使用表示目前對象

super 其他功能

  • 子類複寫父類方法,用于通路父類同名方法

5.2 相同點

  • 都是關鍵字,起指代作用
  • 構造方法中必須在第一行調用其它構造函數

5.3 總結圖

this與super