Polymorphie Interfaces und statischer Typ

Bitte aktiviere JavaScript!
Zur Übersetzungszeit steht der Typ von Objekten bzw. Variablen fest (= kann man unmittelbar aus dem Code ableiten). Du kannst nur die Methoden verwenden, die der Typ (inkl. seiner Supertypen) deklariert hat.

Das solltest Du eigentlich den Kommentaren und Beispielen von @kneitzel und @White_Fox entnehmen können.

Der new Operator erzeugt ein neues Objekt vom angegebenen Typ und gibt eine Referenz darauf zurück. Man kann also die Methoden dieses Typs verwenden (ich knüpfe mal an das Beispiel von @White_Fox an):
Java:
new Panzer().schießen();
new Panzer() liefert also eine Referenz auf eine Instanz vom Typ Panzer, daher kann die in Typ Panzer deklarierte Methode schießen verwendet werden.

Diese Referenz (=Adresse des Objekts im Hauptspeicher) kann einer Variablen zugewiesen werden, sofern der Typ dieser Variablen zuweisungskompatibel ist. Bei komplexen Datentypen ist das der Fall, wenn es sich um den gleichen Typ oder einer seiner Supertypen handelt.

Java:
Panzer p = new Panzer();  // Variable p vom Typ Panzer speichert Referenz auf Instanz vom Typ Panzer
Schwimmfähig f = new Panzer(); // Variable f vom Typ Schwimmfähig speichert Referenz auf Instanz vom Typ Panzer
Soll nun eine Methode über eine dieser Variablen aufgerufen werden, ist der Typ der Variablen ausschlaggebend. So hat p den Typ Panzer, man kann also über p alle Methoden von Panzer (oder einer seiner Supertypen) aufgerufen werden. Variable f hat dagegen den Typ Schwimmfähig, es können also nur die Methoden von Schwimmfähig (oder einer ihrere Supertypen) aufgerufen werden.
Thx
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Wobei mir bei @mrBrown halt die Abgrenzung fehlt. Auch wenn der Panzer in einer Variable vom Typ Swimable gespeichert ist, kann man alle Methoden von Panzer aufrufen. Nur eben nicht durch direkte Java Aufrufe auf der Variable sondern eben über den Umweg eines Cast oder eben durch Reflection.

Es ist zwar sehr wahrscheinlich, dass Heyoka diese Abgrenzung für sich eh schon gesehen hat, aber diese Abgrenzung selbst ist, so wie ich das sehe, nie gemacht worden.
 
Meinst Du bei mir oder bei @mrBrown?
Du weisst, doch, wenn ich @mrBrown sage, dann meine ich @mihe7 und umgekehrt :)

Spass beiseite - das trifft euch beide. Deine lange Antwort ebenso wie die die Antwort von @mrBrown.

@mrBrown hatte ja pauschal mit "Ja" geantwortet in #6 und Heyoka fand seine Antwort ja auch ganz toll so wie ich ihn verstanden habe. Kurz, knapp. Bei anderen Antworten muss er zu viel lesen ... da könnte er ja dann auch genau so gut das Script von der Vorlesung lesen... Also hätte uns beiden doch klar sein müssen, dass unsere Antworten so nicht erwünscht sein können von Seiten des TE!

Aber ich meine, bei Deiner Antwort hast Du diese Aspekte von mir auch nicht betrachtet, oder? Muss aber gestehen, dass ich das nicht im Detail gelesen habe, da der Beitrag kam, als ich:
a) zeitlich etwas ausgelasteter war
b) die Motivation gering war, da Heyoka das offensichtlich zu viel Text war und ich mich da eigentlich weniger in diesem Thread aufhalten wollte...

Aber wo man dann wieder etwas mehr Off Topic geworden ist, wollte ich mich doch direkt wieder beteiligen, denn ich will mir von euch nicht vorwerfen lassen, dass nur wegen meinem Desinteresse keine 500 Posts in diesem Thread zustande kommen ....
 
Aber ich meine, bei Deiner Antwort hast Du diese Aspekte von mir auch nicht betrachtet, oder?
Nein, ich hab ganz unabhängig versucht (er hat sich stets bemüht...), eine möglichst allgemein gültige und dennoch halbwegs präzise Antwort zu geben. Da bemüht man sich einmal, einen vernünftigen Satz rauszulassen und dann so was (warum gibt es hier keinen *heul*-Smiley?) :D

"Zur Übersetzungszeit steht der Typ von Objekten bzw. Variablen fest (= kann man unmittelbar aus dem Code ableiten). Du kannst nur die Methoden verwenden, die der Typ (inkl. seiner Supertypen) deklariert hat."

Damit wollte ich mich auf die Übersetzungszeit beschränkt wissen. Reflection geschieht erst zur Laufzeit, im Code werden ja die Methoden von Class, Method, etc. verwendet, und ein Cast dient gerade dazu, dem Compiler den Typ mitzuteilen.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben