首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 接口與向上轉型:Set 接口顯示為 class 及 HashSet 轉 Set 的理解

     編輯:程式設計疑難解答

Java 初學者常見兩個疑惑:1. API 文檔中 Set 明明是接口,為何顯示為 class?2. HashSet 向上轉型為 Set 接口類型,接口不是不能實例化嗎?本文詳細解析。

問題 1:API 中接口顯示為 class

這僅是 Javadoc 生成工具的呈現習慣。接口在字節碼層面也是一種類結構(.class 文件),文檔工具統一用「Class」標籤展示,不影響其語義。心知它是接口即可。

問題 2:向上轉型為接口類型

代碼:

Set<String> set = new HashSet<>();

等號左邊 Set<String> set 是變量類型聲明,表示變量 set 的靜態類型是 Set 接口。
等號右邊 new HashSet<>() 是對象創建,創建的是 HashSet 具體實現類的實例。

關鍵理解

  • 沒有「接口實例」:接口無法直接 new,右邊永遠是實現類的對象。
  • 引用多態:父類型引用(接口變量)指向子類型對象(實現類實例)。
  • 編譯時類型 vs 運行時類型:編譯器只知道 set 是 Set 類型,只能調用 Set 定義的方法;運行時對象是 HashSet,實際執行其覆寫方法。

類比

Animal a = new Dog(); — Animal 可以是類也可以是接口,Dog 是具體實現。同理,Set 是接口,HashSet 是實現。

總結

  1. API 顯示 class 為工具習慣,不影響接口本質。
  2. 向上轉型實為「接口類型引用指向實現類對象」,而非轉換成接口實例。
  3. 這是 Java 多態的核心體現:面向接口編程,解耦具體實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved