簡體   English   中英

java.lang.Class和java.lang.Object

[英]java.lang.Class and java.lang.Object

好的概念上的困難 - 從書中閱讀和學習Java

它提到了以下內容(在解釋幾個不同主題的過程中) -

  1. Java不支持類層次結構中的多重繼承。 因此,如果C類是A類的子類,那么它也不能是B類的子類(我知道接口有一個解決方案可以在這里提供)

  2. java.lang.Object是所有類(系統和用戶)'擴展'的原始類。 所以每個類都是java.lang.Object類的直接或間接子類

  3. Java中的類不僅僅是編譯器偽像 - 但在運行時,由java.lang.Class類的實例表示

不是#3意味着語言本身定義的類是java.lang.Class類型 - 而#2意味着它們也是java.lang.Object類型 - 與#1相矛盾? 喜歡哪個類是java類的子類?

如果#1仍然存在,我猜這將意味着#3只是說類的“運行時表示”是類java.lang.Class實例 - 它是java.lang.Object的子類,但是類本身是java.lang.Object子類?

非常感謝您的指導!! 提前致謝!

不是#3意味着語言中定義的類本身是java.lang.Class類型

No. (Class) testclass是語法錯誤 - 沒有類是java.lang.Class子類 - 它是final

Class擴展了Object並代表了一個class

比方說,我有TestClass延伸Object默認情況下,現在TestClass.class(TestClass).getClass()存在-他們返回Class<TestClass>它擴展了Object ,是一個實例Class

但是如果你查看Class的Java文檔,你會發現它們不僅僅是Object

3)Java中的類不僅僅是編譯器工件 - 但在運行時,由java.lang.Class類的實例表示

那是正確的。

不是#3意味着語言中定義的類本身是java.lang.Class類型

那是正確的。

而#2意味着它們也是java.lang.Object類型

那是正確的。

......與#1相矛盾?

那是不對的。 沒有矛盾。

“擴展”關系僅在類之間定義,並且在運行時表示類的Class對象之間定義。 如果查看java.lang.Class API,您將看到Class getSuperclass()isAssignableFrom(Class) ...雖然isAssignableFrom正在測試“子類型”關系。 請注意,這些方法將另一個Class作為參數,或返回另一個類。

類和實例之間沒有“繼承”或“擴展”關系。 並且運行時對象之間也沒有這種關系。 java.lang.Class擴展java.lang.Object這一事實與此無關。


如果#1仍然存在,我猜這將意味着#3只是說類的“運行時表示”是類java.lang.Class的實例 - 它是java.lang.Object的子類?

那是正確的。

....但是類本身是java.lang.Object的子代碼?

那也是對的。

但需要注意的是,這兩個屬性並不直接相互關聯。 (類似)巧合的是,類和表示類的運行時類之間存在類似的關系。

3)Java中的類不僅僅是編譯器工件 - 但在運行時,由java.lang.Class類的實例表示

這是不正確的。 Java對象是對象 它們還有一個表示其類類型的屬性

public class Test  {
   public static final void main(String[] ignored)  {
      String s = "x";
      Class cls = s.getClass();
      System.out.println("s=" + s.toString());
      System.out.println("cls=" + cls.toString());  
   }
}

輸出:

s=x
cls=class java.lang.String

令人困惑的是我們說“Java對象就是類”。 這些在一般意義上都是正確的,但是使用這個特定的技術細節,它是不准確的。

簡而言之,Java對象存儲在*.class文件中,這使得這種區分變得混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM