2017-02-19 39 views
-1

在下面的程序:使用超級回到孩子的價值

class Feline { 
    public String type = "f "; 
    public Feline() { System.out.print("feline "); } 
} 

public class Cougar extends Feline { 
    public Cougar() { System.out.print("cougar "); } 
    void go() { type = "c "; System.out.print(this.type + super.type); } 
    public static void main(String[] args) { 
     new Cougar().go(); //1 
    } 
} 

在這裏,我希望輸出,feline cougar c f但實際產量,feline cougar c c。 應該不是super.type返回超類的type而不是孩子的值?

此外,更換聲明標記爲//1

Feline fe= new Cougar(); System.out.print(fe.type);

將打印fe.typec。所以,超強的type不丟失的話,那麼爲什麼super.type不檢索父類type字段值?

+3

沒有單獨的值,'Cougar'從'Feline'繼承* 1 *'類型'。你修改那個'type'。 –

+1

代碼中只有一個'type'變量被聲明,爲什麼你會認爲它會保存兩個值? – David

+0

@ElliottFrisch我已更新問題。 – Flame

回答

0

這與類擴展的工作方式有關。

當您擴展一個類時,您會像Cougar那樣擴展Feline,您將繼承超類的所有字段(您繼承了所謂的「狀態」)。但是,如果您在孩子中重新定義這些字段,則唯一存在的值將是類樹中最後定義的值(即type字段中的c)。

如果你想保留這兩種類型,你應該定義兩個不同的字段。

+0

但是,用'Feline fe = new Cougar()'替換標記爲'// 1'的語句;因此,super的'type'完全不會丟失,那麼爲什麼'super.type'不能檢索父類類'類型'字段值? – Flame