理解 Java 中的構造函數繼承
儘管人們普遍期望,構造函數在 Java 中並不是繼承的。這項設計決策引發了開發人員的好奇心和疑問。
建構子不繼承的原因
考慮以下範例:
public class Super { public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ this.serviceA = serviceA; //etc } }
如果建構子是繼承的,則每個類別(包括最終從Object 派生的類別)都將擁有一個無參數建構子。這會造成邏輯困境,尤其是在以下情況下:
FileInputStream stream = new FileInputStream();
在沒有任何指定參數的情況下,該行應該執行什麼操作?
非繼承的優點
建構子繼承的缺失確保子類別需要特定的參數來實例化,這些參數可能與其子類別所需的參數不同超類。這可以防止在創建物件時出現意外或不一致的行為。
替代解決方案
為了解決重複和 DRY 問題,Java允許建立明確「傳遞」子類別中的建構子將參數轉發給超類別建構函數,如下所示:
public class Son extends Super{ public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ super(serviceA,serviceB,serviceC); } }
雖然這種方法增加了一些冗餘,但它優先考慮對象實例化的清晰度和控制,有效地取代不存在的繼承建構子。
以上是為什麼Java中的建構函式不被繼承?的詳細內容。更多資訊請關注PHP中文網其他相關文章!