FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Praktische Informatik

Quizfrage aus SE2 Tutorium

Quizfrage aus SE2 Tutorium 2009-07-22 20:51
Stefan1971HH
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

RE: Quizfrage aus SE2 Tutorium 2009-07-22 20:55
UncleOwen
Da kommt gar keine Ausgabe, weil nichts ausgefuehrt wird.

RE: Quizfrage aus SE2 Tutorium 2009-07-22 21:09
Wulf
da fehlt ein } zeichen.
und dann solltest du einfach mal an paar markante stellen eine debugging-ausgabe machen. vielleicht siehst du's dann?

RE: Quizfrage aus SE2 Tutorium 2009-07-22 21:17
Stefan1971HH
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.

?

RE: Quizfrage aus SE2 Tutorium 2009-07-22 21:57
UncleOwen
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.

RE: Quizfrage aus SE2 Tutorium 2009-07-22 23:33
Loom
Ja, Fred und sein Zucker :D

Ist aber viel bequemer als Bytecode zu schreiben [28]

RE: Quizfrage aus SE2 Tutorium 2009-07-23 00:39
Fred
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.

RE: Quizfrage aus SE2 Tutorium 2009-07-23 07:40
Stefan1971HH
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.