es wird Zeiten geben, in denen Sie eine gemeinsame Initialisierung von Instanzvariablen haben, die alle erbenden Klassen einrichten müssen. Sie instantiieren eine abstrakte Klasse, wenn Sie sie erweitern, und diese konkrete Klasse hat einen Konstruktor, der entweder die Parameter an den Konstruktor der abstrakten Klasse liefert.
Sie können immer noch von Konstruktoren von Klassen aufgerufen werden, die von dieser erben, wodurch Code-Refactoring für die Verwendung eines Konstruktors in der abstrakten Klasse nützlich ist.
Wenn Ihre Klasse keinen Konstruktor deklariert, macht javac einen Konstruktor ohne Arg, Do-nothing für Sie. Wenn dann Ihre Unterklasse initialisiert wird, ruft sie den generierten No-Op-Konstruktor auf und das Leben ist gut.
Wenn Ihre Klasse jedoch einen Konstruktor deklariert, erstellt javac KEINEN für Sie. In diesem Fall muss der Konstruktor der Unterklasse den Konstruktor der übergeordneten Klasse explizit aufrufen. Andernfalls können Sie die Mitglieder der Elternklasse nicht initialisieren, wie in der obigen Antwort erwähnt.
Deduplizierung von allgemeinem Wissen / Verhalten.
z. ein Auto: Alle Ihre Autos werden aus einem Körper und vier Rädern und einem Motor gebaut. Also machen Sie diesen Teil der Konstruktion im Konstruktor für die abstrakte Auto-Klasse, indem Sie Funktionen wie Body (), Wheel (int x), Engine () aufrufen. Jede einzelne Auto-Klasse wird ihre eigene Implementierung von Body (), Wheel () und Engine () haben - aber alle werden die gleichen Schritte ausführen, um das Auto von ihnen zu bauen, so dass es nicht notwendig ist, diese Schritte in jedem einzelnen zu duplizieren Klassen. In diesem Fall implementieren Sie dieses gängige Verhalten im Vorgänger.
Ich stimme zu, Konstruktoren werden unter der Annahme erstellt, dass es Instanzen geben wird. Wenn Sie viel gemeinsamen Code haben, können Sie einen Konstruktor erstellen, aber es ist viel besser, ihn in eine init()
-Methode zu schreiben.
Tags und Links java constructor abstract-class