[英]How to call the superclass implementation of an overridden method from inside the superclass in Java?
Suppose I have two classes SuperClass
and SubClass
which extends SuperClass
, such as below: 假设我有两个类
SuperClass
和SubClass
,它们扩展了SuperClass
,如下所示:
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()
}
}
What I need is, when I create an object of SubClass
, I need method SuperClass.setField1()
to be called from inside SuperClass
constructor, not SubClass.setField1()
. 我需要的是,当我创建
SubClass
的对象时,我需要从SuperClass
构造函数内部SuperClass
不是SubClass.setField1()
调用方法SuperClass.setField1()
SubClass.setField1()
。 But with the above code, method SubClass.setField1()
is called which causes a NullPointerException
to be thrown, since the work done in SubClass.setField1()
is performed on a field that's yet null. 但是使用上面的代码,将调用方法
SubClass.setField1()
,这将引发NullPointerException
,因为在SubClass.setField1()
中完成的工作是在尚未为null的字段上执行的。
Is there any way to explicitly call SuperClass.setField1()
from inside SuperClass
constructor? 有没有什么办法来显式调用
SuperClass.setField1()
从内部SuperClass
的构造函数?
You could move said method body to a private method and let the default method (the one which may be overridden by the subclass) delegate to the former. 您可以将所述方法主体移至私有方法,然后将默认方法(该方法可能被子类覆盖)委托给前者。 See this example
看这个例子
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()
}
}
That way the sub class can still override setField1
but if you really depend on the implementation then you can call the private setField1Safe
method. 这样子类仍然可以覆盖
setField1
但是如果您确实依赖于实现,则可以调用私有的setField1Safe
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.