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
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(); }
}
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:
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:
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
new
aufgerufen werden. Es kann nicht als Methode aufgerufen werden.Vererbung ist als solches also praktisch nicht möglich. In einem Konstrukt kann man jedoch andere Konstruktoren nennen.
this(...)
;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.
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.
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).
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.
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.
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).
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);
}
}
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