以下程序
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 = "d ";
System.out.print(this.type + super.type);
}
public static void main(String[] args) {
new Cougar().go();
}
}
产生以下输出。
feline cougar d d
我无法理解为什么super.type
在生成输出并打印f
而不打印局部值d
时没有从超类中获取的值。有人可以在这里提供一些帮助吗?
答案 0 :(得分:1)
这是相反的过程,现在您的type
被合并在一起,当您更改type
的值时,它将覆盖super.type
。
这里有一个简短的示例作为解释:
void go() {
System.out.print(this.type);
type = "d ";
System.out.print(this.type + super.type);
}
输出:
f d d
实际上是将super.type
的值f
更改为d
答案 1 :(得分:1)
尝试以一种简单的方式解释类和对象:
将类视为对象的原型或模型。
当您创建扩展了类A(其他)的类B时,这意味着模型B具有所有A的行为以及一些额外的行为。此外,B还可以覆盖(替代)来自A的某些行为。
直到现在,我们还没有对这些对象说什么。
现在,在main()
中,您正在创建类型B的对象(也称为实例)。
您只有一个对象。因此,您只有一种状态。每个类都不是一个状态,因为状态与实例相关。
这意味着您代码中的type
来自此单个对象。无论是从this
还是super
引用它。
如果覆盖方法,则可以在this
和super
之间达到不同的行为,然后调用这些方法。
尝试一下:
在Feline类中创建方法sayHello()
,打印一些文本。然后,在Cougar类中使用不同的文本创建另一个sayHello()
。
然后,在go()
内,调用:
this.sayHello();
super.sayHello();
答案 2 :(得分:0)
因为除非您将每个type
属性设置为private
,否则type
在父类的所有子级中都是可见的,并且相同({{1} }):您无需更改Feline
'Cougar
,而是type
'Feline
,因为它是继承的。
此示例应使其更清晰:
type