调用超级方法存在意义吗?

时间:2012-01-26 14:24:35

标签: java inheritance methods super

E.g。 :

public class ClassA extends ClassB { 


public void run() {
  super.execute();
 ...................

方法执行仅存在于ClassB中。 使用是否有意义:

super.execute();

可能就够了:

execute();

? 感谢。

5 个答案:

答案 0 :(得分:7)

由于execute()未覆盖ClassA方法,execute() 等效super.execute()

我认为绝对没有“文档化”的好处,突出了这个方法是在超类中定义的事实。因此,我个人会写execute()(除非有充分的理由要求super.execute()如果ClassA被修改为覆盖execute)。

答案 1 :(得分:4)

原因:

  1. 可预测性(安全?) - 如果有一天有人实施ClassA.execute(),代码的工作方式会有所不同。即使是某些子类ClassA也会覆盖execute(),保留ClassA完整。

  2. 效果 - 超级电话可能比虚拟更快。 super使用invokespecial(单一调度,就像private方法)实现,而普通调用非私有方法则使用双重调度(虚拟调用)。这是现代JVM中的一个弱优势。

  3. 底线:如果ClassB.execute()final,则使用super毫无意义。

答案 2 :(得分:3)

不,只需致电execute()即可。由于方法未被覆盖super.execute()this.execute()的结果相同,与execute()相同。

答案 3 :(得分:3)

可以拨打super

如果您想确保调用父类方法,请使用super。因此,如果您稍后在ClassA中介绍该方法,则代码不会中断。

相反,如果您想呼叫execute无论是什么......请勿使用super

通常存在

super保留字来从覆盖者调用overriden方法。

答案 4 :(得分:0)

根据java语法,这是正确的。但是当谈到真正的软件工程概念时,这根本就没有任何意义。我建议你重写B类中的run方法,然后在其中调用超类方法。在调用supper类方法之后,您可以为子类构造特定的逻辑。就像你在父类方法中有一些通用的功能和子类中的特定功能(除了父有什么)。