Java では、クラスのコンストラクターはそのサブクラスに継承されません。この設計上の選択により、長年の疑問が生じました。なぜ Java はこのアプローチをとるのですか?
次のクラスについて考えてみましょう:
public class Super { public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ this.serviceA = serviceA; //etc } }
サブクラス Son が Super から継承する場合、Java は次のことを要求します。コンストラクターは、Super と同じパラメーターを使用して Son で明示的に宣言する必要があります。以下に示すように、これによりコードの繰り返しが発生する可能性があります。
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 中国語 Web サイトの他の関連記事を参照してください。