【问题标题】:Using this. or super. when calling a method that exist in a superclass and a subclass使用这个。或超级。当调用存在于超类和子类中的方法时
【发布时间】:2013-02-20 02:45:04
【问题描述】:

有一个名为 Champion 的类,它有一个 Skill 数组作为实例变量。

它实现了一个名为“public final Skill[] getSkills()”的方法,其中 Skill[] 是另一个名为 Skill 的对象的数组。

有一个名为 Support 的子类实现了一个名为“public final boolean canHeal()”的方法,用于检查方法 canHeal 中的技能数组。

我应该写“Skill[] x = this.getSkills()”还是:Skill[] x = super.getSkills()”来获取 Skill 数组以及为什么?

请记住,getSkills 方法仅在 Champion 类中定义,在 Support 类中不会被覆盖。

提前致谢。

【问题讨论】:

    标签: java oop inheritance reference this


    【解决方案1】:

    你不应该这样做。添加this. 只是多余的,如果将来您覆盖getSkills(),添加super. 可能会破坏您的课程。所以就这样做吧:

    Skill[] x = getSkills();
    

    在当前情况下它只会调用超类中定义的方法,如果将来你有理由重写getSkills()(例如因为你的类使用了不同的方式,或者有额外的条件),它将是自动使用;这比继续调用超类方法更有可能是正确的行为。

    一般来说,如果您需要,您应该只在被覆盖的方法中调用super.someMethod()(例如,为了不重复某些逻辑或副作用)。仅当您确定不想要自己的实现,而是您的超类的实现时,才应该在其他方法中使用它。

    【讨论】:

      【解决方案2】:

      我认为最好不使用super调用该函数。

      首先 - 现在有所不同。 将来,如果您在课堂上重写此函数,将很难发现(或至少需要注意)。

      如果你重写你的函数,你可能想在里面调用super.getSkills()。

      【讨论】:

      • 对,super 打破了 Java 中每个方法的虚拟方面。所以最好只在需要打破它时使用。
      【解决方案3】:

      我认为您可以使用任何一种,因为 Support 是冠军,但使用 super.getSkills 会使代码更清楚地表明您正在调用超类中的方法。

      【讨论】:

      • 如果将来在此类(或其子类)中重写 getSkills() 方法,则更有可能添加错误。
      【解决方案4】:

      super 关键字允许您调用您的类覆盖或隐藏的方法的基类版本。

      如果你的类没有单独的getSkills() 方法,super 将不起作用。

      【讨论】:

      • 所以我写这个。或超级。他们也会这样做,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2015-07-10
      • 2019-08-20
      • 1970-01-01
      • 2020-03-02
      • 2021-11-10
      相关资源
      最近更新 更多