为什么我们有时需要在Android中调用超级?
有时候,当我重写方法时,第一次调用如下所示的exception:
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()
? 父母class有义务是有道理的,但更重要的是,我们怎么知道一个方法需要super
被调用,而不是等待它崩溃?
为什么我们不得不调用super.method()?
组成Android SDK的类可能非常复杂。 例如,为了正确运行(即pipe理生命周期,优化内存使用,在屏幕上绘制布局等),活动和碎片都必须执行一些操作。 要求客户端调用基类(通常在方法开始时)确保这些操作仍然被执行,同时仍然为开发者提供合理的抽象级别。
我们如何知道一个
函数方法需要超级被调用?
文件应该告诉你这是否是必需的。 如果不是,我会Googlesearch一些示例代码(或者检查API演示…或者更好的,看看源代码!)。 应该不会太难以弄清楚。
我知道这不是OP的真正意图,他问了这个问题,我不相信这个问题得到了很好的回答,所以如果有人想知道“为什么我要叫超级?”他们会要求的,为什么他们不这样做呢?“ 这是对这个问题的答案….
基本上,super()是一些必须被调用的东西,如果你重写了一些必须被调用的东西,这通常是相当复杂的代码。 现在,他们不只是为你做,而是在你的function之前调用它,这样你才能控制! 😀
更具体地说,如果你调用super(),你不能控制,但是,你可以控制WHEN! 所以,假设你有一些特定的代码需要发生在super()被调用之前,你现在只有在运行你的代码之后才可以自由地调用super()。 或者,让我们说你需要super()已经运行你的代码不会崩溃,你现在可以select在运行你的代码之前运行super(),从而确保一切都为你设置。 哎呀,你甚至可以在技术上重写超类核心,并编写自己的方法,照顾super()本身,并使其不需要调用super(),但99.9%的时间理智的人不需要去做这个! 😛
所以,“为什么我必须调用super()”的简短答案是…因此,您可以控制何时调用它,并在super()运行之后执行操作。 🙂
super关键字有两个主要用途
1.调用超类的构造函数。
2.访问被子类的成员隐藏的超类成员。
那么,为什么需要使用超级关键字呢? 答案将是Android的4GL语言,这意味着它已经准备好了很多function。 虽然我们正在重写这些用于定制的方法,但我们使用super关键字。
在android中看到super关键字的非常简单的用法(正如我们大多数时候所做的那样)。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); . . . }
super()必须始终是在子类的构造函数中执行的第一条语句。 当一个子类调用super()时,它调用它的直接超类的构造函数。 super的第二种forms最适用于子类的成员名称在超类中隐藏成员名称相同的情况。
该要求通常在API文档中直接指定。 例如,请参阅android.widget.ListView.onFinishInflate:
保护无效onFinishInflate()
…
即使子类重写onFinishInflate,也应该始终确保调用super方法,以便调用。
不幸的是,我个人的经验是Android文档质量参差不齐。 所以,我怀疑有些情况下,这个电话是必需的,但没有logging在案。