在最后调用超级

我真的很困惑人们使用超级方法的超级方式。 喜欢什么是不同的

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

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

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

任何两种performance的差异。

Solutions Collecting From Web of "在最后调用超级"

首先,普通的super()方法中是不允许的 – 只在构造函数中。 我想你实际上是指super.someMethod()为适当的方法。

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

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

在一个构造函数中, super (或this )被要求是第一个语句(如果存在的话,用一个隐式的super() ),它只能调用一个构造函数。

在一个方法中,使用super.someMethod()只是调用someMethod的超类实现。 你可以用任何方法调用它(当时你不必重写someMethod ),并且可以在方法中的任何一点调用它。 它在你调用的时候被调用,它只是避免了对重载实现的多态调用。

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

这真的取决于该方法实现的逻辑。 有时它被称为第一,有时在最后,有时从来没有。 例如,如果超类方法的一些计算非常重要,那么它将首先被调用。 或者,如果在子类方法中尝试计算,但没有好结果(结果为空),则尝试使用子类方法。 这个问题真的没有什么好的答案,除非它真的依赖于这个问题。


例1:

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

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

Date对象推断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添加了一个validation器, AbstractTextField添加了一个白色的块来写文本,等等…要处理元素,你将不得不这样做多层次的处理:

 public class DropDownField extends TextField { @Override public void dispose() { menu.dispose(); arrow.dispose(); //let text field dispose of its elements super.dispose(); } } 

看看okPressed()方法的swt对话框。 通常人们会在对话框上覆盖okPressed来做一些所需的工作。 super.okPressed()通常configuration对话无所事事。 所有的工作都完成之后,最终会被调用。

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

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

在构造函数中调用

 super(args) 

让你select应该使用父类的哪个构造函数。

在一个方法中,调用

 super.parentMethod(args) 

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

调用

 super(); 

在方法中不会编译,因为在方法中使用了构造函数的超级语法。

至于是否要回到第一行的超级方法,或者方法的最后一行,这取决于超级方法的语义。 换句话说,除了查看方法的文档(或代码)以外,没有办法知道。 也可能有些情况下你根本不想打电话给超级方法。

你似乎在问onResume() 。 而文档没有说,我一直使用的模式是回到第一行的超级方法。 对于onPause() ,我回到最后一行。 这个想法是,超级方法包装你的自定义暂停/恢复逻辑…

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