为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2021-06-07 21:39:34
假设我有两个类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构造函数内部显式调用?
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您可以将所述方法体移动到私有方法,并让默认方法(可能被子类覆盖的方法)委托给前者。看这个例子


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方法。


查看完整回答
反对 回复 2021-06-17
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信