如何从 Java 中的超类内部调用重写方法的超类实现?

假设我有两个类SuperClass并且SubClass其 extends 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()

    }

}

我需要的是,当我创建 的对象时SubClass,我需要SuperClass.setField1()从SuperClass构造函数内部调用方法,而不是SubClass.setField1(). 但是在上面的代码中,SubClass.setField1()调用了导致 aNullPointerException被抛出的方法,因为完成的工作SubClass.setField1()是在一个尚未为空的字段上执行的。


有没有办法SuperClass.setField1()‍‍‍从SuperClass构造函数内部显式调用?


叮当猫咪
浏览 175回答 1
1回答

慕哥6287543

您可以将所述方法体移动到私有方法,并让默认方法(可能被子类覆盖的方法)委托给前者。看这个例子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但如果你真的依赖于实现,那么你可以调用私有setField1Safe方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java