範例

public static class Base {

public Base( Integer value1, Integer value2 ) {
super();
this .value1 = value1;
this .value3 = getThirdValue();
this .value2 = value2;
}
protected Integer getThirdValue() {
return value1;
}
protected Integer value1;
protected Integer value2;
protected Integer value3;
}

public static class Derived extends Base {
public Derived( Integer value1, Integer value2 ) {
super( value1, value2 );
}
protected Integer getThirdValue() {
// value2 是空值
return new Integer( value2.intValue() * 10 );
}
}

public static void main( String[] args ) {
Derived derived = new Derived( new Integer( 1 ), new Integer( 2 ) );
}


解決方案
避免在建構子中使用複雜計算,請只用建構子來起始設定物件欄位。

public static class Base {
public Base( Integer value1, Integer value2 ) {
this .value1 = value1;
this .value2 = value2;
}
public void init() {
value3 = getThirdValue();
}
protected Integer getThirdValue() {
return value1;
}
protected Integer value1;
protected Integer value2;
protected Integer value3;
}

public static class Derived extends Base {
public Derived( Integer value1, Integer value2 ) {
super( value1, value2 );
}
protected Integer getThirdValue() {
return new Integer( value2.intValue() * 10 );
}
}

public static void main( String[] args ) {
Derived derived = new Derived( new Integer( 1 ), new Integer( 2 ) );
derived.init();
}