簡體   English   中英

在調用Constructor之前,是否在堆上創建了對象?

[英]Does object in java created on heap before Constructor is invoked?

當從基類的構造函數調用重寫方法時,也根據運行時多態性概念調用子類中定義的方法。 我想知道如何在JVM中處理這個問題,當控件在基類構造函數中時,子類的構造函數尚未被調用,因此Object尚未完全構造。

我理解從基類構造函數調用override方法的不良影響,但只是希望了解如何使其成為可能。

我覺得堆中的對象是在調用構造函數之前創建的,並且在調用構造函數時會初始化屬性。 請為上述內容提供寶貴的意見。

以下是演示相同的代碼。

Base.java

public class Base {
    public Base() {
            System.out.println("Base constructor is executing...");
            someMethod();
    }

    public void someMethod() {
            System.out.println("someMethod defined in Base class executing...");
    }
}

Sub.java

public class Sub extends Base{
    public Sub() {
            System.out.println("Sub constructor is executing...");
    }
    @Override
    public void someMethod() {
            System.out.println("someMethod defined in Sub class executing...");
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
            Sub obj = new Sub();
    }
}

控制台上的輸出是

基礎構造函數正在執行...

someMethod在Sub類中執行...

子構造函數正在執行...

是否在調用Constructor之前創建了java中的對象?

是的,否則您將無法初始化對象。

在字節代碼級別,首先創建對象,然后調用構造函數,傳入對象以進行初始化。 構造函數的內部名稱是<init> ,它的返回類型總是為void這意味着它不返回對象,只是初始化它。

注意: Unsafe.allocateInstance將在不調用構造函數的情況下創建對象,並且對反序列化很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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