【问题标题】:Does exists sense to call method of super?调用超级方法是否存在意义?
【发布时间】:2012-02-19 15:06:10
【问题描述】:

例如:

public class ClassA extends ClassB { 


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

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

super.execute();

可能就够了:

execute();

? 谢谢。

【问题讨论】:

  • 在这种情况下,execute() 与 super.execute() 相同,但情况并非总是如此,子类可以覆盖父类的方法,在这种情况下,它有助于清楚地告诉编译器哪个方法你在打电话。
  • @anubhava:我应该说“这有助于清楚地告诉其他读者....” :)

标签: java inheritance methods super


【解决方案1】:

由于ClassA 中没有覆盖execute() 方法,因此execute() 等效于super.execute()

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

【讨论】:

  • 这种情况:方法执行只存在于ClassB中。
  • 作者提到这个方法没有被覆盖,因为它只位于基类中。
【解决方案2】:

原因:

  1. Predictability(安全性?) - 如果有一天有人实现ClassA.execute(),代码的工作方式会有所不同。即使有人继承ClassA 并覆盖execute(),而使ClassA 保持不变,情况也是如此。

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

底线:如果ClassB.execute()final,则使用super 没有意义。

【讨论】:

  • +1,很好的答案。与往常一样,出于性能考虑,在调整代码之前先对程序进行概要分析。
【解决方案3】:

不用,只需致电execute()。由于方法未被覆盖super.execute() 将与this.execute() 具有相同的结果,这与execute() 相同。

【讨论】:

    【解决方案4】:

    拨打super即可。

    如果要确保调用父类方法,请使用super。所以如果后面在ClassA中引入该方法,代码不会中断。

    相反,如果你想调用execute,不管它是什么......不要使用super

    super 保留字通常存在用于从覆盖者调用被覆盖的方法。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 2010-09-05
        相关资源
        最近更新 更多