简体   繁体   English

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

[英]How to call the superclass implementation of an overridden method from inside the superclass in Java?

Suppose I have two classes SuperClass and SubClass which extends SuperClass , such as below: 假设我有两个类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()
    }
}

What I need is, when I create an object of SubClass , I need method SuperClass.setField1() to be called from inside SuperClass constructor, not SubClass.setField1() . 我需要的是,当我创建SubClass的对象时,我需要从SuperClass构造函数内部SuperClass不是SubClass.setField1()调用方法SuperClass.setField1() SubClass.setField1() But with the above code, method SubClass.setField1() is called which causes a NullPointerException to be thrown, since the work done in SubClass.setField1() is performed on a field that's yet null. 但是使用上面的代码,将调用方法SubClass.setField1() ,这将引发NullPointerException ,因为在SubClass.setField1()中完成的工作是在尚未为null的字段上执行的。

Is there any way to explicitly call SuperClass.setField1()‍‍‍ from inside SuperClass constructor? 有没有什么办法来显式调用SuperClass.setField1()‍‍‍从内部SuperClass的构造函数?

You could move said method body to a private method and let the default method (the one which may be overridden by the subclass) delegate to the former. 您可以将所述方法主体移至私有方法,然后将默认方法(该方法可能被子类覆盖)委托给前者。 See this example 看这个例子

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()
     }
}

That way the sub class can still override setField1 but if you really depend on the implementation then you can call the private setField1Safe method. 这样子类仍然可以覆盖setField1但是如果您确实依赖于实现,则可以调用私有的setField1Safe方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM