0

我运行了以下代码:

class Feline {
    public String type = "f ";

    public Feline() {
        System.out.print("feline ");
    }
}

public class Cougar extends Feline {
    public Cougar() {
        System.out.print("cougar ");
    }

    public static void main(String[] args) {
        new Cougar().go();
    }

    void go() {
        type = "c ";
        System.out.print(this.type + super.type);
    }
}

并认为输出会是feline cougar c f,但令我惊讶的是输出是feline cougar c c. 有人可以解释一下。

4

3 回答 3

4

超类不是子类实例所具有的东西,而是子类实例具有的东西。你的Cougar“是” Feline。所有成员Feline都是Cougar- 相同的成员,而不是副本。超类内部没有单独type的 - 它type与子类中的成员相同。你可以称它为Cougar'会员或Feline'会员,都是一样的。

于 2013-07-20T11:04:13.633 回答
2

当然-每个 . 它在中声明并由. 无论您在何处更改该变量的值,它都会随处可见(对于该对象)。typeCougarFelineCougar

因此,如果您有另一种方法Feline可以打印 的当前值type,那么它也会打印c(在您调用 之后go())。

于 2013-07-20T10:57:17.237 回答
1

您尚未对子类中的字段进行编码:

public class Cougar extends Feline {

    public String type = "c ";

    // ...
}
于 2013-07-20T10:59:40.637 回答