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

【Java 咬文嚼字】關鍵字深度解析(一):super 與 this 的本質區別

     編輯:Java 綜合教學

【Java 咬文嚼字】關鍵字深度解析(一):super 與 this 的本質區別

學習 Java 過程中,基礎關鍵字往往最容易被忽視卻又最核心。本文深入剖析 super 和 this 的用法、限制及常見誤區,幫助建立準確的心智模型。

一、super 關鍵字詳解

1. 調用父類構造器

  • 只能在子類構造器中使用,且必須是第一條語句。
  • 可傳遞參數匹配父類不同構造器:super()、super(time)。
  • 私有構造器陷阱:若父類構造器被 private 修飾,子類無法通過 super 調用,編譯報錯。因為 private 成員不可繼承,子類不可見。
class MyDate extends Date {
    private MyDate() { super(); } // OK
    private MyDate(long time) { super(time); } // OK
}
// 若 Date 的無參構造器是 private,編譯失敗

2. 調用父類方法/成員

  • 可在子類構造器或普通方法中調用:super.getTime()。
  • 順序限制:在構造器中,必須先調用父類構造器(super()),才能調用父類方法。否則編譯錯誤:"Call to super must be first statement in constructor"。邏輯上父類對象未構造完成前,不能調用其方法。

3. 泛型中的下界通配符 <? super T>

super 在泛型中表示類型下界,參數化類型可以是指定類型或其父類型(直到 Object)。

對比:extends 表示上界(子類型)。

// 經典場景:比較兩個對象大小
static <T extends Comparable<? super T>> T min(T a, T b) {
    // T 實現了 Comparable,且比較目標可以是 T 或 T 的父類
    // 允許傳入 SubTest,即使 Comparable 是由 SuperTest 實現
    if (a.compareTo(b) < 0) return a;
    return b;
}

class SuperTest implements Comparable<SuperTest> { ... }
class SubTest extends SuperTest { } // SubTest 可直接用於 min()

若寫成 Comparable<? extends T>,則要求 T 本身實現 Comparable,限制了多態性。

二、this 關鍵字詳解

1. 調用本類構造器

  • 同樣只能在構造器中,且必須是第一條語句:this(0)。
  • 遞歸調用禁止:構造器之間不能相互調用 this(),否則編譯報錯 "Recursive constructor invocation"。

2. 訪問本類成員/方法

  • 用於區分同名參數與成員變量:this.field = field。
  • 在方法中調用本類其他方法:this.doSomething()(通常可省略)。

三、核心誤區:this 是引用,super 只是關鍵字

許多教材說 "this 代表當前對象,super 代表父類對象",這是不準確的。

  • this 是當前對象的引用(類類型),可打印、可傳遞、可 instanceof 判斷。
  • super 不是對象引用,只是一個編譯器指令,告訴編譯器「去父類查找」。

鐵證如山:

public void print() {
    System.out.println(this);        // 編譯通過,輸出對象地址
    System.out.println(this.getClass()); // 編譯通過
    System.out.println(super);       // 【編譯失敗】super cannot be used outside of a constructor or instance initializer
    System.out.println(super.getClass()); // 【編譯失敗】

    if (this instanceof MyDate) { ... } // 編譯通過
    if (super instanceof Date) { ... }  // 【編譯失敗】super cannot be used in instanceof
}

結論:super 無法作為獨立表達式使用,不能賦值給變量,不能參與 instanceof,它只能出現在 super()、super.method()、super.field 這三種上下文中。

四、總結對比

特性thissuper
本質當前對象引用(變量)編譯器指令(關鍵字)
構造器調用this() 調用本類其他構造器super() 調用父類構造器
方法/字段訪問this.method()、this.fieldsuper.method()、super.field
可作為表達式是(可打印、傳參、判斷類型)否(編譯報錯)
instanceof 判斷支持不支持
構造器中順序必須首行,與 super() 互斥必須首行,與 this() 互斥

理解這一本質區別,能避免許多繼承層級中的困惑,也是掌握 Java 物件模型的關鍵一步。

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