簡體   English   中英

對象類構造函數中會發生什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM