繁体   English   中英

java显式调用super方法

[英]java explicitly call super method

有没有理由从超级班级调用方法?

我遇到过很多地方调用super方法而不是this方法,例如:

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

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

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

除非你覆盖方法getValue(...)并且你确定 (你的确定值得在代码中注释)你想绕过它,你不应该像你正在做的那样使用super 稍后,如果您或其他人决定覆盖getValue(...)他们可能希望效果也适用于getCustomValue()

虽然你绝对可以从myMethodTwo()调用super.myMethodOne() ,但通常的情况是你想要在覆盖它时从myMethodOne()调用super.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();
    }
}

有使用没有技术优势, superthis在方法不覆盖的情况。

但是,有人可能会说,出于你刚刚提到的原因,使用super而不是this更清楚。 如果覆盖子类中的函数,则需要使用super ; 如果你不这样做,你可以使用this 而不是玩猜谜游戏(或迫使人们检查方法是否已被重写),你可以随时使用super当你的意思是super

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM