在java的繼承觀念中,理論上父類別是不能呼叫到子類別的方法

 

因為父類別根本不知道本身會被哪個子類別給繼承到

 

但是在某些特殊情況下,當子類別override父類別的方法後

 

父類別有可能實際上呼叫到子類別重新定義的方法

 

下面舉一個例子來做解釋,有兩個具有繼承關係的類別Animal和Bird

 

Bird類別重新定義了Animal的getDesc()方法

 

class Animal
{
//desc實例變數儲存對像toString方法的傳回值
private String desc;
public Animal()
{
//呼叫getDesc()方法初始化desc實例變數
this.desc = getDesc();
}
public String getDesc()
{
return "Animal";
}
public String toString()
{
return desc;
}
}

 

public class Bird extends Animal
{
    //定義name、weight兩個實例變數
    private String name;
    private double weight;
    public Bird(String name , double weight)
    {
        //為name、weight兩個實例變數給予值
        this.name = name;
        this.weight = weight;
    }
    //重新定義父類別的getDesc()方法
    @Override
    public String getDesc()
    {
        return "Bird[name=" + name + " , weight="
            + weight + "]";
    }
    public static void main(String[] args)
    {
        System.out.println(new Bird("一隻鳥" , 32.3));
    }
}

實際跑出的結果

Bird[name=null , weight=0.0]


從輸出結果可看出,就算在建立Bird物件時給予適當的參數,


跑出的結果並沒有抓到實際給定的參數


這是因為如果父類別建構子呼叫了被子類別重新定義的方法


且透過子類別建構子來建立子類別的物件時呼叫了父類別的建構子


就會導致子類別的重新定義方法在子類別建構子的所有程式碼之前被執行


導致子類別的重新定義方法存取不到子類別的執行個體變數值的情形

 

因此必須避免父類別的建構子中呼叫被子類別重新定義過的方法

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 RandyPan 的頭像
    RandyPan

    有問不一定答得出來

    RandyPan 發表在 痞客邦 留言(0) 人氣()