Polymorphie Dynamischer oder Statischer Typ für Methodenparameter

LutzB

Mitglied
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:
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
 

mrBrown

Super-Moderator
Mitarbeiter
lauf mal per Debugger drüber und schau Dir an, WO der Code genau langläuft!
Damit löst sich das Problem, *warum* er "da lang läuft" nicht. Wo er lang läuft, weiß er schon...

Der dynamische Typ von laeufer ist Sprinter, damit stehen die in Sprinter deklarierten Methoden zur Verfügung.
Zum Aufrufen stehen die in Laeufer deklarierten Methoden zur Verfügung.
Zusätzliche in Sprinter deklarierte sind ja statisch nicht bekannt, erst dynamisch.

Im most-specific-Ansatz müsste damit also zwischen den Methoden sprotTreiben der Klasse Sprinter und der der Klasse Sportler "ausgewählt werden".
Aus obigem Grund eben nicht, nur aus Laeufer (und damit auch Sportler).

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?
Der dynamische Typ ist immer der gleiche und ändert sich nicht.
Der statische Typ von pfad ist Trampelfpfad, da als solches deklariert.
Der statische Typ von weg ist aber eben deshalb Weg, erst der dynamische Typ ist Trampelfpfad.

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?
Die statischen Typen sind in dem Fall allerdings eben Laeufer und Weg ;)
 

Meniskusschaden

Top Contributor
2. Wieso erhalte ich mit dem Methodenaufruf laeufer.sportTreiben(pfad) in Zeile 38 die Ausgabe "1" und nicht die Ausgabe "4"?
Beim Aufruf laeufer.sportTreiben(pfad); ist zunächst der statische Typ von laeufer (also Laeufer) dahingehend maßgeblich, dass nur Methoden in Betracht kommen, die garantiert für jeden Laeufer-Subtypen existieren. Der Compiler weiß nicht, dass es hier gerade um einen Sprinter geht und nicht etwa um einen Langstreckler, für den es vielleicht gar keine Methode sportTreiben(Trampelpfad); gibt.
Die Auswahl der passenden Methodensignatur orientiert sich also am statischen Typ, demzufolge wird sportTreiben(Weg); selektiert. Für die Auswahl der konkreten Implementierung dieser Signatur ist aber der dynamische Typ maßgeblich. Falls Sprinter beispielsweise zusätzlich eine Methode sportTreiben(Weg) enthalten würde, würde die aufgerufen werden.
 

LutzB

Mitglied
Vielen Dank für eure Antworten. Da muss ich jetzt erst mal ne Runde drüber nachdenken und es sacken lassen. Dachte eigentlich, ich hätte das Thema relativ gut verstanden, die Meinung muss ich wohl erst mal revidieren. o_O
 

LutzB

Mitglied
Die Auswahl der passenden Methodensignatur orientiert sich also am statischen Typ, demzufolge wird sportTreiben(Weg); selektiert. Für die Auswahl der konkreten Implementierung dieser Signatur ist aber der dynamische Typ maßgeblich. Falls Sprinter beispielsweise zusätzlich eine Methode sportTreiben(Weg) enthalten würde, würde die aufgerufen werden.

Zum Sichergehen, dass ich es wirklich verstanden habe: Die dynamische Bindung ist also nur für überschriebene Methoden relevant, nicht für in den Subtypen "zusätzlich" hinzugefügte Methoden?
 

LutzB

Mitglied
Der dynamische Typ ist immer der gleiche und ändert sich nicht.
Der statische Typ von pfad ist Trampelfpfad, da als solches deklariert.
Der statische Typ von weg ist aber eben deshalb Weg, erst der dynamische Typ ist Trampelfpfad.

Die statischen Typen sind in dem Fall allerdings eben Laeufer und Weg ;)

Wirklich sorry, für die dummen Fragen, aber ich bin jetzt schwer verwirrt: Der statische Typ von pfad nach der Zuweisung
Java:
  Trampelpfad pfad = new Trampelpfad ();
        Weg weg = pfad;
ist dann Weg?
Also
Java:
 Trampelpfad pfad = new Trampelpfad ();
Referenztyp pfad:
statischer Typ - Trampelpfad;
dynamischer Typ - Trampelpfad​

Java:
  Weg weg = pfad;
Referenztyp weg:
statischer Typ - Weg;
dynamischer Typ - Trampelpfad
UND gleichzeitig ändert sich der statische Typ für den Referenztyp pfad von Trampelpfad zu Weg?

Anders verstehe ich sonst nicht, wie der statische Typ von pfad dann wie du sagst, weg sein kann.
Die statischen Typen sind in dem Fall allerdings eben Laeufer und Weg ;)
Ich dachte der statische Typ einer Referenz bleibt immer gleich, nur der dynamische Typ lässt sich durch Zuweisung verändern?
 

mrBrown

Super-Moderator
Mitarbeiter
Wirklich sorry, für die dummen Fragen, aber ich bin jetzt schwer verwirrt: Der statische Typ von pfad nach der Zuweisung
Java:
  Trampelpfad pfad = new Trampelpfad ();
        Weg weg = pfad;
ist dann Weg?
Also
Java:
 Trampelpfad pfad = new Trampelpfad ();
Referenztyp pfad:
statischer Typ - Trampelpfad;
dynamischer Typ - Trampelpfad​

Java:
  Weg weg = pfad;
Referenztyp weg:
statischer Typ - Weg;
dynamischer Typ - Trampelpfad
UND gleichzeitig ändert sich der statische Typ für den Referenztyp pfad von Trampelpfad zu Weg?

Anders verstehe ich sonst nicht, wie der statische Typ von pfad dann wie du sagst, weg sein kann.

Ich dachte der statische Typ einer Referenz bleibt immer gleich, nur der dynamische Typ lässt sich durch Zuweisung verändern?

Der statische Typ von pfad ist immer Trampelpfad und lässt sich auch durch nichts ändern - der statische Typ ist dabei der Typ, als es deklariert wurde. Genauso ist der statische Typ von weg immer Weg.

Der dynamische Typ wird durch die Zuweisung bestimmt und ist in beiden Fällen Trampelpfad.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Statischer und Dynamischer Typ Java Basics - Anfänger-Themen 6
T Unterschied dynamischer und statischer Laufzeittyp Java Basics - Anfänger-Themen 1
W Dynamischer und statischer Typ von Referenzvariablen Java Basics - Anfänger-Themen 13
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
C Input/Output Dynamischer Output von Arrays Java Basics - Anfänger-Themen 3
D dynamischer Aufruf Java Basics - Anfänger-Themen 2
C Datentypen Array mit dynamischer Länge? Java Basics - Anfänger-Themen 14
J Verschachtelte for schleife mit dynamischer Anzahl an Schleifen Java Basics - Anfänger-Themen 10
N "Dynamischer" Iterator Java Basics - Anfänger-Themen 21
G Dynamischer Methodenaufruf Java Basics - Anfänger-Themen 3
T Dynamischer JTabbedPane Probleme mit JTextArea Java Basics - Anfänger-Themen 2
G [Hibernate] Dynamischer Datenbankpfad Java Basics - Anfänger-Themen 4
S Fehler nach dynamischer Anpassung - Minesweeper Java Basics - Anfänger-Themen 6
V Dynamischer Klassen bzw. Methodenaufruf Java Basics - Anfänger-Themen 6
H statische, dynamischer Typ von Variablen Java Basics - Anfänger-Themen 1
B Dynamischer Filename Java Basics - Anfänger-Themen 3
M Variabler/dynamischer Objektname? Java Basics - Anfänger-Themen 12
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
H Polymorphie Interfaces und statischer Typ Java Basics - Anfänger-Themen 33
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
I Statischer Initializer Java Basics - Anfänger-Themen 4
kilopack15 this.v mit statischer Variable v? Java Basics - Anfänger-Themen 1
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
W If_Bedingung in statischer Methode beim zweiten Mal nicht durchlaufen Java Basics - Anfänger-Themen 14
N Initialisierer / statischer Initialisierer verstehen Java Basics - Anfänger-Themen 6
C Methoden Rückgabewert von statischer Methode ignorieren Java Basics - Anfänger-Themen 8
N ArrayList verwenden in statischer Methode Java Basics - Anfänger-Themen 2
R Frage zu statischer Methode toString() Java Basics - Anfänger-Themen 3
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
C Seitenwechsel in statischer Methode? Java Basics - Anfänger-Themen 6
P Statischer Import - ich raffs nicht! Java Basics - Anfänger-Themen 3
H Unterschied statischer/dynamische Typ einer Variablen Java Basics - Anfänger-Themen 2
H statischer Zugriff / accessed in a static way Java Basics - Anfänger-Themen 3
Paule Aufruf nicht statischer Methode in statischer MEthode Java Basics - Anfänger-Themen 7
D statischer Konstruktor Java Basics - Anfänger-Themen 9
W Methoden java map ersatz für c++map Java Basics - Anfänger-Themen 2
A csv Reader für Java? Java Basics - Anfänger-Themen 27
S Bitte Ratschläge für Console-MenuFührung... Java Basics - Anfänger-Themen 20
tomzen Java Unterstützung für exel dateien installieren. Java Basics - Anfänger-Themen 2
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
E Mittelquadratmethode für Hexadezimalzahlen Java Basics - Anfänger-Themen 1
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben