Kann eine abstrakte Klasse einen Konstruktor haben?
Wenn ja, wie kann es verwendet werden und für welche Zwecke?
Szere Dyeri
Kann eine abstrakte Klasse einen Konstruktor haben?
Wenn ja, wie kann es verwendet werden und für welche Zwecke?
Michael Rutherfurd
Ja, eine abstrakte Klasse kann einen Konstruktor haben. Bedenken Sie:
abstract class Product {
int multiplyBy;
public Product( int multiplyBy ) {
this.multiplyBy = multiplyBy;
}
public int mutiply(int val) {
return multiplyBy * val;
}
}
class TimesTwo extends Product {
public TimesTwo() {
super(2);
}
}
class TimesWhat extends Product {
public TimesWhat(int what) {
super(what);
}
}
Die Oberklasse Product
ist abstrakt und hat einen Konstruktor. Die konkrete Klasse TimesTwo
hat einen Konstruktor, der nur den Wert 2 hartcodiert. Die konkrete Klasse TimesWhat
verfügt über einen Konstruktor, mit dem der Aufrufer den Wert angeben kann.
Abstrakte Konstruktoren werden häufig verwendet, um Klassenbeschränkungen oder -invarianten zu erzwingen, wie z. B. die Mindestfelder, die zum Einrichten der Klasse erforderlich sind.
HINWEIS: Da es in der übergeordneten abstrakten Klasse keinen Standardkonstruktor (oder kein Argument) gibt, muss der in der Unterklasse verwendete Konstruktor den übergeordneten Konstruktor explizit aufrufen.
@ Jonathon: Es wird kein wirklicher Nutzen erzielt, wenn die Komplexität zum Zwecke der Beantwortung der gestellten Frage erhöht wird. Wenn es um die Frage nach dem Geltungsbereich ginge, dann wäre es sinnvoll, die drei nützlichen Möglichkeiten gegenüberzustellen.
– Michael Rutherfurd
21. Juni 2010 um 0:50 Uhr
Ich denke, alles, was Jonathon sagen wollte, ist, dass ein öffentlicher Konstruktor für eine abstrakte Klasse keinen Sinn macht, weil Sie eine abstrakte Klasse nicht direkt instanziieren können (kann nur durch einen abgeleiteten Typ instanziiert werden, der selbst nicht als abstrakt gekennzeichnet ist).
– Hobo-Spinne
17. April 2014 um 21:10 Uhr
Der Konstruktor in „TimesTwo“ ist kein Standardkonstruktor.
– Lew Bloch
3. September 2014 um 0:09 Uhr
Ich denke, es wäre gut, den letzten Satz klarzustellen, dass dies nur in diesem Beispiel der Fall ist, dass abstrakte Klassen im Allgemeinen Standardkonstruktoren haben, wenn keine explizit deklariert wurden
– Vic Seedoubleyew
11. August 2016 um 14:24 Uhr
In ähnlicher Weise wie der Kommentar von NOTE und Vic, wenn es sich um eine abstrakte Klasse handelt extends
eine andere Klasse, die keinen Standardkonstruktor hat, dann muss die abstrakte Klasse einen Konstruktor haben, der den Nicht-Standardkonstruktor der Klasse aufruft, die sie erweitert.
– Andy Royal
1. November 2017 um 15:13 Uhr
Sie würden einen Konstruktor in einer abstrakten Klasse definieren, wenn Sie sich in einer dieser Situationen befinden:
Beachten Sie, dass:
Vergessen Sie auf keinen Fall, dass der Compiler automatisch einen für Sie generiert, wenn Sie keinen Konstruktor definieren (dieser ist öffentlich, hat kein Argument und tut nichts).
Bonus dafür, dass sie geschützt sind. Es fügt dieses schöne Stück Vollständigkeit hinzu.
– RichieHH
15. August 2021 um 4:45 Uhr
Ja, es kann einen Konstruktor haben und es ist definiert und verhält sich wie der Konstruktor jeder anderen Klasse. Abgesehen davon, dass abstrakte Klassen nicht direkt instanziiert, sondern nur erweitert werden können, erfolgt die Verwendung daher immer vom Konstruktor einer Unterklasse.
Aniket Thakur
Jawohl! Abstrakte Klassen können Konstruktoren haben!
Ja, wenn wir eine Klasse als abstrakte Klasse definieren, kann sie nicht instanziiert werden, aber das bedeutet nicht, dass eine abstrakte Klasse keinen Konstruktor haben kann. Jede abstrakte Klasse muss eine konkrete Unterklasse haben, die die abstrakten Methoden dieser abstrakten Klasse implementiert.
Wenn wir ein Objekt einer beliebigen Unterklasse erstellen, werden alle Konstruktoren im entsprechenden Vererbungsbaum im Top-to-Bottom-Ansatz aufgerufen. Dasselbe gilt für abstrakte Klassen. Obwohl wir kein Objekt einer abstrakten Klasse erstellen können, wird der Konstruktor der abstrakten Klasse automatisch aufgerufen, wenn wir ein Objekt einer Klasse erstellen, die konkret und eine Unterklasse der abstrakten Klasse ist. Daher können wir einen Konstruktor in abstrakten Klassen haben.
Hinweis: Eine nicht abstrakte Klasse kann keine abstrakten Methoden haben, aber eine abstrakte Klasse kann eine nicht abstrakte Methode haben. Reason ähnelt dem von Konstruktoren, mit dem Unterschied, dass wir super() aufrufen können, anstatt automatisch aufgerufen zu werden. Außerdem gibt es nichts Besseres als einen abstrakten Konstruktor, da es überhaupt keinen Sinn macht.
MattC
Das kann es nicht nur, das tut es immer. Wenn Sie keinen angeben, hat sie wie jede andere Klasse einen Standardkonstruktor ohne Arg. Tatsächlich erhalten ALLE Klassen, einschließlich verschachtelter und anonymer Klassen, einen Standardkonstruktor, wenn keiner angegeben ist (im Fall von anonymen Klassen ist es unmöglich, einen anzugeben, daher erhalten Sie immer den Standardkonstruktor).
Ein gutes Beispiel für eine abstrakte Klasse mit einem Konstruktor ist die Kalender Klasse. Sie erhalten ein Calendar-Objekt, indem Sie Calendar.getInstance() aufrufen, aber es hat auch Konstruktoren, die geschützt sind. Der Grund, warum seine Konstruktoren geschützt sind, ist, dass nur seine Unterklassen sie aufrufen können (oder Klassen im selben Paket, aber da es abstrakt ist, trifft das nicht zu). Gregorianischer Kalender ist ein Beispiel für eine Klasse, die Calendar erweitert.
Yoon5oo
Eine abstrakte Klasse kann einen Konstruktor haben, ABER Sie können kein Objekt einer abstrakten Klasse erstellen, also wie verwenden Sie diesen Konstruktor?
Die Sache ist, wenn Sie diese abstrakte Klasse in Ihrer Unterklasse erben, können Sie Werte über die Methode super(value) in Ihrer Unterklasse an den Konstruktor ihres (abstrakten) übergeben, und nein, Sie erben keinen Konstruktor.
Mit super können Sie also Werte in einem Konstruktor der abstrakten Klasse übergeben, und soweit ich mich erinnere, muss dies die erste Anweisung in Ihrer Methode oder Ihrem Konstruktor sein.
Jakob
Ja, abstrakte Klassenkonstruktoren werden im Allgemeinen für Superaufrufe für Initialisierungsereignisse verwendet, die allen Unterklassen gemeinsam sind