簡體   English   中英

類不擴展java.lang.Object

[英]Classes not extending java.lang.Object

在Java中創建用戶定義的類時,不要將其指定為擴展Object。 但是這個類仍然是一個對象。 這是如何運作的? javac或JVM如何將類的所有屬性注入用戶定義的類?

如果您實際上沒有編寫extends Object ,編譯器會為您插入它。

編輯 :顯然我對是否實際插入代碼造成了一些混淆。 我不完全確定自己所以我做了一個小實驗:在文件test.java創建以下類:

public class test {}

並編譯它,然后運行

javap -c test

反匯編字節碼。 看看會發生什么:

Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

}

所以是的,編譯器確實extends java.lang.Object (或等效的字節碼)插入到類中。

所有java類都隱式擴展java.lang.Object。 文檔

Class Object是類層次結構的根。 每個類都有Object作為超類。 所有對象(包括數組)都實現此類的方法。

這里還有一個指向JVM規范的鏈接:

標准類Object是所有其他類的超類(第2.8.3節)。 Object類型的變量可以保存對任何對象的引用,無論它是類的實例還是數組。 所有類和數組類型都繼承Object類的方法。

好吧,這可能是一個滑稽的答案(我最喜歡的那種),但如果你指定一個父類,它可能就像它派生一個類一樣。 如果您正在編寫編譯器,那不就是這樣做的嗎?

這是因為所有用戶定義的類型都隱式地從Object繼承。

要說JVM在類中“注入”屬性或方法,這聽起來像是編譯器或運行時事后的事情,好像.class文件不同。 實際上,所有發生的事情是當解析器發現你沒有包含任何帶有extends基類時,它只是假裝你明確指定了Object 從那時起,編譯器將其視為與您自己鍵入的相同,並且JVM無法確定您在源代碼中執行或未指定的內容。

暫無
暫無

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

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