In Java werden die Konstruktoren einer Klasse nicht von ihren Unterklassen geerbt. Diese Designwahl hat eine seit langem bestehende Frage aufgeworfen: Warum verfolgt Java diesen Ansatz?
Betrachten Sie die folgende Klasse:
public class Super { public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ this.serviceA = serviceA; //etc } }
Wenn eine Unterklasse, Son, von Super erbt, verlangt Java, dass a Der Konstruktor muss in Son explizit mit Parametern deklariert werden, die mit denen in Super identisch sind. Dies kann zu sich wiederholendem Code führen, wie unten gezeigt:
public class Son extends Super{ public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ super(serviceA,serviceB,serviceC); } }
Diese Wiederholung wirft die Frage auf: Warum verbietet Java die Vererbung von Konstruktoren?
Die Antwort liegt in den möglichen Konsequenzen davon Nachlass. Wenn Konstruktoren geerbt würden, würde jede Klasse schließlich einen Konstruktor von der Basisklasse Object erben. Das würde bedeuten, dass jede Klasse, unabhängig von ihrem Zweck, einen parameterlosen Konstruktor hätte.
Ein solcher Entwurf würde Mehrdeutigkeit schaffen. Beispielsweise würde der folgende Code:
FileInputStream stream = new FileInputStream();
die Frage offenlassen, welche Parameter an den Konstruktor übergeben werden sollen. Unterschiedliche Klassen erfordern möglicherweise unterschiedliche Parameter, was eine solche Vererbung höchst unpraktisch macht.
Obwohl es Szenarien gibt, in denen Pass-Through-Konstruktoren (Konstruktoren, die einfach den Superklassen-Konstruktor aufrufen) nützlich sind, hat sich Java klugerweise dafür entschieden, dies nicht zum Standardverhalten zu machen . Die unterschiedlichen Parameter, die für die Unterklassenkonstruktion erforderlich sind, erfordern die explizite Deklaration von Konstruktoren in jeder Klasse.
Das obige ist der detaillierte Inhalt vonWarum erbt Java keine Konstruktoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!