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

Sta*_*wed 41 java inheritance android overriding

有时当我覆盖方法时,我第一次调用它时会出现异常,如下所示:

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()
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ood 41

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

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

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

文档应该告诉您这是否是必需的.如果不是,我会谷歌搜索一些示例代码(或检查API演示......或者更好,请查看源代码!).弄清楚应该不难.

  • 这取决于基类实现.大多数情况下,Android会检查是否使用布尔标志调用了超类方法.例如,在Activity实现中,有一个布尔变量`mCalled`,如果调用了超类方法则设置为`true`,否则设置为`false`.如果基类识别出从未调用过类方法,则会抛出"SuperNotCalledException".您可以通过查看[`Activity`源代码](http://tinyurl.com/7jaog46)自行查看.这是否回答你的问题? (9认同)

Jar*_*red 14

我知道这不是OP的真正意图,他确实提出了这个问题而且我不相信它有一个非常好的答案所以,如果有人想知道"为什么我要打超级?"?如果他们会要求它,为什么他们不这样做呢!!!".这是问题的答案....

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

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

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


Luc*_*fer 9

超级关键字有两个主要用途

1.调用超类的构造函数.

2.访问由子类成员隐藏的超类成员.

那么,为什么有时需要用户超级关键字?答案将是android下4GL语言,这意味着它已经准备好了很多功能.虽然我们覆盖了这些自定义方法,但我们使用了super关键字.

看看android中超级关键字的非常简单的用法(因为我们大部分时间都这样做).

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

super()必须始终是在子类'构造函数内执行的第一个语句.当子类调用super()时,它正在调用其直接超类的构造函数.第二种形式的super最适用于子类的成员名称在超类中使用相同名称隐藏成员的情况.