子類繼承父類的建構函式(方法)嗎?

zenny_chen發表於2007-09-23

        最近我看見有人問過這個問題。在此我想表達一下自己的觀點。

        根據物件導向中關於繼承這個概念——子類繼承父類所有的屬性和方法。那麼既然是所有的那麼本人認為也應當也包括建構函式(方法)。 

        我先舉一個C++的例子:

 

class Parent
{
private:

    
int p;

public:

    Parent(
void) : p(0)
    
{

    }


    Parent(
int i) : p(i)
    
{

    }

}
;


class Child : public Parent
{
private:

    
int c;

public:

    Child(
void) : Parent(), c(0)
    
{
        
// 在這裡,建立Child物件時先構造父類域
    }


    Child(
int i) : Parent(i + 1), c(i)
    
{
        
// 同上
    }

}
;

 

        如何證明Child類繼承了Parent類的兩個建構函式呢?

        由於建構函式非常特別,對它的呼叫就像是呼叫一個C函式一樣,而不是利用物件來呼叫的(若不先構造物件哪兒來的物件?)。因此鑑於這份特殊性我們可以這麼考慮:

        將上述程式碼中class Child : public Parent——去掉“: public Parent”,我們可以編譯試試,是否能成功。事實上正是因為Parent與Child有親子關係,所以Child建構函式中可以呼叫Parent的建構函式先對其Parent域進行初始化。這個特點非常符合工程學——詳見我的文章《我比起Java更喜歡C++的理由——語義》。

        下面將貼出相應的Java程式碼:

class Parent {

    
private int p;

    
public Parent() {

        p 
= 0;
    }


    
public Parent(int i) {
    
        p 
= i;
    }

}



class Child extends Parent {

    
private int c;

    
public Child() {

        
super();
        c 
= 0;
    }


    
public Child(int i) {

        
super(i + 1);
        c 
= i;
    }

}


 

        我們可以看到,在Java中可以利用super關鍵字來訪問本類父類的構造方法。這樣在一定程度上也消除了歧異性——比如你也可以在Child類中的某一個方法中這麼寫:Parent p = new Parent();而利用super()就表示了子類在初始化本類域前先初始化其父類域。這也可以證明在Java中子類繼承父類構造方法,並且子類可以通過 super來訪問父類的構造方法,只要父類的構造方法不是private。

相關文章