![]() |
|
|
|||||||
| Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |||
|
Neuer Benutzer
Bit
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
|
Die Ausgabe ist: A B L B X M Ich kann das nicht nachvollziehen. Kann mir jemand die Methodenaufruge detaliert erklären? Diese Aufgabe ist eine Klausuraufgabe und ich muss die Detailiert erklären. Ich komme nicht weiter, weil ich nicht weiß was JAVA hier macht. Vielen Dank |
||
|
|
|
| #2 (permalink) | |||
|
Stammbenutzer
Halbes Gigabyte
Registriert seit: 17.02.2009
Beiträge: 6.243
Abgegebene Danke: 5
Erhielt 940 Danke für 938 Beiträge
|
Zunächst mal würde ich die Variablennamen oo, uu, ff und eventuell die Methode gg anständig umbenennen.
Danach ist das recht einfach: Man muss sich nur noch anschauen an welchem Objekt wird die Methode gg mit welchem Objekt aufgerufen
Das gemeine an dem ganzen ist das mit Ober ff = new Mitte(); eine Superklasse über seine Subklasse instanziert wird.
|
||
|
|
|
| #3 (permalink) | |
|
Neuer Benutzer
Bit
Themenstarter
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
|
Die Ausgabe
A (kann ich nachvollziehen) B (kann ich nicht nachvollziehen da gg() überladene Methoden sind und ich in Ober keine gg() funktion mit dem Objekt - Unter (uu) sehen kann...wieso wird dann B ausgegeben?)
|
|
|
|
| #6 (permalink) | |
|
Neuer Benutzer
Bit
Themenstarter
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
|
Aber ff.gg(uu); uu ist doch eine instanz von der Unterklasse und soweit ich das sehen kann, ist in ff eine methode gg(Unter uu) drin....wieso wird die nicht aufgerufen?
|
|
|
|
| #8 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Beiträge: 27.714
Abgegebene Danke: 0
Erhielt 1.799 Danke für 1.780 Beiträge
|
der Compiler legt schon zur Laufzeit fest, welche Methoden-Signatur aufgerufen wird, und zwar vom gegebenen Interface aus,
Compiler sieht Ober -> da passt gg(Mitte m) am besten zur Laufzeit kann dann eine etwaige Subklasse höchstens noch genau die Methode gg(Mitte m) überschreiben und sich so einschleichen, eine Methode mit anderer Signatur (anderen Parameter) hat keine Macht
__________________
Hansa wird Meister. |
|
|
|
| #10 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Beiträge: 27.714
Abgegebene Danke: 0
Erhielt 1.799 Danke für 1.780 Beiträge
|
das sieht man an Aufruf 1 und 3, einmal kommt A raus, einem L obwohl der Parameter (ff) und das Interface (Ober) gleich sind,
der Compiler wählt dieselbe Methoden-Signatur aus, aber bei Aufruf 3 ist es ein Mitte-Objekt, welches die Methode überschreibt
__________________
Hansa wird Meister. |
|
|
|
| #11 (permalink) | |
|
Stammbenutzer
Halbes Gigabyte
Registriert seit: 17.02.2009
Beiträge: 6.243
Abgegebene Danke: 5
Erhielt 940 Danke für 938 Beiträge
|
Das ist eigentlich genau das, was SlaterB erklärt hat.
In dem konkreten Fall bedeutet es, dass mit Ober ff = new Mitte(); ein Objekt vom Typ Ober erzeugt wird, durch die initialisierung aber über Mitte() die Methodegg(Ober o) {System.out.println("A");} der Klasse Oberdurch die Methode gg(Ober o) {System.out.println("L");} der Klasse Mitte überschrieben wird.Die Methode gg(Unter u) von Mitte wird nicht implementiert, da der Compiler ja von einem Ober Objekt ausgeht. Man erzeugt hier quasi ein "kastriertes" Objekt vom Typ Mitte, welches keine Methode gg(Unter u) besitzt |
|
|
|
| #13 (permalink) | |
|
Benutzer
int
Registriert seit: 21.10.2009
Beiträge: 35
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
|
Mich wundert, dass noch niemand den Fachbegriff genannt hat.
-> Dispatching Ich hoffe, ich bekomme das auswendig von selbst hin: Es gibt ein Formaltyp und ein Realtyp. X x = new Y(); X ist der Formaltyp von x und Y der Realtyp. Für das Dispatching also der Auswahl einer Methode ist zunächst der Realtyp des Zielobjekts relevant, also Y. Enthält die Zielmethode nun Parameter wird anhand des Parameters NICHT anhand des Realtypen ausgewählt, sondern anhand des Formaltypen. Benötigt man dieses Double-Dispatching. bei der vom Realtypen auch bei Parametern entschieden werden soll, setzt man das Visitor-Pattern ein. Andere Programmiersprachen können Double-Dispatching ohne Entwurfsmuster. Java kann dies nicht ohne Entwurfsmuster. Visitor pattern - Wikipedia, the free encyclopedia Geändert von miwoe (16.02.2010 um 22:12 Uhr) |
|
|
|
| Danke sagt: |
MrIP (17.02.2010)
|
|
| Lesezeichen |
| Stichworte |
| extends , klassen , konstruktoren , veerbung |
Latex Maths & Physics Editor ...
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Warum hat Java keine Klassen "True" und "False"? | ben_bayram | Hausaufgaben | 12 | 17.06.2009 08:43 |
| Abstrakte Klassen | iotron | Java Basics - Anfänger-Themen | 22 | 09.01.2009 17:01 |
| Source Code von Sun's Java Klassen | hdi | Allgemeine Java-Themen | 11 | 28.10.2008 07:59 |
| Java Klassen "überschreiben" | Nova | Allgemeine Java-Themen | 28 | 14.08.2006 12:06 |
| java design von klassen und projekten | Allgemeine Java-Themen | 6 | 09.11.2005 09:53 | |