介面不是 Object 的子類別,但介面實例可以指派給 Object 參考。 這是兩個不同層面的概念:
Object (所有類別的隱含父類)
↑ extends
具體類別 (如 String, ArrayList, 自定義類)
↑ implements
介面 (如 Serializable, Comparable, 自定義介面)
介面不參與類別繼承樹,不繼承 Object,但定義了隱含的公用方法簽章(對應 Object 的公用方法)。
Java 語言規範 (JLS 9.2) 規定:介面隱含宣告 Object 的所有 public 實例方法(toString()、equals()、hashCode() 等),但不繼承其實作。實作類別必須提供這些方法的實作(直接或繼承自 Object)。
interface Drawable { void draw(); }
class Circle implements Drawable {
public void draw() { System.out.println("圓形"); }
}
public class Test {
public static void main(String[] args) {
Drawable d = new Circle(); // 介面參考指向實作類別實例
Object o = d; // 合法:介面實例可轉為 Object
Object o2 = new Circle(); // 合法:類別實例可轉為 Object
// 編譯期型別為 Object,執行期仍為 Circle
System.out.println(o.getClass()); // class Circle
}
}
| 誤區 | 正確觀念 |
|---|---|
| 介面繼承 Object | 介面不繼承類別,但隱含 Object 的 public 方法簽章 |
| 介面變數是 Object 子類別 | 介面變數型別是介面,執行期指向實作類別實例,該實例是 Object 子類別 |
| Object 方法只能在類別呼叫 | 介面參考也可呼叫 toString()/equals(),動態分派至實作類別 |
equals()/hashCode()/toString()