2009-11-04 96 views
0

在以下代碼:派生構造

import java.io.*; 

public class MyClass1 
{ 
    MyClass1() 
    { 
     System.out.println("base class"); 
    } 
    public void print() 
    { 
     System.out.println("base print"); 
    } 
} 

class ChildClass extends MyClass1 
{ 
    public ChildClass() 
    { 
     System.out.println("child class"); 
    } 
    public void print() 
    { 

     System.out.println("child print"); 
    } 
} 

爲什麼是它,當我創建類型的實例ChildClass也執行的基類的構造函數??

回答

2

因爲那正是應該發生的:-)

派生的類使用的基類爲基礎。在OO中說它is-a基類。該基類也需要初始化,因此必須調用它的構造函數。

從你的例子中不明顯,但如果你給你的基類一些(保護)成員,它會更有意義。在基礎構造函數中初始化它們,因此在構造時從派生類中查看期望值。

見下文。字段value在子類中可見。作爲初始值,你會期望什麼?

public class MyClass1 
{ 
    protected int value; 
    MyClass1() 
    { 
     System.out.println("base class"); 
     this.value = 42; 
    } 
} 

class ChildClass extends MyClass1 
{ 
    public ChildClass() 
    { 
     // what would you expect 'value' to be here ? 
     System.out.println("child class " + value); 
    } 
} 
5

因爲你的子類擴展的基類 - 它的基類的一個實例,具有所有的相同的字段和變量等。因此,基類也必須被實例化的。

對於一個具體的例子,假設你的基類具有如下所示:

public class Base 
{ 
    final private int id; 

    public Base() 
    { 
     this(-1); 
    } 

    public Base(int id) 
    { 
     this.id = id; 
    } 

    public getId() 
    { 
     return id; 
    } 
} 

最後變量是保證類被構造時被實例化。你的子類將有一個id字段(即使它不能直接用子方法訪問它),並且由於這個字段是私有的,所以你不可能用子構造函數實例化它 - 所以基類構造函數必須調用

請記住,這是不是隻與最後的變量的問題,也不是唯一的,你可以使用任何特殊的功能 - 因爲你的子類一個基類,它需要被正確實例作爲一個。

0

因爲編譯器默認在子類構造函數中添加super()構造函數,如果沒有指定的話。每個構造函數在有繼承時都應該有this(),如果沒有繼承或者super()方法。爲了說明這一點,我採取了這個例子。

public class Vehicle { 
    protected int wheels; 
    protected int lights; 

    Vehicle(){ 
     System.out.println("Vehicle Class Constructor"); 
     this.wheels=4; 
     this.lights=2; 
    } 
} 

車輛是父類

class Car extends Vehicle { 
    public Car(){ 
    #Compiler add the super() constructor by default 
     System.out.println("Car class constructor"); 
    } 
} 

車是兒童類

public class TestCar { 
    public static void main(String args[]){ 
     Car c = new Car(); 
     System.out.println("Wheels" + c.wheels); 
     System.out.println("Lights" + c.lights); 
    } 
} 

在上面的代碼片斷。當我在編譯的時候編譯TestCar.java文件編譯器查找對於Car構造函數,檢查Car類是否有任何父類,只要它檢查到Car類擴展了父類Vehicle,就會檢查用戶是否在繼承樹中提供了super()。如果不是,則增加一個。

希望這會有所幫助!