Vererbung Vererbung - Verständnisproblem

lesni

Mitglied
Liebe Leute,

dachte eigentlich, ich hätte die Vererbung verstanden, allerdings verstehe ich folgenden Code nicht:

Java:
class A {
	String string;	
	A(){ string	= "AAA"; }	
	String getString(){ return string; }	
	void setString(String s){ string = s; }
}

Java:
class B extends A
{
	String string;
	B(){ string= "BBB"; }
	String getString(){ return string; }
	void setString(String s){ string = s; super.string = "auch " + s; }
}

Java:
class C extends A
{
	String string;
	C(){ string = "CCC"; }
	String getString(){ return string; }
	void setString(String s){ string = s; }
}

Java:
public class Test
{
	public static void main(String [] args)
	{
		A[] a = {new A(), new B(), new C()};		
		
		for(int i = 0; i < a.length; i++) // (1)
		{
			System.out.println(a[i].getString());		
		}		
		
		for(int i = 0; i < a.length; i++) // (2)
		{
			System.out.println(a[i].string);		
		}
		
		for(int i = 0; i < a.length; i++)
		{		
			a[i].setString("neu");		
		}		
		
		for(int i = 0; i < a.length; i++) // (3)
		{
			System.out.println(a[i].getString());	
		}	
		
		for(int i = 0; i < a.length; i++) // (4)
		{
			System.out.println(a[i].string);		
		}
	}
}

Die Ausgabe der ersten Schleife ist: AAA, BBB, CCC.
Das meine ich noch zu verstehen, da mithilfe der getter-Methode auf die Variable "string" jeder einzelnen Klasse zugegriffen wird.

Die Ausgabe der zweiten Schleife ist: AAA, AAA, AAA.
Jetzt komme ich schon ins zweifeln: Er greift doch direkt auf die Variablen aus den einzelnen Klassen zu. Nach meinem Verständnis müsste er jetzt wieder AAA, BBB, CCC zeigen, denn die Variable wurde zwar von der Super-Klasse geerbt, aber doch bei Initialiserung des Arrays sofort mit einem Klassen-eigenen Wert überschrieben.

Zu den letzten beiden Ausgaben hätte ich natürlich auch noch Fragen, aber vielleicht könnte mich erstmal zu meinem aktuellen Problem erleuchten, dann würde ich vielleicht selbst drauf kommen.

Vielen Dank!
 
kurze Antwort:
Attribute werden nicht überdeckt wie Methoden,

wenn im Quellcode A.string referenziert wird, weil der Typ der Variable A ist, dann ist es genau dieses Attribut
 
Bei der zweiten Schleife greift er 3 mal auf die Variable "string" der Klasse A zu, da der typ von
Code:
a[i]
jeweils
Code:
A
ist.
 

Neue Themen


Zurück
Oben