Hallo,
ich war zwar heute vor Ort und glaubte auch, es verstanden zu haben, bin mir jetzt beim nochmaligen Durchgehen aber wieder unsicher:
public class Base
{
private String s = "base";
public Base() {
System.out.print(toString());
}
public String toString() { return s; }
}
public class Sub extends Base
{
private String s = "sub";
public Sub() {
System.out.print(toString());
}
public String toString() { return s; }
Kann mir bitte nochmal jemand erklären, wie die Ausgabe nullsub zustande kommt?
danke,
Stefan
Da kommt gar keine Ausgabe, weil nichts ausgefuehrt wird.
da fehlt ein } zeichen.
und dann solltest du einfach mal an paar markante stellen eine debugging-ausgabe machen. vielleicht siehst du's dann?
Das Fehlen einer "expliziten" main - Methode ist mir zwar auch aufgefallen, aber man soll wohl annehmen, dass der Konstruktor der Klasse Sub ausgeführt wird.
Wie richtig ist folgendes:
Die implizite super()- Anweisung im Sub-Konstruktor ruft den Konstruktor von Base() auf.
Dieser versucht, die Methode toString() in Base aufzurufen, die aber von Sub überschrieben wird.
Somit wird toString() in Sub gestartet.
Da s in Sub noch nicht initialisiert ist (aber warum ist die Zeile "private String s = "sub";"
hier noch ohne Effekt?), kommt es zur Ausgabe null.
Danach wird in der nächsten Zeile des Sub-Konstruktors System.out.print(toString()), gestartet, was zur Ausgabe "sub" führt.
?
Das Fehlen einer "expliziten" main - Methode ist mir zwar auch aufgefallen, aber man soll wohl annehmen, dass der Konstruktor der Klasse Sub ausgeführt wird.
Ok, da war ich etwas zu pingelig.
Wie richtig ist folgendes:
Die implizite super()- Anweisung im Sub-Konstruktor ruft den Konstruktor von Base() auf.
Dieser versucht, die Methode toString() in Base aufzurufen, die aber von Sub überschrieben wird.
Somit wird toString() in Sub gestartet.
Da s in Sub noch nicht initialisiert ist (aber warum ist die Zeile "private String s = "sub";"
hier noch ohne Effekt?), kommt es zur Ausgabe null.
Alles richtig. Die Reihenfolge der Initialisierung ist:
1. Instanzvariablen von Base
2. Konstruktor von Base
3. Instanzvariablen von Sub
4. Konstruktor von Sub
Wir sind in Schritt 2, da ist Schritt 3 noch nicht gelaufen.
Ja, Fred und sein Zucker :D
Ist aber viel bequemer als Bytecode zu schreiben [28]
aber warum ist die Zeile "private String s = "sub";" hier noch ohne Effekt?
Steht auf Folie 16. Die Exemplarvariablen werden erst initialisiert, wenn das Superobjekt konstruiert wurde. Die Tatsache, dass die Zeile textuell über dem Konstruktor steht, hat keinerlei Relevanz.
Ach so und keine Panik, sowas fieses kommt definitiv NICHT in der Klausur dran.
Ach so und keine Panik, sowas fieses kommt definitiv NICHT in der Klausur dran.
Schade, denn jetzt habe ich es verstanden…
Jedenfalls danke für Tutorium + Erläuterungen hier.