如何从 Java 中的超类内部调用重写方法的超类实现?
How to call the superclass implementation of an overridden method from inside the superclass in Java?
假设我有两个 类 SuperClass
和扩展 SuperClass
的 SubClass
,如下所示:
public abstract class SuperClass {
private Object field1;
protected SuperClass(Object obj) {
setField1(obj);
}
public void setField1(Object obj) {
// perform some check on obj and
// then set field1 such that field1==obj
}
}
public class SubClass extends SuperClass {
public SubClass(Object obj) {
super(obj);
}
@Override
public void setField1(Object obj) {
super.setField1(obj);
// do some work that is necessary only when
// field1 is set through SubClass.setField1()
}
}
我需要的是,当我创建 SubClass
的对象时,我需要从 SuperClass
构造函数内部调用方法 SuperClass.setField1()
,而不是 SubClass.setField1()
。但是使用上面的代码,方法 SubClass.setField1()
被调用,这导致 NullPointerException
被抛出,因为在 SubClass.setField1()
中完成的工作是在一个尚未为空的字段上执行的。
有什么方法可以从 SuperClass
构造函数内部显式调用 SuperClass.setField1()
吗?
您可以将所述方法主体移至私有方法,并让默认方法(可能被子class覆盖的方法)委托给前者。看这个例子
public abstract class SuperClass {
private Object field1;
protected SuperClass(Object obj){
// call the safe implementation
setField1Safe(obj);
}
public void setField1(Object obj){
// just delegates
setField1Safe(obj);
}
private void setField1Safe(Object obj){
// perform some check on obj and
// then set field1 such that field1==obj
}
}
public class SubClass extends SuperClass{
public SubClass(Object obj){
super(obj);
}
@Override
public void setField1(Object obj){
super.setField1(obj);
// do some work that is necessary only when
// field1 is set through SubClass.setField1()
}
}
这样子 class 仍然可以覆盖 setField1
但如果你真的依赖于实现那么你可以调用私有 setField1Safe
方法。
假设我有两个 类 SuperClass
和扩展 SuperClass
的 SubClass
,如下所示:
public abstract class SuperClass {
private Object field1;
protected SuperClass(Object obj) {
setField1(obj);
}
public void setField1(Object obj) {
// perform some check on obj and
// then set field1 such that field1==obj
}
}
public class SubClass extends SuperClass {
public SubClass(Object obj) {
super(obj);
}
@Override
public void setField1(Object obj) {
super.setField1(obj);
// do some work that is necessary only when
// field1 is set through SubClass.setField1()
}
}
我需要的是,当我创建 SubClass
的对象时,我需要从 SuperClass
构造函数内部调用方法 SuperClass.setField1()
,而不是 SubClass.setField1()
。但是使用上面的代码,方法 SubClass.setField1()
被调用,这导致 NullPointerException
被抛出,因为在 SubClass.setField1()
中完成的工作是在一个尚未为空的字段上执行的。
有什么方法可以从 SuperClass
构造函数内部显式调用 SuperClass.setField1()
吗?
您可以将所述方法主体移至私有方法,并让默认方法(可能被子class覆盖的方法)委托给前者。看这个例子
public abstract class SuperClass {
private Object field1;
protected SuperClass(Object obj){
// call the safe implementation
setField1Safe(obj);
}
public void setField1(Object obj){
// just delegates
setField1Safe(obj);
}
private void setField1Safe(Object obj){
// perform some check on obj and
// then set field1 such that field1==obj
}
}
public class SubClass extends SuperClass{
public SubClass(Object obj){
super(obj);
}
@Override
public void setField1(Object obj){
super.setField1(obj);
// do some work that is necessary only when
// field1 is set through SubClass.setField1()
}
}
这样子 class 仍然可以覆盖 setField1
但如果你真的依赖于实现那么你可以调用私有 setField1Safe
方法。