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

Java 为什么我们有时必须在Android中调用super?,java,android,inheritance,overriding,Java,Android,Inheritance,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() 为什么我们必须调用super.method()?父类有义务是有道理的,

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

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
,而不是等待它崩溃?

该要求通常直接在API文档中指定。例如,请参见android.widget.ListView.onfinish充气:

充气时受保护的空隙()

即使子类重写onfinish膨胀,它们也应该始终确保调用super方法,以便调用我们

不幸的是,我个人的经验是Android文档的质量参差不齐。因此,我怀疑在某些情况下,电话是必需的,但没有记录在案

为什么我们必须调用super.method()

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

我们如何知道函数方法需要调用super


文档应该告诉您这是否是必需的。如果没有,我会在谷歌上搜索一些示例代码(或者查看API演示……或者更好,看看源代码!)。这应该不太难理解。

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

1。调用超类的构造函数

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

那么,为什么有时需要用户超关键字呢?答案是android采用4GL语言,这意味着它有很多现成的功能。当我们为定制覆盖这些方法时,我们使用super关键字

查看android中super关键字的简单用法(我们大多数时候都这么做)


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

我知道这不是OP的真实意图,他问了这个问题,我不相信它得到了很好的答案,如果有人想知道的话“我为什么要叫超级?!”?!?如果他们需要它,为什么他们不为我做呢!!!“.以下是这些问题的答案

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

更具体地说,您无法控制是否调用super(),但是,您可以控制何时! 因此,假设在调用super()之前需要执行一些特定的代码,现在只有在运行代码后才可以自由调用super()。或者……假设您要求super()已经运行,以便代码不会崩溃,您现在可以选择运行super()在运行代码之前,确保一切都为您设置好。见鬼,您甚至可以在技术上覆盖超类硬核,编写自己的方法来处理super()本身,这样您就不必调用super(),但99.9%的时间理智的人不需要这样做!:-P


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

作为一个基本方法,super是一个用于引用主超类字段/方法的方法,从该字段/方法可以执行类扩展(在初始类定义中使用扩展)或者从其创建实例

当我们需要修改超类的方法/字段的最基本定义来解决我们的问题时

比如说

java.lang.Object(有很多方法和字段)>android.view.view>android.view.ViewGroup>android.widget.LinearLayout

但是如果您需要更改/使用,因为它是对象类的一个方法,那么您需要超级方法来引用对象类中第一次创建的方法
LinearLayout类。

重要的是要注意,一旦重写了一个方法,基本上会忽略父类中的所有内容,而在子类中有自己的自定义实现(字面上就是重写它)

在我们的例子中,我们不想放弃父类实现,实际上我们希望继续使用原始方法,并分别为每个子类添加额外的检查

这就是我们使用“超级”关键字的地方

您可以使用“super”关键字,后跟一个点,然后是方法名称,在子类中重复使用父方法:

例如:isValidMove(position)是在8x8棋盘上检查棋子移动有效性和边界的方法

超级有效移动(位置)

在这里使用关键字super意味着我们希望从“this”类中的实现内部运行super(或parent)类中的实际方法

这意味着在每个子类中,在检查自定义移动之前,可以检查super.isValidMove(position)是否返回false。如果是,则无需再进行任何检查并立即返回false;否则,继续检查

n
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    .
    .
    .
}
class Rook extends Piece{
   boolean isValidMove(Position newPosition){
      // First call the parent's method to check for the board bounds
  if(!super.isValidMove(position)){
     return false;
  }
  // If we passed the first test then check for the specific rock movement
  if(newPosition.column == this.column && newPosition.row == this.row){
     return true;
  }
  else{
     return false;
      }
   }
}
class Rook extends Piece{
   // default constructor
   public Rook(){
    super(); // this will call the parent's constructor
    this.name = "rook";
   }
}