E.g。 :
public class ClassA extends ClassB {
public void run() {
super.execute();
...................
方法执行仅存在于ClassB中。 使用是否有意义:
super.execute();
可能就够了:
execute();
? 感谢。
答案 0 :(得分:7)
由于execute()
未覆盖ClassA
方法,execute()
等效至super.execute()
。
我认为绝对没有“文档化”的好处,突出了这个方法是在超类中定义的事实。因此,我个人会写execute()
(除非有充分的理由要求super.execute()
如果ClassA
被修改为覆盖execute
)。
答案 1 :(得分:4)
原因:
可预测性(安全?) - 如果有一天有人实施ClassA.execute()
,代码的工作方式会有所不同。即使是某些子类ClassA
也会覆盖execute()
,保留ClassA
完整。
效果 - 超级电话可能比虚拟更快。 super
使用invokespecial
(单一调度,就像private
方法)实现,而普通调用非私有方法则使用双重调度(虚拟调用)。这是现代JVM中的一个弱优势。
底线:如果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类方法之后,您可以为子类构造特定的逻辑。就像你在父类方法中有一些通用的功能和子类中的特定功能(除了父有什么)。