如果我不在扩展 类 中调用可选的超级方法或构造函数会怎样?

What happens if i don't call optional super methods or constructors in extended classes?

让我们考虑一下 Asynctask class。

它有可覆盖的方法,例如onPreExecuteonProgressUpdate等。 如果我不添加 super.'method-name' 等,编译器不会给出错误。所以我应该做还是不做?当我们不必调用时调用(或不调用)超级方法有什么好处

当我们考虑扩展 EditText class 时,在您自定义之后,您肯定需要调用超级构造函数。

注意:我说的是可选的超级调用。

因为它们是空方法,所以您不必调用它们。它们只是供您用于覆盖。

一般来说,作为面向对象编程的规则:除非你有充分的理由打破它,并且你确切地知道 super class 方法实现的全部内容,否则你应该始终调用 super class 方法。

AsyncTask 的特定情况下 - 不需要调用超级 class 方法,只是因为它不执行任何代码。

相反的例子:如果你不调用 Activity 回调的超级方法,例如 onCreate()onDestroy() 你将完全破坏 activity,并且可能什么都行不通。这是因为此方法的超级 class 实现需要每个 activity 执行大量操作。

所以结论是,如果您不是基础的作者 class - 请查找提供有关您要重写的方法的任何提示的文档,以便知道如何重写,如果有的话,您应该调用超级 class 方法。

如果您不调用 superclass 的方法,那么......superclass 的方法不会被调用。这是否是一个问题完全取决于 superclass 方法的作用。如果它是可选的,如您所说,则在需要时调用它(例如,您的逻辑需要它所做的一切),如果不需要则不要调用它。

如果 superclass 的方法是 empty,对它的调用进行编码的唯一原因是如果您重新设置 class 的基数。例如,假设你有 A 作为一个空 foo 方法的基础,并且 B 从它派生(class B extends A)。稍后,您希望能够将其更改为 class B extends SpecialA,其中 SpecialAA 的特殊版本,其中 foo 执行某些操作。如果您在 Bfoo 中遗漏了 supercall,则必须记得添加它。如果你一开始就包含它,你就不必记得添加它。

必须发生的唯一超级调用是在构造对象,但如果您将其遗漏,编译器将提供对零参数版本的调用 [例如,super()]。但这是构造函数,而不是方法。)