[英]What will happen If I initialize a Class object which is already initialized in JAVA?
[英]What will happen in Object class constructor
當我們創建任何對象時,它將創建一個默認構造函數並調用super()
例:
Parent(){
super();
}
但是當我查看Object類中沒有構造函數時,調用super()構造函數時會發生什么。
似乎在Object類中根本不存在JVM調用方法,但是無法理解正在發生的事情。
類Object
在每個實例中執行一些本機操作。
Java編譯器保證創建的每個對象都調用Object
構造函數。
這就是每個構造函數都必須以super()
或this()
調用開始的原因。 因此,在每個實例中執行的第一個構造函數都是Object
構造函數。
Object
類主要以本機方式實現,因此構造函數不會調用其父級。 此外,它沒有任何父類,因為在.class
文件中將其設置為null
。 您可以在java .class
文件格式中閱讀有關Java類如何存儲的更多信息。
Java語言本身不允許此類技巧 ,但VM允許使用此類技巧 ,因為對於每個內部類文件,都禁用驗證。
對象的創建取決於JVM。 Java中的每個構造函數都顯示為名為<init>
的特殊方法,該方法負責實例初始化。 此<init>
方法由編譯器提供,並且由於<init>
在Java中不是有效的標識符,因此不能直接在該語言中使用。
JVM如何調用此
<init>
方法?
JVM將使用invokespecial
指令調用<init>
方法,並且只能在未初始化的類實例上調用。
Object類構造函數中會發生什么?
沒有具有默認空構造函數的子類中發生的事情(減去對super()
的調用)。
可以顯式定義默認構造函數,如果沒有定義,則編譯器會為您放入默認構造函數。
有關更多信息,請查看JVM規范和Java語言規范:
盡管關於本機代碼的所有其他答案都是正確的,但是從形式上來說, java.lang.Object
顯然缺少構造函數並沒有什么特別或神秘的地方。
任何缺少顯式定義的構造函數的類都將自動接收默認的構造函數 。 這是有效的代碼,例如:
class Foo {}
class Bar extends Foo {
public Bar(String baz) {
super();
}
}
默認構造函數包含的Object
是不同的:
如果要聲明的類是原始類Object,則默認構造函數的主體為空。 否則,默認構造函數將簡單地調用不帶參數的超類構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.