[英]Is calling java.lang.Object constructor really necessary?
我最近安裝了字節碼大綱Eclipse插件並發現了我的Test類
public class Test {
}
調用java.lang.Object的構造函數
public class Test {
public <init>()V
L0
LINENUMBER 15 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
L1
LOCALVARIABLE this LTest; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
}
INVOKESPECIAL java/lang/Object.<init>()
V表示調用java.lang.Object的構造函數
它有意義嗎? 通過java.lang.Object字節碼來判斷
public <init>()V
L0
LINENUMBER 37 L0
RETURN
MAXSTACK = 0
MAXLOCALS = 1
它什么都不做。 回報。
它必須滿足結構約束的JVM規范的4.9.2節 :
除了從Object類的構造函數派生的實例初始化方法之外,每個實例初始化方法(第2.9節)必須在訪問實例成員之前調用此實例的另一個實例初始化方法或其直接超類super的實例初始化方法。
現在規則可以放寬Object
直接子類 - 但我懷疑它會有任何好處,並且會不優雅(IMO)。 如果該Object
的構造的確在未來進行一些初始化? 你真的想要一個允許你繞過它的規范嗎?
Java編譯器不應該以不同於可能具有更復雜的默認構造函數的任何其他基類來處理java.lang.Object
。 因此,基類的構造函數必須從任何子類的構造函數執行。 這個字節代碼對於將來修改基類(包括Object
)也是安全的:如果有一天有人更改基類,則不應重新編譯子類的代碼。
包括Object在內的基類的BTW變化並不那么奇特:考慮一下儀器包。 如果要對JDK進行檢測,例如計算所有已創建的對象,則需要修改java.lang.Object
字節代碼。 現在,如果字節代碼不包含Object
構造函數的調用,則您的檢測代碼將無法運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.