2012-11-24 55 views
3

有没有任何理由从超类调用方法?java明确调用super方法

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

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

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

+0

@TomaszNurkiewicz,所以我可以调用'this.getValue(someArgHere)' –

回答

1

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

但是,有人可能会说因为刚刚提到的原因,使用super而不是this会更清楚。如果您覆盖子类中的函数,那么您将需要使用super;如果你不是你可以使用this。而不是玩猜谜游戏(或迫使人们检查该方法是否被覆盖),当您的意思是super时,您可以使用总是使用super

+0

+1的猜谜游戏。我相信一个有经验的人不会花很多时间来理解背后的逻辑,但对于新人来说,这会让事情变得复杂。如果我的属性与参数名称相同,我甚至会使用'this'。 – HRgiger

2

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

0

事情就是设计。当我们编码时,我们按照它的内容来做! 所以即使getValue被扩展,它的完美,因为这是你的班级应该做的。

通常情况下,super时,获得来自super type任何信息或数据副作用,修改或完善它按当前类的功能

1

我刚看到继承一个大问题:如果我覆盖此类中的getValue或其后代getCustomValue将忽略该覆盖和调用超级方法。

那么请不要直接调用super方法,只需拨打getValue即可。如果方法没有被覆盖,它将默认为超级方法。如果有,它将使用重写方法。

我不知道在这种情况下询问“好处”是否合适 - 这实际上取决于您要完成的工作。

0

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

2

除非你改写方法getValue(...),你真的相信(你的踏实,值得在代码中的注释),你想绕过它,你不应该使用super像你在做什么。稍后如果您或其他人决定覆盖getValue(...),他们可能希望效果也适用于getCustomValue()

虽然你绝对可以称之为从myMethodTwo()super.myMethodOne(),通常的情况是,当你想调用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(); 
    } 
}