2013-02-22 69 views
0

我知道在創建類的對象時,構造函數將構建該對象。說我有這兩類:在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構造函數被調用時究竟發生了什麼?我知道有一些類型的默認構造函數,但我不確定它是如何工作的。

任何人都可以用上面的例子解釋我的對象結構嗎?

+2

瞭解引用Java語言規範以找出這些東西。 – 2013-02-22 09:34:38

回答

8

該編譯器提供一個Cardefault constructor其有效地是func()方法:

Car() { 
    super(); 
} 

並且同樣Vehicle作爲默認構造函數爲:

Vehicle() { 
    super(); 
} 

字段初始化作爲初始化的一部分,之後對超類構造函數的調用。因此,它是彷彿Vehicle類實際上是這樣寫的:

class Vehicle { 
    public int a; 

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

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

現在確實有道理?

查看section 15.9.4 of the Java language specification瞭解更詳細的描述。

2

Car constructor被稱爲默認調用它的超級constroctor是由編譯器,然後初始化所有Super class's instance fields。您的a field的初始化過程中,因爲它調用其具有系統輸出從而它打印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
  1. 通知JVM必須構建一個Car
  2. JVM確定它是一個Vehicle,因此觸發Vehicle構造。
  3. JVM知道Vehicle的構造需要初始化int a實例變量。
  4. int a變量必須初始化爲調用func的結果,因此調用func
  5. func已被調用,所以代碼打印「9」
1

我想你是誤解了Car c = new Car();的意思。

該語句創建一個對象引用,該對象的引用是c。語句new Car();創建一個對象,並將該對象的引用存儲在c中。

0

當創建一個對象時,它將啓動該對象中存在的所有實例變量(如果未給定賦值,則將其設置爲其變量的默認值)。

如果一個特定的類(汽車)的默認構造函數被調用,它的超類的默認構造函數的調用(車輛)首先提出。在創建Vehicle對象時,它的即時變量「a」被分配給函數func()並且它將被執行,因此打印9.

相關問題