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

时间:2015-01-29 14:23:44

标签: java android android-asynctask

让我们考虑一下Asynctask类。

它具有可重写的方法,例如 onPreExecute onProgressUpdate 等。 如果我不添加super,编译器不会出错。' method-name'等我应该这样做吗?当我们不必调用时,调用(或不调用)超级方法有什么好处

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

注意:我在谈论可选的超级电话。

3 个答案:

答案 0 :(得分:2)

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

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

相反的示例:如果您不调用Activity回调的超级方法,例如onCreate()onDestroy(),您将完全破坏活动,并且可能没有任何效果。这是因为这种方法的超类实现需要从每个活动中获取大量的东西。

所以结论是,如果你不是基类的作者 - 寻找提供任何关于方法的提示的文档,以便知道如何,以及如果你应该调用超类方法。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果你没有调用超类的方法,那么...超类的方法不会被调用。这是否是一个问题完全取决于超类方法的作用。如果它是可选的,如你所说,如果你需要,可以打电话(例如,你的逻辑需要它做什么),如果你不这样做就不要打电话。

如果超类的方法是为空,那么对其进行编码编码的唯一原因就是你重新安排了你的课程。例如,假设您以A为基础,使用空foo方法,并B从中派生class B extends A。之后,您希望能够将其更改为class B extends SpecialA,其中SpecialAA的特殊版本foo。如果您已离开B foo的超级电话,则必须记住添加它。如果你把它包括在内,你就不必记得添加它。

发生的唯一超级调用是在构造对象时调用超类的构造函数,但是如果你把它留下来,编译器将提供对零参数版本的调用[例如,super()]。但这是一个构造函数,而不是方法。)