2017-02-19 45 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