Überschreiben, Überladen, Verdecken
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Klausur SS13 Aufgabe 2
Hallo, kann jemand meine Erklärungen zu den Antworten prüfen. Die meisten Probleme hab ich mit den Regeln bei Interfaces (Instanz-, statische Methoden, Instanzvariablen).
tv.verdauen(1)
ist unverdaulich [Interface, Instanzmethode → dyn. Bindung, f.08-116. Da in interface Parameter als long steht → Methode mit long ist auszuwaehlen]
tm.menge
42 [Interface, (Klassen)Instanzattribut → verdecken → stat. Bindung]
tm.verdauen(2)
2 [Interface, Instanzmethode → dyn. Bindung]
om.menge
0.815 kg [Instanzattribut → verdecken → stat. Bindung, ObstGericht erbt vom Essbar]
om.bananen
4711 [Instanzattribut → verdecken → stat. Bindung]
om.verdauen(3)
4711 [Instanzmethode → untersch. Signaturen, ueberladen → was besser passt → int!]
om.schaelen(Integer.MAX_VALUE + 123)
Apfelringe [stat.Methode → untersch. Signaturen, ueberladen → was besser passt → int? (bin nicht sicher, weil der Parameter doch > als int ist!)]
om.schaelen(“Kiwi”)
Birnenmus [Instanzmethode, gleiche Signaturen → ueberschreiben → dyn. Bindung]
Danke!
Die Ausgabe ist so richtig, die Erklärungen teilweise falsch.
Auch bei meinen Erklärungen gebe ich keine Gewähr auf Korrektheit oder Vollständigkeit.
Zunächst mal zu 1:
Trinkbar tv = new Vodka();
System.out.println(tv.verdauen(1));
Wir erzeugen eine Instanz der Oberklasse durch einen Konstruktoraufruf der Unterklasse. Der statische Datentyp ist der Datentyp der Oberklasse (hier “Trinkbar”), der dynamische ist der der Unterklasse (hier “Vodka”). Anschließend wird die Methode verdauen(1) der Klasse des statischen Datentyps Trinkbar aufgerufen. An dieser Stelle schauen wir auf die Signaturen. Da die Signatur in der Oberklasse ein long beinhaltet, wird die Methode verdauen(long humpen) aufgerufen, wodurch die Ausgabe “ist unverdaulich” (ohne Anführungszeichen) erfolgt.
Dann zu 2:
Trinkbar tm = new MilchShake();
System.out.println(tm.menge);
Analog zu 1 erzeugen wir eine Instanz der Oberklasse durch einen Konstruktoraufruf der Unterklasse. Jetzt wird das Attribut “menge” des statischen Datentyps (hier: “Trinkbar”) abgefragt. Dieses wird zu 42L ausgewertet. Beim Casten auf String in System.out.println() wird aus 42L abschließend 42.
Zu 3:
System.out.println(tm.verdauen(2));
Bei Interfaces haben die Methoden lediglich einen Rumpf. Daher wird die Methode verdauen() des dynamischen Datentyps “MilchShake” verwendet. In diesem Fall gibt sie also 2 aus.
Menge, Bananen und Verdauen sind prinzipiell so ähnlich wie die ersten 3 Ausgaben.
Zu 7:
ObstGericht om = new MilchShake();
System.out.println(om.schaelen(Integer.MAX_VALUE + 123));
Hier muss man beachten, dass ganze Zahlen und auch der Datentyp int mit der Addition eine Gruppe und folglich algebraisch abgeschlossen sind. Integer.MAX_VALUE + 123 ist in Java insofern nichts Anderes als Integer.MIN_VALUE + 122, weshalb der Parameter int bleibt. Das wird am besten in der Vorlesung GTI erklärt, ein Stichwort wäre “Überläufe”. Ansonsten ist die Erklärung analog zu 1. Dabei ist völlig egal, ob die Methode eine statische Methode oder eine Instanzmethode ist - in beiden Fällen ist die Ausgabe gleich.
Zu 8:
System.out.println(om.schaelen("Kiwi"));
Hier ist die Erklärung wieder analog zu 1, allerdings sind die Signaturen gleich. Daher wird in diesem Fall die Methode des dynamischen Datentyps ausgewertet. In diesem Fall gibt die Methode somit “Birnenmus” aus.
Gesamtausgabe:
ist unverdaulich
42
2
0.815 kg
4711
4711
Apfelringe
Birnenmus
Ein Schema F wäre - sofern ich das richtig verstanden habe:
Bei Attributen: statischer Datentyp
Bei Methoden: gleiche Signatur => dynamischer Datentyp, unterschiedliche Signatur => statischer Datentyp
Bei Interfaces und abstrakten Methoden: dynamischer Datentyp