[英]How to call the superclass implementation of an overridden method from inside the superclass in Java?
假設我有兩個類SuperClass
和SubClass
,它們擴展了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.