Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden?

BigMemo007

Aktives Mitglied
Hallo liebes Forum,

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?
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
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.
 

BigMemo007

Aktives Mitglied
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!!
 
X

Xyz1

Gast
Bzw Du solltest Deine Klasse restrukturieren, sd super(gibArt); nur in public Maus(String gibName, int gibGroesse){ aufgerufen wird.
 

httpdigest

Top Contributor
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();
  }
}
 

BigMemo007

Aktives Mitglied
hat der Syntaxfehler eine Bewandtnis?

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.

Vielen dank!!
 

BigMemo007

Aktives Mitglied
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();
  }
}

Stimmt. Ein argumentloser Konstruktor vergibt ja auch Instanzvariablen :)).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
D Können if Anweisungen aufeinander aufbauen? Java Basics - Anfänger-Themen 1
Elaurin Erste Schritte effektiv lernen mit Java umgehen zu können? Java Basics - Anfänger-Themen 5
N Sicherheitsnummer erstellen und verändern können Java Basics - Anfänger-Themen 1
J Hinzufügen eines Objekts in eine Liste, um später dann nochmal auf das Objekt zugreifen zu können Java Basics - Anfänger-Themen 8
JokerBlacky Klassen Klasse Queue Klasse mit Attributen anhängen und auslesen können Java Basics - Anfänger-Themen 4
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
H Methoden können nicht verwendet werden Java Basics - Anfänger-Themen 10
R Eine Arrayliste in XML abspeichern und laden können Java Basics - Anfänger-Themen 7
D Methoden Wie können Klassen auf Klassenfremde Objekte zugreifen? Java Basics - Anfänger-Themen 7
W Wie kann man diesen Code in einen Code umwandeln, der folgendes können sollte? Java Basics - Anfänger-Themen 1
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
J Interface Bubblesort soll Arrays beliebiger Referenztypen sortieren können. Java Basics - Anfänger-Themen 5
B Anwender soll mathematische Funktion eingeben können, Einfachster Fnktionsplotter Java Basics - Anfänger-Themen 4
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
X Muss man Java können um Jython nutzen zu können? Java Basics - Anfänger-Themen 14
K mehrer applets sollen sich gegenseitig verständigen können Java Basics - Anfänger-Themen 3
F Können Klasse auch Werte liefern? Java Basics - Anfänger-Themen 3
2 Alle Werte die mit n Würfeln mit m Seiten geworfen werden können in ein n Dimensionales Array Java Basics - Anfänger-Themen 15
E Statische Member können nicht vererbt werden? Java Basics - Anfänger-Themen 10
B OOP Objekt klonen (Grundzustand), um in Editor "Abbrechen" zu können Java Basics - Anfänger-Themen 4
K Txt statt in TextArea in JTable einlesen und bearbeiten können Java Basics - Anfänger-Themen 4
G ein programm nicht mehrmals starten können Java Basics - Anfänger-Themen 6
R Klassenattribut nur 1 mal setzen können Java Basics - Anfänger-Themen 7
M Warum können innere Klassen keine static-members haben? Java Basics - Anfänger-Themen 2
T können überschriebene methoden andere zugruffsrechte besitze Java Basics - Anfänger-Themen 2
R Buttons können sich bewegen und JButtons nicht? Java Basics - Anfänger-Themen 5
frau-u Können Interfaces von Klassen erben? Java Basics - Anfänger-Themen 3
mrStudent <? extends T> und <? super T> Java Basics - Anfänger-Themen 1
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M Super(); Java Basics - Anfänger-Themen 1
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
N extends und super vs new object Java Basics - Anfänger-Themen 4
CptK Vererbung Attributtyp in Super-Klasse noch nicht festlegen Java Basics - Anfänger-Themen 1
Queiser Super boolean Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B super vs. this Java Basics - Anfänger-Themen 24
M Was macht super (...)? Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
Henri Aufruf von getX() und getY() aus der Super klasse Objekt() Java Basics - Anfänger-Themen 3
N Frage zu this, super und return Java Basics - Anfänger-Themen 13
E this() / super() Java Basics - Anfänger-Themen 7
T super Java Basics - Anfänger-Themen 3
G funktionen der super-klasse von der super-klasse Java Basics - Anfänger-Themen 6
O Vererbung this innerhalb von super Java Basics - Anfänger-Themen 7
X Frage zu Sub/Super Klassen Java Basics - Anfänger-Themen 7
V Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ? Java Basics - Anfänger-Themen 6
E Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein Java Basics - Anfänger-Themen 5
E Erste Schritte Lower Bounded Wildcards <? super Integer> Java Basics - Anfänger-Themen 1
K Vererbung (super) Java Basics - Anfänger-Themen 2
C Super und Unterklassen Java Basics - Anfänger-Themen 6
Avarion Getter von Super-Klasse funktioniert nicht Java Basics - Anfänger-Themen 10
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
A Super Klasse Java Basics - Anfänger-Themen 3
O OOP super aufruf 2 objekte? Java Basics - Anfänger-Themen 3
S super() im Konstruktor Java Basics - Anfänger-Themen 12
L Erste Schritte Super Constructor mit Array - Liste? Java Basics - Anfänger-Themen 15
A Shallow copy .super.clone() Java Basics - Anfänger-Themen 2
P Vererbung super() ohne Parameter Java Basics - Anfänger-Themen 2
D Super und Sub-Klassen Java Basics - Anfänger-Themen 2
D super.tostring Java Basics - Anfänger-Themen 8
A Super-Anweisung in abstrakter Klasse Java Basics - Anfänger-Themen 12
K Überschreiben einer "super.super"-Methode Java Basics - Anfänger-Themen 6
Luk10 super() und this Java Basics - Anfänger-Themen 7
S super() aufruf ausgabe Java Basics - Anfänger-Themen 3
L Frage zu Generics: "super" Java Basics - Anfänger-Themen 16
S super.paint() Java Basics - Anfänger-Themen 4
G Vererbung, Konstruktoranweisungen VOR super() Java Basics - Anfänger-Themen 4
G Variablen initialisieren vor super() Java Basics - Anfänger-Themen 8
H Konstruktoren – super! Java Basics - Anfänger-Themen 3
A Am Buch lesen, nun brauch ich eure Hilfe um mir super() zu erklären Java Basics - Anfänger-Themen 4
J Problem mit super Java Basics - Anfänger-Themen 10
G super operator und incompatible types, simple fehler Java Basics - Anfänger-Themen 8
kulturfenster super.paintComponent(g); Java Basics - Anfänger-Themen 3
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
B super methode aufrufen und ergänzen? Java Basics - Anfänger-Themen 5
G Innerhalb von Runnable auf super. zugreifen? Java Basics - Anfänger-Themen 3
X this dynamisch, super statisch? Java Basics - Anfänger-Themen 3
A Frage zu super, abstracte Klassen und Kapselung Java Basics - Anfänger-Themen 3
G frage zu vererbung (super) Java Basics - Anfänger-Themen 10
G super(null) Java Basics - Anfänger-Themen 7
F Der "super" Ausdruck Java Basics - Anfänger-Themen 4
S was macht super() ? Java Basics - Anfänger-Themen 7
J Konstruktor der Oberklasse und super Java Basics - Anfänger-Themen 1
W super.methode Java Basics - Anfänger-Themen 2
G neues String Array in super() übergeben Java Basics - Anfänger-Themen 3
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
K java syntax: wofür steht super(screen)? Java Basics - Anfänger-Themen 5
S Verwendung von Super Java Basics - Anfänger-Themen 7
P super an methode übergeben Java Basics - Anfänger-Themen 8
S supertyp steht ohne super in hierachy - eclipse Java Basics - Anfänger-Themen 4
U super-Konstruktor Aufrufen mit Object, dass Exception wirft Java Basics - Anfänger-Themen 2
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben