为什么我们有时必须在Android中调用super?

2022-09-01 00:02:25

有时,当我重写方法时,我在第一次调用它时会遇到异常,如下所示:

05-31 21:32:04.266: E/AndroidRuntime(28471): android.support.v4.app.SuperNotCalledException: 
Fragment AnalFragment{41795860 #1 id=0x7f070002} did not call through to super.onDestroy()

为什么我们被迫打电话?父类有义务是有道理的,但更重要的是,我们怎么知道需要调用一个方法,而不是等待它崩溃?super.method()super


答案 1

为什么我们被迫调用 super.method()?

构成 Android SDK 的类可能非常复杂。例如,活动和片段都必须执行许多操作才能正常运行(即管理生命周期,优化内存使用,将布局绘制到屏幕上等)。要求客户端调用基类(通常在方法的开头)可确保仍执行这些操作,同时仍为开发人员提供合理的抽象级别。

我们怎么知道函数方法需要调用super?

文档应告诉您是否需要这样做。如果没有,我会在Google上搜索一些示例代码(或检查API演示...或者更好的是,看看源代码!弄清楚应该不会太难。


答案 2

我知道这不是OP的真正意图,他确实问了这个问题,我不相信它得到了一个很好的答案,所以,如果有人想知道“为什么我必须打电话给超级?!?如果他们需要它,他们为什么不为我做这件事!!!”。这是这个问题的答案....

基本上,super()是必须调用的东西,如果你要覆盖必须调用的东西,这通常是相当复杂的代码。现在,他们不只是为你做这件事,并在你的函数之前调用它,主要是因为你有控制权!:-D

更具体地说,你无法控制如果你调用super(),但是,你可以控制什么时候!所以,假设你有一些特定的代码需要在super()被调用之前发生,你现在只有在运行代码后才可以自由地调用super()。或。。。假设您已经运行了 super() 才能使代码不崩溃,现在您可以选择在运行代码之前运行 super(),从而确保为您设置了所有内容。哎呀,你甚至可以在技术上覆盖超类硬核,并编写自己的方法来照顾super()本身,并让它变得所以你不必调用super(),但是99.9%的时间理智的人不需要这样做!:-P

因此,“为什么我必须调用super()”的简短答案是......这样您就可以控制何时调用它,并在 super() 运行之前或之后执行操作。:-)


推荐