java显式调用super方法

时间:2012-11-24 21:35:09

标签: java inheritance

有没有理由从超类调用方法?

我遇到了许多调用super方法而不是this方法的地方,例如:

public String getCustomValue() {
    String value = (String) super.getValue(someArgHere);
    return value;
}

有什么好处?我只看到继承的一个主要问题:如果我在此类或其中一个后代getValue中覆盖getCustomValue,则会忽略该覆盖并调用super方法。

6 个答案:

答案 0 :(得分:2)

super.getValue(someArgHere)调用超类的getValue方法。相反,this.getValue(someArgHere)调用当前类的getValue方法(如果已定义)。如果当前类没有覆盖getValue,则调用超类方法。

答案 1 :(得分:2)

除非你覆盖方法getValue(...)并且非常确定(你的确定值得在代码中发表评论)你想绕过它,否则你不应该使用super之类的你在干嘛如果您或其他人决定覆盖getValue(...),他们可能希望效果也适用于getCustomValue()

虽然您绝对可以从super.myMethodOne()拨打myMethodTwo(),但通常的情况是,当您覆盖super.myMethodOne()时,要覆盖myMethodOne()。像Ruby这样的语言甚至会自动为你传递方法参数,这样你就不必重新输入它们了。

以下是一个例子:

public class A {
    public void close() {

      // do a bunch of things...
    }
}

public class B extends A {
    @Override
    public void close() {
        // close things related to the subclass B
        // and then make sure A is closed as usual...
        super.close();
    }
}

答案 2 :(得分:1)

在未覆盖方法的情况下,使用super优于this没有技术优势。

但是,有人可能会说使用super而不是this更清楚,因为您刚刚提到过。如果覆盖子类中的函数,则需要使用super;如果你不这样做,可以使用this。而不是玩猜谜游戏(或强迫人们检查方法是否被覆盖),你可以总是使用super,而不是super

答案 3 :(得分:1)

  

我只看到继承的一个主要问题:如果我在此类中覆盖getValue或在其中一个后代中getCustomValue将忽略该覆盖并调用super方法。

然后不要明确调用super方法,只需调用getValue即可。如果方法尚未被覆盖,则默认为超级方法。如果有,它将使用overriden方法。

我不知道在这种情况下询问“好处”是否合适 - 这实际上取决于你究竟想要完成什么。

答案 4 :(得分:0)

事情就是设计。当我们编码时,我们按照它是什么做的! 所以即使getValue被扩展,它也是完美的,因为这是你的班级想要做的。

通常情况下,super用于从super type获取任何信息或数据或副作用,并根据您当前的类功能修改或改进它

答案 5 :(得分:0)

唯一的好处是,如果您的类重写了超类的方法,您仍然可以使用super调用超类的方法。