# Vererbung und Ausgabe



## Lenzen (24. Jan 2007)

Hallo! 
Ich habe eine Frage bezüglich einer Ausgabe.

Hier der Code:

```
class Q{
	int x=3;
	public String toString(){
		return "Q";
	}
}
class K extends Q{
	int x=1;
	public String toString(){
		return "K";
	}
}
class P extends K{
	int x=7;	
	P(){
		System.out.println(super.x);
		System.out.println(super.toString());
		System.out.println(((Q)this).x);
		System.out.println(((K)(Q)this).x);
		System.out.println((Q)this);
	}
	public String toString(){
		return "P";
	}
}
public class Test1 {
	public static void main(String[] args) {
		Q q = new P();
	}
}
```
Ausgabe:
1
K
3
1
P

Jetzt meine Frage: Warum wird in der letzten Ausgabe die toString Methode der Klasse P aufgerufen? Bis jetzt habe ich keine Erklärung dafür gefunden. Vielleicht kann jemand helfen???


----------



## Beni (24. Jan 2007)

Weil "this" ein P und kein Q ist. Daran ändert auch der Cast nichts. "this" ist ein Zeiger auf ein P-Objekt, es ist wie bei einem Wegweiser: nur weil man ihm eine andere Farbe gibt, zeigt er nicht plötzlich in eine andere Richtung.


----------



## Lenzen (24. Jan 2007)

Danke, das hilft schon weiter. 
Das ganze verhält sich aber bei Feldern, also Variablen (wie x) etwas anders, wenn ich das richtig sehe. Oder?


----------



## Beni (24. Jan 2007)

Richtig. Methoden kann man überschreiben (also richtig ersetzen durch neue Methoden), Felder kann man höchstens "verstecken" (durch einen Cast hat man immernoch Zugriff).


----------

