调用从Base类继承的方法的最佳方法:使用this,super或隐式调用

时间:2011-09-21 14:20:24

标签: java inheritance

我认为这不是一个非常有用的问题,但我认为有人可以说smth批评。

public class Base{
    public void boo(){}
}

public class Derivative extends Base{

1:public void useBoo(){
    boo();
}

2:public void useBoo(){
    this.boo();
}

3:public void useBoo(){
    super.boo();
}
}

[编辑]

我之所以提出这个问题的原因是:避免将来重新编译或命名混淆。并使代码具有更高的可读性和灵活性,以适应未来的变化。

6 个答案:

答案 0 :(得分:2)

最好用的是你觉得最清楚的。

顺便说一句:如果你向Derived添加boo方法,第一个例子的行为将与第三个例子不同。

答案 1 :(得分:2)

如果你想确保调用的方法是超类方法,一定要使用super:

super.boo();

如果要使用当前类中定义的方法,如果不存在,请使用super方法:

this.boo();
//or
boo();

就个人而言,在第二种情况下,如果类是层次结构的一部分,我更喜欢显式使用this.boo(),因为读取代码更清楚,以了解该方法的位置。但这是我的意见。

答案 2 :(得分:1)

使用前两个中的一个,除非您明确要限制对超类实现的调用。

当覆盖超类方法,并希望包含超类方法的行为时,请使用第三种方法。

在其他地方,如果你使用第三个,后来你或其他人覆盖了boo()的超类实现 - 在这个类或子类中 - 那么useBoo()将不会使用覆盖。除了覆盖boo()本身之外,这通常是不可取的。

示例:

/** Extends boo method. */
public void boo(){
    super.boo();   // Good: you explicitly want to call the superclass method, not call this method again.
}

public void doSomethingThatInvolvesBoo() {
    boo();        // Good -- will call this object's implementation,
                  // even if this is a subclass, even if there are code changes later.
    this.boo();   // Good (and equivalent to simply calling boo()).
    super.boo():  // Usually bad.
}

答案 3 :(得分:1)

我只会使用1和2(在我的情况下,我更喜欢2,我喜欢明确我的意图)

public void useBoo(){
    this.boo();
}

我不会使用3,因为它在语义上意味着其他东西,请记住Derivative也可以扩展,boo()可以在类层次结构中进一步覆盖,除非你特别想要调用Base.boo()您不应使用super关键字。

答案 4 :(得分:0)

有没有什么能阻止你调用boo()?或者你在自己的代码中覆盖它? 1和2做同样的事情,3调用Base的方法。

编辑:正如Simeon所说,使用super会很清楚你是从Base类调用该方法。

答案 5 :(得分:0)

考虑到可读性super可能是最好的,因为它说这里我正在调用超类的方法

虽然有了this,你可能会想知道'这个方法到底是什么地方..哦,确定它在超级课程中'