Konstruktoren

Status
Nicht offen für weitere Antworten.
T

Tommy54654654

Gast
Hi, hoffe mir kann jemand nen bisschen helfen. Hab nen bisschen Probleme mit Aufrufen von Konstruktoren. Hab auch schon gegoogelt und die prinzipielle Funktionsweise auch verstanden, hab leider nen Problem mit einer spezifischen Programmausgabe. Für ne kurze Erklärung wäre ich sehr dankbar.

Code:
class X {
int i = 5;
8
public X() { this.print(); }
public void print() { System.out.println("X" + i); }
public void call() { this.print(); }
}
public class Y extends X {
int i = 8;
public Y() { this.print(); }
public void print() {
super.print();
System.out.println("Y" + i);
}
public static void main(String[] args) {
X obj = new X(); // Ausgabe: X5
obj.call(); // Ausgabe: X5
obj = new Y(); // Ausgabe: X5 Y0 X5 Y8
obj.call(); // Ausgabe: X5 Y8
}
}
[\code]

Meine Frage ist wie die Ausgaben zustande kommen, vor allem das Y0.
 

Rydl

Bekanntes Mitglied
hab mir mal die mühe gemacht, die '8' aus dem code zu löschen und ihn zu formatieren:

Code:
class X {
	int i = 5;

	public X() {
		this.print();
	}

	public void print() {
		System.out.println("X" + i);
	}

	public void call() {
		this.print();
	}
}

public class Y extends X {
	int i = 8;

	public Y() {
		this.print();
	}

	public void print() {
		super.print();
		System.out.println("Y" + i);
	}

	public static void main(String[] args) {
		X obj = new X(); // Ausgabe: X5
		obj.call(); // Ausgabe: X5
		obj = new Y(); // Ausgabe: X5 Y0 X5 Y8
		obj.call(); // Ausgabe: X5 Y8
	}
}

und zu deiner frage: Y0 steht da weil 'i' in der klasse Y erst den wert 8 bekommt, sobald der konstruktor von Y aufgerufen wurde und das ist ja beim instanziieren natürlich noch im gange.. beim letzten call steht ja auch die 8 da.
 
T

Tommy54654654

Gast
das ist ja genau meine frage, warum ist dann nicht auch in der klasse X gleich 0, ist doch in beiden der gleich Konstruktor
 

Rydl

Bekanntes Mitglied
ich änder mal den text hier...

also noch mal: Y erbt von X. wenn X instanziiert wird, dann passiert alles wie erwartet.
wenn aber Y instanziiert wird, wird schon bevor this.print() bei Ys konstruktor aufgerufen wird, X gebaut. das heißt, dass der standard konstruktor von X aufgerufen wird. zu diesem zeitpunkt hat der konstr. von Y noch gar nichts gemacht.
nun wird der konstruktor von X betreten und i von X wird nun 5. die print gibt X5 aus.
es wird aber die überschriebene printmethode von Y aufgerufen!!! (merke: Y ist noch nicht instanziiert, i von Y ist 0)
danach wird sofort die Y0 ausgegeben - der konstruktor von Y wurde ja noch nicht betreten.
dann passiert dies aber, i = 8 und die print methode wird ein weiteres mal aufgerufen.

die zeilenreihenfolge ab obj = new Y();
... 20, 4, 2, 5, 24, 25, 8, 9, 26, 18, 21, 24, 25, 8, 9, 26 ...

puh... war doch nich so einfach durchzublicken ;) besser ist aber immer noch ein richtiger debugger...

...verdammt, hab ich grad deine hausaufgabe gemacht?
 
T

Tommy54654654

Gast
:) ne, keine angst, keine hausaufgaben gemahct, hast dich also nicht in den illegalen bereich begeben *lol*. aber vielen!!!!! dank, jetzt hab ichs verstanden,.... da fragt man sich warum das nicht so einfach in den vorlesungsunterlagen steht.......da wird immer schön mit grafiken gearbeitet......
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben