webentwicklung-frage-antwort-db.com.de

Warum können Konstruktoren nicht in Java vererbt werden?

Ich bin ein Anfänger der Java-Programmiersprache. Vor kurzem habe ich studiert, dass Konstruktoren nicht in Java vererbt werden können. Kann jemand bitte warum erklären?

Ich habe diesen Link von C++ bereits gelesen

34
Mayank Tiwari

In einfachen Worten kann ein Konstruktor nicht vererbt werden, da er in Unterklassen einen anderen Namen hat (den Namen der Unterklasse).

class A {
   A();
}

class B extends A{
   B();
}

Sie können nur tun:

B b = new B();  // and not new A()

Stattdessen werden Methoden mit "gleichem Namen" vererbt und können verwendet werden.

Der Grund: Es wäre nicht sinnvoll, einen Konstruktor zu erben, da ein Konstruktor der Klasse A ein Objekt vom Typ A und ein Konstruktor der Klasse B ein Objekt der Klasse B erstellt.

Sie können weiterhin -Konstruktoren aus A in der Implementierung von B verwenden:

class B extends A{
   B() { super(); }
}
34
Lake

Sie sprechen über Java-Sprachniveau. Wenn Konstruktoren vererbt würden, wäre es unmöglich, die Klasse privat zu machen. Wie wir wissen, kann die Sichtbarkeit von Methoden nicht herabgestuft werden. Die Klasse Object hat keinen Argumentkonstruktor, und jede Klasse erweitert Object, sodass im Falle der Konstruktorvererbung jede Klasse keinen Argumentkonstruktor hat. Das bricht OO Prinzipien.

Auf Bytecode-Ebene ist das anders. Beim Erstellen eines Objekts werden zwei Operatoren aufgerufen:

  1. new - reserviert Speicher für das Objekt
  2. invokespecial - ruft den Konstruktor für neu zugewiesenen Speicher auf

Wir können Bytecode so ändern, dass Speicher für die Child-Klasse zugewiesen wird und der Konstruktor von der Parent-Klasse aufgerufen wird. In diesem Fall können wir sagen, dass Konstruktoren vererbt werden. Wenn Sie die Bytecode-Überprüfung nicht deaktivieren, gibt JVM beim Laden der Klasse eine Ausnahme aus. Wir können dies durch Hinzufügen eines -noverify-Arguments tun.

Fazit:

  1. Konstruktoren werden aufgrund von OO Prinzipien nicht auf Sprachebene vererbt
  2. Konstruktoren werden auf Bytecode-Ebene vererbt
15
Mikhail

In Vererbungsunterlagen angeführter Grund

Eine Unterklasse erbt alle Mitglieder (Felder, Methoden und verschachtelte Klassen) von ihrer Oberklasse. Konstruktoren sind keine Member und werden daher nicht von Unterklassen geerbt. Der Konstruktor der Superklasse kann jedoch von der Unterklasse aus aufgerufen werden.

Sie können Dokumente von Konstruktoren für Ihre Klassen bereitstellen

12
Suresh Atta
  • Ein Konstruktor darf nur mit new aufgerufen werden. Es kann nicht als Methode aufgerufen werden.
  • Der Konstruktorname ist identisch mit dem Klassennamen.

Vererbung ist als solches also praktisch nicht möglich. In einem Konstrukt kann man jedoch andere Konstruktoren nennen.

  • In derselben Klasse mit this(...);
  • Der erweiterten Klasse mit super(...);

Beispiel

class A {
    A() { }          // Constructor
    A(int a) { }     // Constructor
    A(boolean c) { } // Constructor
}
class B extends A {
    B() {
        this(3, 7);
    }
    B(int a) {
        super();
    }
    B(String b) {
        super(7);
    }
    B(int a, int c) { // Calls super() implicitly
    }
}
A a = new B(8):

Leider gibt es keine Möglichkeit, den Konstruktor von A für einen Boolean zu verwenden:

B b = new B(true): // ERROR

Die Sprachdesigner hätten so etwas implementieren können:

Generieren Sie für jeden öffentlichen Konstruktor in der Basisklasse einen Konstruktor mit derselben Signatur, wenn ein solcher Konstruktor nicht bereits definiert ist. Rufen Sie super mit den gleichen Parametern auf. Rufen Sie this() auf, wenn ein Standardkonstruktor vorhanden ist.

Das scheint den Code etwas aufzublähen. Und ist nicht einfach ein Zeiger in einer virtuellen Methodentabelle, durch den die Methodenübernahme/-überschreibung funktioniert.

2
Joop Eggen

Einfache Antwort Ich habe beobachtet, dass Sie Konstruktoren der übergeordneten Klasse in der untergeordneten Klasse nicht direkt aufrufen oder verwenden können. Methoden der übergeordneten Klasse können Sie jedoch direkt in der untergeordneten Klasse verwenden.

Falls Sie eine Methode in der Kindklasse mit demselben Namen wie in der übergeordneten Klasse zu diesem Zeitpunkt haben, müssen Sie nur das Schlüsselwort "super" verwenden, um die Mehrdeutigkeitsaufrufmethode der übergeordneten Klasse aufzurufen.

"Zum Aufruf" eines übergeordneten Klassenkonstruktors in einer untergeordneten Klasse benötigen Sie immer ein "super" -Schlüsselwort. Konstruktoren der übergeordneten Klasse sind also nicht direkt verfügbar, wie die Methoden der übergeordneten Klasse in der Kindklasse. Daher können Konstruktoren nicht vererbt werden.

1
Nikhil

Nein, wie von Mikhail angegeben; Konstruktoren werden nicht vererbt. Sie können keinen Konstruktor von der Oberklasse in Ihre Unterklasse erben. Wenn jedoch ein Objekt mit dem Operator "new" in Java instanziiert wird, erbt dieses Objekt alle Konstruktoren von seiner Unterklasse an seine Oberklasse (Parent), einschließlich derer in der abstrakten Klasse (da sie auch Oberklasse sind).

1
Henry Nana Adu

Konstruktoren sind keine Mitglieder von Klassen und nur Mitglieder werden geerbt. Sie können keinen Konstruktor erben. Das heißt, Sie können keine Instanz einer Unterklasse erstellen, indem Sie einen Konstruktor einer ihrer Oberklassen verwenden.

1
Rahul Tripathi

Nur Felder, Methoden und verschachtelte Klassen sind Klassen aller Konstruktoren und nicht Konstruktoren. Eine Unterklasse erbt alle Mitglieder (Felder, Methoden und verschachtelte Klassen) von ihrer Oberklasse. Konstruktoren sind keine Member und werden daher nicht von Unterklassen geerbt. Der Konstruktor der Superklasse kann jedoch von der Unterklasse aus aufgerufen werden.

1
user6521421

Syntaktische Einschränkungen können häufig umgangen werden, wenn ein Merkmal konzeptionell begründet ist. Ich glaube, dass der eigentliche Grund, warum die Vererbung des Konstruktors nicht unterstützt wird, nicht auf syntaktische Einschränkungen, sondern eher auf Semantik zurückzuführen ist.

Die konzeptionelle Vererbung bietet einen Mechanismus zum Anfordern (oder Erben) eines Verhaltens und höchstwahrscheinlich ohne dass ein Code geschrieben wird, da er dazu dient, die Wiederverwendung von Code bereitzustellen. Bei einer untergeordneten Klasse wird das Initialisierungsverhalten der übergeordneten Klasse nicht übernommen. Ein geerbtes Verhalten findet seine beste Verwendung, wenn ein externer Anrufer es verwenden kann, ohne zu wissen, wer (in der übergeordneten Kette) es tatsächlich implementiert hat. Wie Sie sehen, hat ein Anrufer kaum ein Unternehmen, das weiß, wie eine übergeordnete Klasse über seine untergeordnete Klasse initialisiert wird. Es gibt keinen erkennbaren Grund für die Unterstützung der Vererbung eines Konstruktors (der übergeordneten Klasse).

0
KGhatak

konstruktoren können nicht geerbt werden, aber Sie können initialisierte Werte wie Konstruktoren übernehmen

class test1 {
    int a,b;
    test1(){
        a = 100;
        b = 20;
    }
}

class test2 extends test1 {
    test2(){
        // do something
    }
}

class test {
    public static void main(String[] args) {
        test2 t = new test2();
        int a = t.a;
        int b = t.b;
        System.out.println(a+b);
    }
}
0
J.d. Patel

Nein, Konstruktoren werden nicht an eine Unterklasse vererbt. Obwohl es sich um ein nicht statisches Member handelt, werden sie nicht an die Unterklasse vererbt, da die Konstruktoren nicht in das Objekt geladen werden, sondern zur Erstellung des Objekts. Konstruktoren sind wie ein nicht statischer Initialisierer

0
Ashwini E