最后打电话给超级

时间:2013-06-26 20:09:40

标签: java android override

我对人们在重写方法中使用super的方式感到困惑。

之间有什么不同
  @Override
  protected void onResume() {
    // some logic here 
    super.onResume();
  }

  @Override
  protected void onResume() {
    super.onResume();
    // some logic here 
  }

当我们在最后调用super()时它是否执行任何预处理,因为通常我们调用super来初始化父构造函数。

两种表现的性能差异。

5 个答案:

答案 0 :(得分:19)

首先,方法中根本不允许使用普通super() - 仅在构造函数中。我假设您实际上意味着super.someMethod()用于合适的方法。

  

当我们在最后调用super()时它是否执行任何预处理,因为通常我们调用super来初始化父构造函数。

在方法中使用super与在构造函数中使用它有些不同。

在构造函数中,super(或this必需是第一个语句(如果存在,否则隐含super())和它只能 调用一个构造函数。

在方法中,使用super.someMethod()只调用someMethod的超类实现。您可以从任何方法调用它(您当时不必覆盖someMethod),并且可以在方法中的任何位置调用它。它在你调用它的时候被调用,它只是避免了对覆盖实现的多态调用。

所以基本上在哪里 - 以及是否 - 你称它取决于你想要的效果。在某些情况下,可能想要在您自己的自定义行为之前调用相同方法的超类实现,在某些情况下,可能想要在您自己的自定义行为之后调用它

答案 1 :(得分:2)

这实际上取决于该方法实现的逻辑。有时候它会被称为第一个,有时是最后的,有时甚至是永远的。例如,如果来自超类方法的某些计算非常重要,那么将首先调用它。或者,如果在子类方法中尝试计算但没有良好的结果(结果为null),则尝试在子类方法上进行。这个问题确实没有好的答案,除非它真的取决于它。


示例1:

标签提供程序,它从Date对象推断时间并将其返回到UI以显示:

public class TimeLabelProvider {
    public String getText(Date element) {
        //extrapolate time from the element
        return time;
    }
}

标签提供程序,从Date对象推断日期和时间,并将其返回到UI以显示:

public class DateTimeLabelProvider extends TimeLabelProvider {
    @Override 
    public String getText(Date element) {
         //extrapolate date from the element
         String date = ...

         //now get time string. We don't need to repeat logic, 
         //its already implemented in super method!
         String time = super.getText(element);
         return date + " " + time;
    }
}

示例2:

如果您的项目具有UI元素的深层次结构,例如

DropDownField extends TextField extends Field extends AbstractField

现在,每个类都在字段中添加了一些UI元素,例如,DropDownField在字段右侧添加了一个菜单和一个小箭头,TextField添加了一个验证器,{{ 1}}添加了一个白色块来写文本等...要处理元素,你必须像这样进行多级处理:

AbstractTextField

答案 2 :(得分:1)

查看swt对话框的okPressed()方法。通常人们会在对话框上覆盖okPressed以执行某些所需的工作。 super.okPressed()通常处理对话框什么都不做。因此,在完成所有工作后,最终会调用它。

public void okPressed()
{
   ///Do your work
   super.okPressed()
}

答案 3 :(得分:0)

关键字super是一种在专门的类中调用父类行为的方法。

在构造函数中,调用

super(args)

让您选择应该使用哪个父类的构造函数。

在方法中,调用

super.parentMethod(args)

即使当前类覆盖parentMethod,也可以调用父类行为。通常,它将用于在父类之前或之后添加一些逻辑。

调用

super();
由于您在方法中使用了构造函数超级语法,因此方法中的

将无法编译。

答案 4 :(得分:0)

关于是否回调第一行中的super方法,或者方法的最后一行......它取决于super方法的语义。换句话说,除了查看方法的文档(或代码)之外,没有办法知道。也可能存在您根本不想调用super方法的情况。

你似乎在询问onResume()。虽然文档没有说,我一直使用的模式是回调第一行中的super方法。对于onPause(),我在最后一行回电话。我们的想法是超级方法包装你的自定义暂停/恢复逻辑......

super on resume
custom on resume
...
custom on pause
super on pause