我对人们在重写方法中使用super的方式感到困惑。
之间有什么不同 @Override
protected void onResume() {
// some logic here
super.onResume();
}
和
@Override
protected void onResume() {
super.onResume();
// some logic here
}
当我们在最后调用super()时它是否执行任何预处理,因为通常我们调用super来初始化父构造函数。
两种表现的性能差异。
答案 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