[英]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
(或等效的字節碼)插入到類中。
好吧,這可能是一個滑稽的答案(我最喜歡的那種),但如果你指定一個父類,它可能就像它派生一個類一樣。 如果您正在編寫編譯器,那不就是這樣做的嗎?
這是因為所有用戶定義的類型都隱式地從Object繼承。
要說JVM在類中“注入”屬性或方法,這聽起來像是編譯器或運行時事后的事情,好像.class文件不同。 實際上,所有發生的事情是當解析器發現你沒有包含任何帶有extends
基類時,它只是假裝你明確指定了Object
。 從那時起,編譯器將其視為與您自己鍵入的相同,並且JVM無法確定您在源代碼中執行或未指定的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.