超级关键字歧义

时间:2018-10-20 02:17:44

标签: java super

以下程序

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时没有从超类中获取的值。有人可以在这里提供一些帮助吗?

3 个答案:

答案 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引用它。


如果覆盖方法,则可以在thissuper之间达到不同的行为,然后调用这些方法。

尝试一下: 在Feline类中创建方法sayHello(),打印一些文本。然后,在Cougar类中使用不同的文本创建另一个sayHello()
然后,在go()内,调用:
this.sayHello(); super.sayHello();

答案 2 :(得分:0)

因为除非您将每个type属性设置为private,否则type在父类的所有子级中都是可见的,并且相同({{1} }):您无需更改Feline'Cougar,而是type'Feline,因为它是继承的。

此示例应使其更清晰:

type