Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden?
entschuldigt bitte, wenn ich blöde Fragen stelle! Aber ich bin blutiger Anfänger in Sachen Programmierung und für mich sieht alles noch sehr kompliziert aus. Habe auch einen kleinen Tick: Wenn ich etwas nicht ganz verstanden habe, kann ich es auch nicht loslassen. Ich bin nicht so der Auswendiglerner, ich muss es verstanden haben.
Also, meine Frage lautet - wie im Titel auch geschrieben - warum kann man super() und this() nicht im selben Konstruktor verwenden? Wäre denn folgender Code nicht komfortabler?
Java:
public class Tier {
String art;
Tier(String gibArt){
art = gibArt;
}
}
public class Maus extends Tier {
String name;
int groesse;
public Maus(String gibArt, String gibName, int gibGroesse){
super(gibArt); // Hier witd Art in die Superklasse als Argument übergeben
this(gibName, gibGroesse) // Hier wird Name und Größe in den passenden überladenen Konstruktor übergeben
}
public Maus(String gibName, int gibGroesse){
name = gibName;
groesse = gibGroesse;
}
}
public class Start{
public static void main (Strin[] args){
Maus m = new Maus("Maus", "Micky", 10);
System.out.prinln(m.art+", "+m.name+", "+m.groesse+);
}
}
Wieso zickt der Compiler? Es gibt bestimmt noch viele andere Varianten, wo der Gebrauch von beidem (super() und this()) im selben Konstruktor viel komfortabler wären. Und auch bei der Versendung von this() im Code weiter unten im Konstruktor (also nicht als erste Anweisung) fallen mir Möglichkeiten ein, die mehr Kompfort bieten.
Bei super() als erste Anweisung ist klar, weil kein Kind ohne Elternteile.
Oder bin ich total bala bala geworden nach 8 Stunden lesen und lernen?
Der Grund ist, dass ansonsten ein super() Konstruktor mehrfach aufgerufen werden würde. Wenn du kein this() oder super() als erste Anweisung in einen Konstruktor schreibst, wird vom Compiler automatisch ein super() Aufruf als erste Anweisung in den Konstruktor generiert, um sicherzustellen, dass die aktuelle Instanz immer für alle Oberklassen initialisiert wird. Das heißt, dein `Maus(String, int)` Konstruktor sieht eigentlich so aus:
Java:
public Maus(String gibName, int gibGroesse) {
super(); // <- wird automatisch generiert, wenn kein expliziter Aufruf von super() oder this() hier steht!
name = gibName;
groesse = gibGroesse;
}
Und tatsächlich compiliert dein Beispiel aus diesem Grund nicht, da die Klasse `Tier` keinen no-args Konstruktor definiert.
Und so einfach ist die Rätsels-Lösung und ich komm seit Stunden nicht von selber drauf (
Also um es mal mit meinen eigenen Worten auszudrücken:
Wenn Parameter eines Konstruktors aufgeteilt werden, um einen Teil in super() zu geben und einen in this(), ist das Problem bei dem überladenen Konstruktor der von this() angesprochen wird. Dort wird implizit super() nochmal aufgerufen werden.
Aber was wäre wenn, die Superklasse einen parameterlosen Konstruktor hat, der mit super() aufgerufen wird. Dieser verändert nichts, da keine Code beinhaltet. Dann wäre es doch egal, das super() implizit im überladenen Konstruktor aufgerufen wird.
Aber schomal einen ganz großen lieben Dank @httpdigiest. Super dass es solche Profis wie dich gibt!!
Aber was wäre wenn, die Superklasse einen parameterlosen Konstruktor hat, der mit super() aufgerufen wird. Dieser verändert nichts, da keine Code beinhaltet. Dann wäre es doch egal, das super() implizit im überladenen Konstruktor aufgerufen wird.
Wer sagt denn, dass dieser parameterlose Konstruktor nichts verändert oder keine anderen Seiteneffekte hervorruft?
Java:
public class Superklasse {
private long einFeld;
/* Ein parameterloser Konstruktor, der vielleicht irgendwo per super() aufgerufen wird */
public Superklasse() {
System.out.println("Objekt erzeugt!");
einFeld = System.currentTimeMillis();
}
}
Nein. Ich hab mich verschrieben. Das + muss natürlich weg. Für die Fragestellung hat dieser Syntaxfehler keine Bewandtnis..
Aber @httpdigest: Ich hab es kappiert. Endlich! This() kann nie als zweite Anweisung oder darunter sein, weil sie als erste Anweisung den überladenen Konstruktor aufrufen muss, damit diser wiederum (entweder implizit oder explizit) super() aufrufen kann. Hab schon selber gesagt: "Ohne Elternteile kein Kind". Also muss dafür gesorgt werden, dass super() immer als erstes aufgerufen wird.
Wer sagt denn, dass dieser parameterlose Konstruktor nichts verändert oder keine anderen Seiteneffekte hervorruft?
Java:
public class Superklasse {
private long einFeld;
/* Ein parameterloser Konstruktor, der vielleicht irgendwo per super() aufgerufen wird */
public Superklasse() {
System.out.println("Objekt erzeugt!");
einFeld = System.currentTimeMillis();
}
}