Kann eine abstrakte Klasse einen Konstruktor haben?

Lesezeit: 5 Minuten

Kann eine abstrakte Klasse einen Konstruktor haben
Szere Dyeri

Kann eine abstrakte Klasse einen Konstruktor haben?

Wenn ja, wie kann es verwendet werden und für welche Zwecke?

Kann eine abstrakte Klasse einen Konstruktor haben
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:

  • Sie möchten einige Initialisierungen (für Felder der abstrakten Klasse) durchführen, bevor die Instanziierung einer Unterklasse tatsächlich stattfindet
  • Sie haben letzte Felder in der abstrakten Klasse definiert, aber Sie haben sie nicht in der Deklaration selbst initialisiert; In diesem Fall MÜSSEN Sie einen Konstruktor haben, um diese Felder zu initialisieren

Beachten Sie, dass:

  • Sie können mehr als einen Konstruktor definieren (mit unterschiedlichen Argumenten)
  • Sie können (sollten?) Alle Ihre Konstruktoren als geschützt definieren (sie öffentlich zu machen ist sowieso sinnlos)
  • Ihre Unterklassenkonstruktoren können einen Konstruktor der abstrakten Klasse aufrufen; es kann sogar müssen, zu … haben Rufen Sie es auf (wenn es keinen No-Arg-Konstruktor in der abstrakten Klasse gibt)

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.

1646324233 249 Kann eine abstrakte Klasse einen Konstruktor haben
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.

Kann eine abstrakte Klasse einen Konstruktor haben
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.

1646324234 734 Kann eine abstrakte Klasse einen Konstruktor haben
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.

1646324234 117 Kann eine abstrakte Klasse einen Konstruktor haben
Jakob

Ja, abstrakte Klassenkonstruktoren werden im Allgemeinen für Superaufrufe für Initialisierungsereignisse verwendet, die allen Unterklassen gemeinsam sind

925150cookie-checkKann eine abstrakte Klasse einen Konstruktor haben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy