簡體   English   中英

如何從Java中的超類內部調用重寫方法的超類實現?

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

假設我有兩個類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不是SubClass.setField1()調用方法SuperClass.setField1() SubClass.setField1() 但是使用上面的代碼,將調用方法SubClass.setField1() ,這將引發NullPointerException ,因為在SubClass.setField1()中完成的工作是在尚未為null的字段上執行的。

有沒有什么辦法來顯式調用SuperClass.setField1()‍‍‍從內部SuperClass的構造函數?

您可以將所述方法主體移至私有方法,然后將默認方法(該方法可能被子類覆蓋)委托給前者。 看這個例子

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM