首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 核心關鍵字深度解析:this 與 super 的進階用法與陷阱

     編輯:Java 相關知識

this:當前物件的隱性參考

this 在非靜態方法內部自動可用,型別為該類別,指向「正在呼叫此方法的物件實例」。無需宣告,三大核心用法:

1. 區分同名成員變數與區域變數/參數

class PersonInformation {
    String name, gender, nationality, address;
    int age;

    // 參數與成員同名,必須用 this 區分
    void PersonInformation(String name, String gender, String nationality, String address, int age) {
        this.name = name;
        this.gender = gender;
        this.nationality = nationality;
        this.address = address;
        this.age = age;
    }
}

若寫 name = name,編譯器視為區域變數自我指派,成員變數因被遮蔽而未初始化。

2. 取得完整物件引用 (傳遞自身、列印狀態)

System.out.println(this); // 隱性呼叫 toString()
otherObject.register(this); // 將自身傳遞給其他物件

3. 建構子鏈呼叫 (必須為第一行陳述句)

class UserInfo {
    public UserInfo(String name) {
        this(name, generateSerialNumber()); // 呼叫另一個建構子
    }
    public UserInfo(String name, int number) {
        userName = name;
        userNumber = number;
    }
}

new UserInfo("Wayne") 會自動委派給雙參數建構子,避免程式碼重複。


super:父類別成員的顯性存取管道

當子類別成員 (變數/方法) 與父類別同名時,子類別成員優先,父類別成員被遮蔽。super 提供存取管道:

1. 存取父類別遮蔽的變數與方法

class Country {
    String name;
    void value() { name = "China"; }
}

class City extends Country {
    String name; // 遮蔽父類別 name
    void value() {
        name = "Hefei";        // 子類別變數
        super.value();         // 呼叫父類別方法
        System.out.println(name);       // Hefei
        System.out.println(super.name); // China
    }
}

輸出:Hefei / China。若無 super. 前綴,name 與 value() 均指向子類別成員。

2. 呼叫父類別建構子 (必須為子類別建構子第一行)

class Child extends Parent {
    Child(String param) {
        super(param); // 顯性呼叫父類別建構子
        // 初始化子類別專屬欄位
    }
}

若父類別無無參建構子,子類別 必須 以 super(...) 顯性呼叫帶參數建構子,否則編譯錯誤。


常見誤區與最佳實踐

誤區正確理解
this 可在 static 方法使用不可。static 方法無 this 參考
super 可存取祖父類別 (super.super)不可。Java 不支援多層 super 鏈
建構子鏈可任意順序呼叫this()/super() 必須為建構子第一行,且二擇一
私有父類別成員可用 super 存取不可。private 成員對子類別不可見,super 也存取不到

記憶口訣

  • this:指自己、遮蔽破、鏈建構、傳自身
  • super:找父親、破遮蔽、呼建構、存受保護

熟練掌握兩者,是撰寫健壯繼承體系與避免變數遮蔽 Bug 的關鍵基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved