调用 super 方法是否有意义?

发布于 2024-12-29 06:22:13 字数 286 浏览 1 评论 0原文

例如:

public class ClassA extends ClassB { 


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

方法execute仅存在于ClassB中。 : 有意义吗

super.execute();

使用:可能就足够了

execute();

? 谢谢。

E.g. :

public class ClassA extends ClassB { 


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

Method execute exists only in ClassB.
Does it make sense to use:

super.execute();

may be enough:

execute();

?
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

臻嫒无言 2025-01-05 06:22:13

由于 ClassA 中没有重写 execute() 方法,因此 execute()super 等价 .execute()

我认为强调该方法是在超类中定义的事实绝对没有“文档”好处。因此,就我个人而言,我会编写 execute() (除非有充分的理由在 ClassA 被修改为覆盖 classA 时调用 super.execute()代码>执行)。

Since the execute() method is not overridden in ClassA, execute() is equivalent to super.execute().

I see absolutely no "documentational" benefit of highlighting the fact that the method is defined in the super class. Thus personally I would write execute() (unless there were strong reasons to call super.execute() if ClassA was ever modified to override execute).

暗恋未遂 2025-01-05 06:22:13

原因:

  1. 可预测性(安全?) - 如果有一天有人实现ClassA.execute(),代码的工作方式将会有所不同。即使有人子类化 ClassA 并覆盖 execute(),保持 ClassA 完好无损,情况也是如此。

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

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

Reasons:

  1. Predictability (safety?) - if one day somebody implements ClassA.execute(), the code will work differently. This is also the case even is somebody subclasses ClassA and overrides execute(), leaving ClassA intact.

  2. Performance - super call may be faster than virtual. super is implemented using invokespecial (single dispatch, just like private method), while ordinary call to non-private method uses double dispatch (virtual call). This is a weak advantage in modern JVMs.

Bottom line: if ClassB.execute() is final, using super has no sense.

峩卟喜欢 2025-01-05 06:22:13

不,只需调用execute()即可。由于方法未被重写super.execute() 将具有与 this.execute() 相同的结果,这与执行()

No, simply call execute(). Since the method is not overridden, super.execute() would have the same result as this.execute(), which is the same as execute().

暮色兮凉城 2025-01-05 06:22:13

调用super就可以了。

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

相反,如果您想调用execute,无论它是什么......不要使用super

super 保留字通常存在,用于从重写方法调用重写方法。

It's ok to call super.

If you want to ensure you are calling the parent class method, then use super. So if you introduce the method later in ClassA, code will not break.

By the contrary, if you want to call execute whatever it is... don't use super.

super reserved word exist normally to call to the overriden method from the overrider one.

落叶缤纷 2025-01-05 06:22:13

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

According to the java syntax this is correct. but when it comes to the real software engineering concepts this wont make any sense at all.I would suggest you to override run method in class B and then call the super class method inside that. After calling the supper class method you can construct you specific logic for the subclass. Its like you have some generic functionalities in the parent method and specific functionalities (in additions to what parent has) in sub class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文