簡體   English   中英

在Java中實例化對象時,究竟發生了什么?

[英]What exactly happens when an object is instantiated in Java?

我知道在創建類的對象時,構造函數會構建該對象。 說我有這兩堂課:

class Vehicle {
    public int a = func();

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}

class Car extends Vehicle  {

    public static void main(String[] args) {
        Car c = new Car();
    }
} 

該項目的輸出為“ 9”。 但是為什么會這樣呢? 調用Car構造函數時會發生什么? 我知道有某種類型的默認構造函數,但是我不確定它是如何工作的。

誰能用上面的例子解釋我的對象構造?

編譯器為Car提供了一個默認的構造函數 ,該構造函數實際上是:

Car() {
    super();
}

同樣, Vehicle作為以下內容的默認構造函數:

Vehicle() {
    super();
}

在調用超類構造函數之后,將字段初始化為初始化的一部分。 因此,好像 Vehicle類實際上是這樣編寫的:

class Vehicle {
    public int a;

    Vehicle() {
        super();
        a = func();
    }

    public int func() { 
        System.out.println("9"); 
        return 9;
    }
}

現在有意義嗎?

有關更詳細的描述,請參見Java語言規范的15.9.4節

Car constructor被調用時,其超級構造函數將由編譯器進行默認調用,然后編譯器會初始化所有Super class's instance fields a field初始化期間,因為它調用具有sysout的func()方法,因此將輸出9。

public Car() {
super();// this invokes parent class's default cons
}

public Vehical() {
super();// invokes Object constructor then initializes all the instance variables of class vehical
}
  1. JVM被告知必須構造Car
  2. JVM確定它是Vehicle ,因此觸發了Vehicle構造。
  3. JVM了解到, Vehicle的構造需要初始化int a實例變量。
  4. int a變量必須初始化是調用的結果func所以func被調用。
  5. func已被調用,因此代碼顯示為“ 9”

我認為您誤解了Car c = new Car();的含義Car c = new Car();

該語句創建一個對象引用,並且該對象的引用為c 聲明new Car(); 創建一個對象,並將該對象的引用存儲在c發送。

創建對象時,它將初始化該對象中存在的所有實例變量(如果未指定賦值,則返回其變量的默認值)。

如果調用了某個特定類( Car )的默認構造函數,則將首先對其父類( Vehicle )的默認構造函數進行調用。 並且在創建Vehicle對象時,將其即時變量“ a”分配給函數func()並將其執行,因此輸出9。

暫無
暫無

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

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