在 Java 中,類別的建構子不會被其子類別繼承。這個設計選擇引發了一個長期存在的問題:為什麼 Java 採取這種方法?
考慮以下類別:
public class Super { public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ this.serviceA = serviceA; //etc } }
當子類別 Son 繼承自 Super 時,Java 要求建構函式在 Son 中明確聲明,其參數與 Super 中的參數相同。這可能會導致程式碼重複,如下所示:
public class Son extends Super{ public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ super(serviceA,serviceB,serviceC); } }
這種重複提示了一個問題:為什麼 Java 禁止建構函數的繼承?
答案在於這種行為的潛在後果遺產。如果建構子是繼承的,那麼每個類別最終都會從基底類別 Object 繼承一個建構子。這意味著每個類,無論其用途如何,都將有一個無參數建構函數。
這樣的設計會產生歧義。例如,以下程式碼:
FileInputStream stream = new FileInputStream();
會留下問題,哪些參數應該傳遞給建構子。不同的類別可能需要不同的參數,使得這種繼承非常不切實際。
雖然在某些情況下傳遞建構函式(僅呼叫超類別建構函式的建構函式)很有用,但 Java 明智地選擇不將此作為預設行為。子類別建構所需的不同參數需要在每個類別中明確聲明建構子。
以上是為什麼Java不繼承構造函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!