在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
,但是如果您真的依赖于实现,那么您可以调用private
setField1Safe
方法。

相关:为什么它会导致抛出
NullPointerException
?@zhh,因为重写方法中的附加工作是在在
子类
中声明,但尚未实例化,因为必须首先在
子类
构造函数中调用
super
命令。NullPointerException来自哪一行?你能粘贴完整的代码吗?你是如何调用构造函数的,以及你传递给它的参数是什么?。如果他要将方法私有化,那么就不会有任何方法重写。他正在尝试重写方法。我认为Lino应该重写他的示例,并将其调整为给定的方法。我希望方法
doStuff
是要继承的,而
doStuffButPrivate
是从构造函数调用的。@CoronA这就是我想要告诉你的,我已经更新了,以反映OP应该在代码中做的更改