Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Theorie
- Statischer Typ: Ist der Typ einer Variablen, die bei der Variablendeklaration angegeben sind. Dieser Typ ist bei der Kompilierung schon bekannt.
- - Bei private, final, static Methoden sowie bei Variablen wird immer der statische Typ genutzt.
- Dynamischer Typ: Ist der Typ einer Variable, welcher erst zur Laufzeit bekannt ist und kann vom statischen Typen abweichen; Ist der Typ vom Wert der Variable: d.h. der “echte” Typ der Klasse.
- - Bei normalen, nicht statischen Methoden, wird der Dynamische Typ verwendet (natürlich nur wenn diese Überschrieben wurde)
- Methodensignatur: Kombination aus Name und Übergabetypen einer Methode.
- Überschreiben: Überschreiben einer Methode der Elternklasse in der Kindklasse -> Nur bei Veerbung
- Überladen: Mehrere Methoden vom gleichen Namen in einer Klasse -> Unterscheiden sich über die Parameterliste (NICHT über Return-Types)
- Dynamic Dispatch: Mechanismus in dem die ausgeführte Methode erst zur Laufzeit anhand des dynamischen Typen ermittelt wird.
- Casts:
- - Ändern den statischen Typen
- - Bei Bedarf werden subclasses automatisch in ihre superclasses gecastet
- - Um von einer superclass in eine subclass zu casten muss dies manuell gemacht werden. Hierzu muss jedoch der dynamische Typ der subclass entsprechen in die gecastet wird, sonst
- wirft die JVM eine ClassCastException. ! Nicht zu verwechseln mit dynamic Dispatch !
- Betrachte einen Aufruf e0.f(e1,...,ek). Ermittlung der aufgerufenen Methode:
- - Bestimme die statischen Typen T0,...,Tk der Ausdrücke e0,...,ek.
- - Suche in einer Oberklasse von T0 nach einer Methode mit Namen f, deren Liste von Argumenttypen bestmöglich zu der Liste T1,...,Tk passt.
- Der Typ I dieser rein statisch gefundenen Methode ist die Signatur der Methode f an dieser Aufrufstelle im Programm.
- - Der dynamische Typ D des Objekts, zu dem sich e0 auswertet, gehört zu einer Unterklasse von T0.
- - Die Methode f wird nun aufgerufen, deren Typ I ist und die in der nächsten Oberklasse von D implementiert wird.
- Beispiel:
- public class A {
- public static int x = 0;
- public static String name() {
- return "Klasse A: name";
- }
- public String method() {
- return "Klasse A: method";
- }
- }
- public class B extends A {
- public static int x = 42;
- public static String name() {
- return "Klasse B: name";
- }
- public String method() {
- return "Klasse B: method";
- }
- }
- public class Main {
- public static void main(String[] args) {
- B v1 = new B();
- System.out.println(v1.x);
- System.out.println(v1.name());
- System.out.println(v1.method());
- A v2 = new B();
- System.out.println(v2.x);
- System.out.println(v2.name());
- System.out.println(v2.method());
- }
- }
- Ausgabe:
- 42
- Klasse B: name
- Klasse B: method
- 0
- Klasse A: name
- Klasse B: method
- Statische Wahl Begründungen:
- - Speziellste Signatur
- - niedrigste Unterklasse
- - Eindeutig
- Dynamische Wahl Begründungen:
- - stat. Typ = dyn. Typ
- - static, Kein Dispatch (-> Wahl nach Statischem Typ, kein dynamic Dispatch)
- - dynamisch ein ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement