Polymorphismus und Vererbung

Status
Nicht offen für weitere Antworten.

Sinal

Neues Mitglied
Hallo,

bei den Vorbereitungen für die kommende Klausur bin ich auf folgendes Problem gestoßen.
Code:
public class Boot {
	public String typ;
	
	public Boot(){
		typ = "Boot";
	}

	public String getTyp(){
		return typ;
	}
	
}

class MotorBoot extends Boot{
	public String typ;
	
	public MotorBoot(){
		typ = "MotorBoot";
	}
	
	public String getTyp(){
		return typ;
	}
}


class Test{
	public static void main(String[] args) {
		MotorBoot motorb = new MotorBoot();
		
		System.out.println(motorb.typ);
		System.out.println(motorb.getTyp());
		
		Boot b;
		b = motorb;
		
		System.out.println(b.typ);
		System.out.println(b.getTyp());
	
	}
}

Ausgabe ist folgende:
MotorBoot
MotorBoot
Boot
MotorBoot

Weshalb wird bei dem Aufruf von b.getTyp() (Ausgabe Zeile 4) auf die Funktion der Klasse MotorBoot zugegriffen, obwohl wir vorher das Objekt einer Referenz vom Typ Boot zugewiesen haben.

Schöne Grüße
Sinal
 
Weil es nun mal ein Motorboot ist. Das Objekt ist sich im Klaren darüber, was es ist! Gib mal folgendes aus:
Code:
System.out.println(b.getClass().getName());
, dann wirst Du es sehen.
Die Ausgabe von "Boot" in Zeile 3 hingegen ist falsch und hängt damit zusammen, dass deine Implementierung nicht stimmt, sie müsste eigentlich so aussehen:
Code:
class MotorBoot extends Boot{
   public MotorBoot(){
      typ = "MotorBoot";
   }
}
weil der Rest vererbt wird.
 
Sinal hat gesagt.:
Weshalb wird bei dem Aufruf von b.getTyp() (Ausgabe Zeile 4) auf die Funktion der Klasse MotorBoot zugegriffen, obwohl wir vorher das Objekt einer Referenz vom Typ Boot zugewiesen haben.

Nein, habt Ihr nicht.
Code:
MotorBoot motorb = new MotorBoot(); 
b = motorb;

Hier habt Ihr dem Boot die Referenz von Motorboot zugewiesen.
B ist zwar vom Typ Boot, jedoch mit einer Referenz auf Motorboot.

Gruss J-Walker
 
ok, dann ist also das Motorboot immernoch ein Motorboot, auch wenn es in b (vom Typ Boot) gespeichert wird. Soweit komme ich noch mit.
Warum ist dann aber die Ausgabe in Zeile 3 Boot, und nicht Motorboot.


Die Ausgabe von "Boot" in Zeile 3 hingegen ist falsch und hängt damit zusammen, dass deine Implementierung nicht stimmt
Die Implementierung ist absichtlich so gewählt, damit man eben auf diesen Sachverhalt (Zeile 3: Boot, Zeile 4: Motorboot) trifft (das man es in der Praxis anders machen würde sei mal dahingestellt).
 
Das Objekt hat sozusagen zwei Variablen "typ", eine stammt aus "Boot" eine aus "MotorBoot". In Zeile 3 wird auf das von Boot zugegriffen (Variablen überschreiben sich net oä desewgen keine Polymorphie oder sowas). In Zeile 4 wird die getter Methode aus MotorBoot aufgerufen, die wiederum auf die typ-Variable aus MotorBoot zugreift.
 
Die ausgabe "Boot" in zeile 3 stimmt,
weil du das Basisklassenfeld typ in der Unterklasse nur verdeckst.
Du kannst aber weiterhin mit diesem Feld arbeiten.

LG Chucky
 
sollte diese Frage noch aktuell sein....
>Hier habt Ihr dem Boot die Referenz von Motorboot zugewiesen.
B ist zwar vom Typ Boot, jedoch mit einer Referenz auf Motorboot. >
diese Aussage ist schlichtweg falsch.
>Weshalb wird bei dem Aufruf von b.getTyp() (Ausgabe Zeile 4) auf die Funktion der Klasse MotorBoot zugegriffen, obwohl wir vorher das Objekt einer Referenz vom Typ Boot zugewiesen haben. >
diese Aussage stimmt.
Der ausschlaggebende Faktor ist, das Java call by Value nutzt und ich mit dieser Zuweisung nicht den Wert der Variablen verändere.
Die Methoden werden zur Compilierzeit statisch gebunden. Zur Laufzeit, also dynamisch spielt es eine Rolle, welches Objekt ich erzeuge.
b ist ein Boot (eine Variable vom Typ Boot), also wählt der Compiler zur Laufzeit auch die dafür statisch gebundene Methode aus, statische und dynamische Methodenbindung sind hierbei also gleich.
motorb ist zwar auch ein b, aber da ich ein Objekt vom Typ Motorboot erzeuge wählt der Compiler hierfür die überschriebene Methode der Klasse Motorboot aus, weil Motorboot nur eine Referenz auf Boot hat, aber nicht den Wert.

LG
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben