實務上常需結合合成與繼承。下例展示如何同時採用兩者,並完成必要的建構子初始化串聯。
//: PlaceSetting.java
class Plate { Plate(int i) { System.out.println("Plate constructor"); } }
class DinnerPlate extends Plate { DinnerPlate(int i) { super(i); System.out.println("DinnerPlate constructor"); } }
class Utensil { Utensil(int i) { System.out.println("Utensil constructor"); } }
class Spoon extends Utensil { Spoon(int i) { super(i); System.out.println("Spoon constructor"); } }
class Fork extends Utensil { Fork(int i) { super(i); System.out.println("Fork constructor"); } }
class Knife extends Utensil { Knife(int i) { super(i); System.out.println("Knife constructor"); } }
class Custom { Custom(int i) { System.out.println("Custom constructor"); } }
public class PlaceSetting extends Custom {
Spoon sp; Fork frk; Knife kn; DinnerPlate pl;
PlaceSetting(int i) {
super(i+1);
sp = new Spoon(i+2);
frk = new Fork(i+3);
kn = new Knife(i+4);
pl = new DinnerPlate(i+5);
System.out.println("PlaceSetting constructor");
}
public static void main(String[] args) { PlaceSetting x = new PlaceSetting(9); }
} ///:~
編譯器強制要求在建構子最開頭初始化基底類別(透過 super()),但不會檢查成員物件是否正確初始化。開發者必須自行確保每個合成成員皆在建構子中妥善建立,否則將留下難以發現的臭蟲。