【问题标题】:How to call the superclass implementation of an overridden method from inside the superclass in Java?java - 如何从Java中的超类内部调用重写方法的超类实现?
【发布时间】:2019-01-05 21:06:53
【问题描述】:

假设我有两个类SuperClassSubClass 扩展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 构造函数内部调用方法SuperClass.setField1(),而不是SubClass.setField1()。但是使用上面的代码,方法 SubClass.setField1() 被调用,这会导致 NullPointerException 被抛出,因为在 SubClass.setField1() 中完成的工作是在一个尚未为 null 的字段上执行的。

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

【问题讨论】:

标签: java inheritance superclass subclassing overriding


【解决方案1】:

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

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

【讨论】:

  • 如果他要将方法设为私有,则不会有任何方法覆盖。他正在尝试覆盖方法
  • 我认为 Lino 应该重写他的示例并将其调整为给定的示例。我怀疑 doStuff 方法应该被继承,而 doStuffButPrivate 是从构造函数调用的。
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2012-06-15
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多