在Java中,如何从超类内部调用重写方法的超类实现?
假设我有两个类在Java中,如何从超类内部调用重写方法的超类实现?,java,inheritance,superclass,subclassing,overriding,Java,Inheritance,Superclass,Subclassing,Overriding,假设我有两个类超类和子类,它们扩展了超类,如下所示: public abstract class SuperClass { private Object field1; protected SuperClass(Object obj) { setField1(obj); } public void setField1(Object obj) { // perform some check on obj and /
超类
和子类
,它们扩展了超类
,如下所示:
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()
}
}
我需要的是,当我创建子类的对象时,我需要从超类构造函数内部调用方法超类.setField1()
,而不是子类.setField1()
。但是在上面的代码中,调用了方法SubClass.setField1()
,这会导致抛出NullPointerException
,因为在SubClass.setField1()
中完成的工作是在一个尚未为null的字段上执行的
有没有办法显式调用超类.setField1()
从超类内部构造函数?您可以将所述方法体移动到私有方法,并让默认方法(可能被子类重写的方法)委托给前者。看这个例子
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()
}
}
这样子类仍然可以重写setField1
,但是如果您真的依赖于实现,那么您可以调用privatesetField1Safe
方法。相关:为什么它会导致抛出NullPointerException
?@zhh,因为重写方法中的附加工作是在在子类
中声明,但尚未实例化,因为必须首先在子类
构造函数中调用super
命令。NullPointerException来自哪一行?你能粘贴完整的代码吗?你是如何调用构造函数的,以及你传递给它的参数是什么?。如果他要将方法私有化,那么就不会有任何方法重写。他正在尝试重写方法。我认为Lino应该重写他的示例,并将其调整为给定的方法。我希望方法doStuff
是要继承的,而doStuffButPrivate
是从构造函数调用的。@CoronA这就是我想要告诉你的,我已经更新了,以反映OP应该在代码中做的更改