當我們創建的任何對象時,它會創建一個默認的構造函數,並調用超()在Object類的構造函數,會發生什麼
例如:
Parent(){
super();
}
,但是當我看向Object類沒有構造函數在它中,調用super()構造函數時會發生什麼。
似乎JVM調用方法這是根本不存在的對象類,但不能夠明白髮生了什麼。
當我們創建的任何對象時,它會創建一個默認的構造函數,並調用超()在Object類的構造函數,會發生什麼
例如:
Parent(){
super();
}
,但是當我看向Object類沒有構造函數在它中,調用super()構造函數時會發生什麼。
似乎JVM調用方法這是根本不存在的對象類,但不能夠明白髮生了什麼。
類Object
執行中的每個實例一些本地操作。
Java編譯器保證每一個對象創建調用Object
構造。
這就是爲什麼每個構造函數必須以super()
或this()
調用開始的原因。因此,在每個實例中執行的第一個構造函數將是Object
構造函數。
感謝@ jfcorugedo的快速回復:)我們可以獲得更多關於這方面的信息/鏈接,本地實現中發生了什麼。 – Sravan
嗯,它取決於每個JVM,但基本上它爲此對象分配足夠的內存 – jfcorugedo
Object
類本機方式大多實現,這樣的構造不調用它的父。此外,它沒有任何父類,因爲它被設置爲.class
文件中的null
。你可以在java .class
file format閱讀更多有關如何存儲Java類的內容。
Java語言本身不允許這樣的技巧,但它們被VM允許,因爲對於每個內部類文件,驗證都是禁用的。
對象的創建歸屬於JVM。 Java中的每個構造函數都顯示爲一個名爲<init>
的特殊方法,它負責實例初始化。這個<init>
方法是由編譯器提供的,因爲<init>
在Java中不是有效的標識符,所以不能直接在該語言中使用。
JVM如何調用這個
<init>
方法?
JVM將使用invokespecial
指令調用<init>
方法,只能在未初始化的類實例調用。
將在Object類的構造函數會發生什麼?
沒有什麼比在默認的空構造函數的子類中(減去對super()
的調用)會發生。
默認構造函數可以被明確定義,如果沒有編譯器就會把它在爲你只要沒有其他構造函數已定義。
欲瞭解更多信息,看看JVM規範和Java語言規範:
而所有其他的答案關於本地代碼是真的,在形式上沒有什麼特別的或神祕的關於java.lang.Object
明顯缺乏構造函數。
任何缺少明確定義的構造函數的類都將自動收到default constructor。例如,這是有效的代碼:
class Foo {}
class Bar extends Foo {
public Bar(String baz) {
super();
}
}
哪裏Object
不同是什麼,默認的構造函數包含:
如果所聲明的類是原始類的對象,那麼 默認的構造函數有一個空身體。否則,構造函數的默認構造函數只會調用沒有參數 的超類構造函數。
java.lang.Object'的大部分實現都是原生的。 – Mena
你在看源代碼還是類文件? java編譯器會將一個空的構造函數插入到Object類文件中,就像它處理你的Parent類一樣。 – SamTebbs33
感謝@Mena的快速回復:) 我們可以得到更多關於這方面的信息/鏈接,本地實現中發生了什麼。 – Sravan