2015-11-06 63 views
1

當我們創建的任何對象時,它會創建一個默認的構造函數,並調用超()在Object類的構造函數,會發生什麼

例如:

Parent(){ 
     super(); 
    } 

,但是當我看向Object類沒有構造函數在它中,調用super()構造函數時會發生什麼。

似乎JVM調用方法這是根本不存在的對象類,但不能夠明白髮生了什麼。

+2

java.lang.Object'的大部分實現都是原生的。 – Mena

+0

你在看源代碼還是類文件? java編譯器會將一個空的構造函數插入到Object類文件中,就像它處理你的Parent類一樣。 – SamTebbs33

+0

感謝@Mena的快速回復:) 我們可以得到更多關於這方面的信息/鏈接,本地實現中發生了什麼。 – Sravan

回答

1

Object執行中的每個實例一些本地操作。

Java編譯器保證每一個對象創建調用Object構造。

這就是爲什麼每個構造函數必須以super()this()調用開始的原因。因此,在每個實例中執行的第一個構造函數將是Object構造函數。

+0

感謝@ jfcorugedo的快速回復:)我們可以獲得更多關於這方面的信息/鏈接,本地實現中發生了什麼。 – Sravan

+1

嗯,它取決於每個JVM,但基本上它爲此對象分配足夠的內存 – jfcorugedo

1

Object類本機方式大多實現,這樣的構造不調用它的父。此外,它沒有任何父類,因爲它被設置爲.class文件中的null。你可以在java .class file format閱讀更多有關如何存儲Java類的內容。

Java語言本身不允許這樣的技巧,但它們被VM允許,因爲對於每個內部類文件,驗證都是禁用的。

1

對象的創建歸屬於JVM。 Java中的每個構造函數都顯示爲一個名爲<init>的特殊方法,它負責實例初始化。這個<init>方法是由編譯器提供的,因爲<init>在Java中不是有效的標識符,所以不能直接在該語言中使用。

JVM如何調用這個<init>方法?

JVM將使用invokespecial指令調用<init>方法,只能在未初始化的類實例調用。

將在Object類的構造函數會發生什麼?

沒有什麼比在默認的空構造函數的子類中(減去對super()的調用)會發生。

默認構造函數可以被明確定義,如果沒有編譯器就會把它在爲你只要沒有其他構造函數已定義。

欲瞭解更多信息,看看JVM規範和Java語言規範:

1

而所有其他的答案關於本地代碼是真的,在形式上沒有什麼特別的或神祕的關於java.lang.Object明顯缺乏構造函數。

任何缺少明確定義的構造函數的類都將自動收到default constructor。例如,這是有效的代碼:

class Foo {} 
class Bar extends Foo { 
    public Bar(String baz) { 
     super(); 
    } 
} 

哪裏Object不同是什麼,默認的構造函數包含:

如果所聲明的類是原始類的對象,那麼 默認的構造函數有一個空身體。否則,構造函數的默認構造函數只會調用沒有參數 的超類構造函數。

相關問題