Hallo,
Ich habe mal 2 Fragen, zum Thema dynamischer und statischer Typ.
1. Zum ersten eine grundsätzliche Frage: Methodenparameter selbst werden wie Attribute behandelt und entsprechend ihres statischen Typs ausgewertet? Ich habe dazu nirgends eine konkrete Aussage gefunden, und mir das nur anhand der Ausgabe des unten stehenden Programms erschlossen:
Die Ausgabe für den Methodenaufruf in Zeile 37 lautet 2, damit ist von den überladenen Methoden diejenige zum Einsatz gekommen, deren formale Parameter den statischen Typen der aktuellen Parameter entspricht. Die Methode deren formale Parameter den dynamischen Typen der aktuellen Parameter entsprechen wurde nicht verwendet.
2. Wieso erhalte ich mit dem Methodenaufruf laeufer.sportTreiben(pfad) in Zeile 38 die Ausgabe "1" und nicht die Ausgabe "4"?
Der dynamische Typ von laeufer ist Sprinter, damit stehen die in Sprinter deklarierten Methoden zur Verfügung. Im most-specific-Ansatz müsste damit also zwischen den Methoden sprotTreiben der Klasse Sprinter und der der Klasse Sportler "ausgewählt werden". Der statische Typ von Pfad ist Trampelfpfad (wegen Trampelfpfad pfad = new Trampelpfad() und bleibt es auch trotz der Zuweisung in der Zeile darunter, oder? Denn diese Zuweisung dürfte doch nur den dynamischen Typen von weg" ändern?
Wenn der statische Typ von Pfad Trampelpfad ist, sollte doch die Methode sportTreiben der Klasse Sprinter die speziellere sein, da Pfad ( = Trampelpfad) ein Subtyp von Weg ist. Wieso wird diese Methode dann also offensichtlich nicht ausgeführt?
Wäre super, wenn mir jemand helfen könnte!
Vielen Dank schon mal im Voraus!
Lutz
Ich habe mal 2 Fragen, zum Thema dynamischer und statischer Typ.
1. Zum ersten eine grundsätzliche Frage: Methodenparameter selbst werden wie Attribute behandelt und entsprechend ihres statischen Typs ausgewertet? Ich habe dazu nirgends eine konkrete Aussage gefunden, und mir das nur anhand der Ausgabe des unten stehenden Programms erschlossen:
Java:
class Weg {};
class Trampelpfad extends Weg {
enum Material{Matsch, Stein, Kies};
}
class Sportler {
void sportTreiben (Weg weg) {
System.out.println ("1");
}
void gemeinsamSportTreiben (Weg pfad, Laeufer laeufer) {
System.out.println ("2");
}
}
class Laeufer extends Sportler {
void gemeinsamSportTreiben (Trampelpfad weg, Sportler nachbar) {
System.out.println("3");
}
}
class Sprinter extends Laeufer {
void sportTreiben (Trampelpfad weg) {
System.out.println ("4");
}
}
public class VonSportlern {
public static void main (String [] args) {
Sprinter sprinter = new Sprinter ();
Laeufer laeufer = sprinter;
Trampelpfad pfad = new Trampelpfad ();
Weg weg = pfad;
laeufer.gemeinsamSportTreiben(weg,laeufer);
laeufer.sportTreiben(pfad);
}
}
Die Ausgabe für den Methodenaufruf in Zeile 37 lautet 2, damit ist von den überladenen Methoden diejenige zum Einsatz gekommen, deren formale Parameter den statischen Typen der aktuellen Parameter entspricht. Die Methode deren formale Parameter den dynamischen Typen der aktuellen Parameter entsprechen wurde nicht verwendet.
2. Wieso erhalte ich mit dem Methodenaufruf laeufer.sportTreiben(pfad) in Zeile 38 die Ausgabe "1" und nicht die Ausgabe "4"?
Der dynamische Typ von laeufer ist Sprinter, damit stehen die in Sprinter deklarierten Methoden zur Verfügung. Im most-specific-Ansatz müsste damit also zwischen den Methoden sprotTreiben der Klasse Sprinter und der der Klasse Sportler "ausgewählt werden". Der statische Typ von Pfad ist Trampelfpfad (wegen Trampelfpfad pfad = new Trampelpfad() und bleibt es auch trotz der Zuweisung in der Zeile darunter, oder? Denn diese Zuweisung dürfte doch nur den dynamischen Typen von weg" ändern?
Wenn der statische Typ von Pfad Trampelpfad ist, sollte doch die Methode sportTreiben der Klasse Sprinter die speziellere sein, da Pfad ( = Trampelpfad) ein Subtyp von Weg ist. Wieso wird diese Methode dann also offensichtlich nicht ausgeführt?
Wäre super, wenn mir jemand helfen könnte!
Vielen Dank schon mal im Voraus!
Lutz