[英]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
}
Car
。 Vehicle
,因此觸發了Vehicle
構造。 Vehicle
的構造需要初始化int a
實例變量。 int a
變量必須初始化是調用的結果func
所以func
被調用。 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.