我运行了以下代码:
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
。
有人可以解释一下。
答案 0 :(得分:4)
超类不是子类实例具有的东西,它是子类实例 的东西。您的Cougar
“是”Feline
。 Feline
的所有成员都是Cougar
的成员 - 相同的成员,而不是副本。超类中没有单独的type
- 它与子类中的type
成员相同。您可以将其称为Cougar
的成员或Feline
的成员,它们都是相同的。
答案 1 :(得分:2)
当然 - 每type
个实例只有一个 Cougar
个变量。它由Feline
在Cougar
中声明,由Feline
继承。无论你在哪里更改该变量的值,它都会在任何地方都可见(对于那个对象)。
因此,如果您在type
中有另一种方法打印了c
的当前值,那么也会打印go()
(在您调用{{1}}之后)。
答案 2 :(得分:1)
您尚未在子类中编码字段:
public class Cougar extends Feline {
public String type = "c ";
// ...
}