Vererbung von Konstruktoren mit Parametern

nossek

Aktives Mitglied
Guten Tag,

was ich nicht verstehe:
Es heißt doch immer, bei der Vererbung werden alle Methoden und Attribute der Superklasse vererbt. Soweit klar, sinnvoll und toll!

Aber bei Konstruktoren ist das offensichtlich nicht so. Zwar: wenn die Superklasse einen parameterlosen Konstruktor hat, dann wird der auch bei der Erzeugung eines Objekts der abgeleiteten Klasse aufgerufen.

Hat die Superklasse aber einen Konstruktor mit Parametern, kann man diesen nicht ohne weiteres zur Erzeugung eines Objekts der abgeleiteten Klasse verwenden. Man muß offenbar in der Implementierung der abgeleiteten Klasse schreiben:
Java:
public AbgeleiteteKlasse(parameter){
         super(parameter);
}

Frage 1: Das erscheint mir als Anfänger etwas umständlich. Wäre es nicht einfacher, wenn auch Konstruktoren mit Parametern vererbt werden würden? (EDIT: wenn ich zB zu einer bestehenden Klasse einfach nur eine Methode hinzufügen möchte) Da aber die Java-Entwickler nicht auf den Kopf gefallen sind, muß ein Sinn dahinter stecken. Kann mir den jemand verraten?!

Frage 2: Wen ich in der abgeleiteten Klasse den Konstruktor mit Parametern auf oben genannte Weise implementiert habe, funktoniert der parameterlose Konstruktor nicht mehr "automatisch", ich muß ihn ebenfalls mit Verweis auf den der Superklasse implementieren. EDIT: Warum?

Ich hofe mich einigermaßen verständlich ausgedrückt zu haben (kann gerne Beispielcode posten falls etwas unklar ist). Vlt.ist es heute auch einfach zu warm zum Programmieren!

Danke, Gruß nossek
 
Zuletzt bearbeitet:

icarus2

Top Contributor
Konstruktoren gehören meines Wissens nach zum statischen Teil einer Klasse. Zum Zeitpunkt wo die Konstruktoren aufgerufen werden existiert das Objekt noch gar nicht, das heisst also das Objekt entsteht innerhalb des Konstruktors.
Und statische Methoden werden auch nicht vererbt wie nichtstatische Methoden.

PS: Ich hoffe, dass das so einigermassen stimmt ;-)

*Edit
Zur Frage 2:
Der Compiler erstellt einen Default-Konstruktor (der Default-Konstruktor ist parameterlos), wenn du selber keinen anderen definierst. Sobald du aber einen eigenen Konstruktor schreibst, so erzeugt der Compiler keinen Default-Konstruktor mehr. Somit musst du wieder einen eigenen parameterlosen Konstruktor schreiben.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Konstruktoren sind keine normalen Methoden, sie werden nicht vererbt und lassen sich nicht per Interface vereinbaren. Damit ähneln sie (wie von meinem Vorredner erwähnt) ein wenig statischen Methoden. Die Sonderstellung sieht man auch bei der Verwendung von Reflection, wo Methoden und Konstruktoren gesondert behandelt werden.

Ist die erste Zeile eines Konstruktors keine this() oder super()-Aufruf, wird automatische der parameterlose Konstruktor der Superklasse aufgerufen, bevor es weitergeht. Jede Klasse hat mindestens einen Konstruktur, wenn keiner angegeben wird, fügt der Compiler automatisch einen "leeren", parameterlosen Konstruktor ein.

1) Angenommen wir haben einen Konstruktor für Rechteck mit den Parametern Länge und Breite. Nun möchten wir eine Unterklasse Quadrat ableiten (streiten wir uns einmal nicht, ob das sinnvoll wäre oder nicht). Würde jetzt der Konstruktor einfach ungefragt vererbt, hätten wir einen ziemlich unbrauchbaren oder sogar gefährlichen Konstruktor in Quadrat, der eine falsche Initialisierung der Klasse zuließe. Ohne Vererbung haben wir dieses Problem nicht, können aber ohne weiteres zum Konstruktor der Superklasse deligieren, z.B.

Java:
class Quadrat extends Rechteck {
   public Quadrat(int laenge) {
      super(laenge, laenge);
   }
}

2) Das ist ein ähnliches Problem wie zuvor, der Default-Konstruktor kann unerwünscht sein. Wenn ich Felder in einem Objekt initialisieren muss, würde der Default-Konstruktor stattdessen ein uninitialisiertes Objekt zurückliefern. In Utility-Klassen wie java.lang.Math wird z.B. extra ein privater Konstruktor angelegt, um zu verhindern, dass irgendjemand ein Math-Objekt erzeugen kann (was nicht sinnvoll ist, da nur statische Methoden vorhanden sind). Der Programmierer hat also die Möglichkeit, sich bewußt gegen einen Default-Konstruktor zu entscheiden, und diese Möglichkeit ist wichtig.
 
Zuletzt bearbeitet:

Ruzmanz

Top Contributor
Java sagt:

"Call to super must be first statement in constructor"

Das kommt daher, dass alle Klassen von Object erbenen:

public class Xyz = public class Xyz extends Object

Um ein Objekt erstellen zu können, muss der Konstruktor aufgerufen werden. Ist kein Konstruktor im Quelltext, dann erstellt der Compiler folgenden Code:

Java:
    public Xyz() {
        super();
    }

Ist nun in der Oberklasse ein anderer Konstruktor, dann ist das aber nicht möglich. Er weis schließlich nicht, was er übergeben soll. Im Zeifel kann man null übergeben, aber auf Nummer sichergehen ist immer besser :)
 
Zuletzt bearbeitet:

nossek

Aktives Mitglied
Danke Icarus2 + Landei

Wenn man selber in der Superklasse einen parameterlosen Konstruktor implementiert, nennt man den dann auch default-Konstruktor? Weil das funktioniert offenbar. Ein "new AbgeleiteteKlasse()" ruft ohne weiteres den parameterlosen Konstruktor der Superklasse auf.

Dieser Unterschied zwischen Klassenmethoden und Konstruktoren leuchtet mir schon ein. Trotzdem: wäre es nicht sehr bequem, wenn die abgeleiteten Klasse grundsätzlich den entsprechenden Konstruktor der Superklasse aufriefe (Abhängig von den Parametern...). Da muß es doch einen Grund geben daß die Sprache das nicht zulässt. Sorry fals ich etwas schwer von Begrif bin, wie gesagt: die Hitze...
 

nossek

Aktives Mitglied
Danke Ruzmanz.

Hmm, ich nehme es erstmal so hin, daß man das so machen muß. (Was bleibt mir auch anderes übrig!)

EDIT: Wie geht eigentlich durchstreichen? Würde obiges gerne steichen!

Melde mich gleich nochmals!
 
Zuletzt bearbeitet:

Landei

Top Contributor
Sicher könnte man sich irgendwelche Regeln ausdenken, nach denen der Superkonstruktor aufgerufen wird, aber das war den Java-Machern wohl einfach zu gefährlich. Wenn ich z.B. einen Klasse Complex(real, imag) habe und dann eine Unterklasse PolarComplex(winkel, betrag) habe, wäre es natürlich falsch, wenn der Konstruktor mit den zwei double-Parametern einfach den Super-Konstruktor mit zwei double-Parametern aufrufen würde, weil sei einfach etwas ganz anderes bedeuten. Das würde leicht zu Fehlern führen, die schwer zu entdecken wären. Oder angenommen, du hast eine funktionierende automatische Konstruktor-Verkettung, und irgendjemand ändert die Superklasse und löscht dem Konstruktor, auf den du dich in der Unterklasse verlässt. Ich denke, an dieser Stelle ist der kleine Mehraufwand durch expliziten Aufruf dem möglichen Chaos durch schwer zu kontrollierende Automatismen vorzuziehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
B Vererbung und Konstruktoren Java Basics - Anfänger-Themen 33
J Vererbung und Konstruktoren Java Basics - Anfänger-Themen 14
L Konstruktoren bei Vererbung Java Basics - Anfänger-Themen 13
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben