java-forum.org
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org > Java - Programmierung > Allgemeine Java-Themen

Allgemeine Java-Themen Allgemeine Themen, die nicht in andere Fachforen und nicht zu den Java Basics passen

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 16.02.2010, 11:07   #1 (permalink)
Neuer Benutzer
Bit
 
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
Standard Java Klassen und Veerbung mit nichtnachvollziebarer Methodenaufrufe :(

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
public class Start {
 
public static void main(String[] args){
 
    Ober oo = new Ober();
    Ober ff = new Mitte();
    Unter uu = new Unter();
    
    oo.gg(ff);
    oo.gg(uu);
    ff.gg(ff);
    ff.gg(uu);
    uu.gg(ff);
    uu.gg(uu);
 
}
}
 
public class Ober {
 
    public void gg (Ober o){ System.out.println("A");}
    public void gg (Mitte m){System.out.println("B");}
    public void gg (Object m){System.out.println("O");}
}
 
 
public class Mitte extends Ober {
    public void gg (Ober o){ System.out.println("L");}
    public void gg (Unter u){System.out.println("M");}
}
 
public class Unter extends Mitte {
 
    public void gg (Ober o) {System.out.println("X");}
    public void gg (Mitte m){System.out.println("Z");}
    
}

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
MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 11:28   #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

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
Ober oo = new Ober();    //oo ist vom Typ Ober
Ober ff = new Mitte();   // ff ist nach aussen hin vom Typ Ober
        // benutzt aber die überschriebenen Methoden von Mitte
        // da über Mitte() instanziert (möglich da Mitte von Ober erbt)
 
oo.gg(ff); // an einem Objekt vom Typ Ober wird gg 
              // mit einem Objekt vom Typ Ober aufgerufen
              // --> System.out.println("A");

Das gemeine an dem ganzen ist das mit Ober ff = new Mitte(); eine Superklasse über seine Subklasse instanziert wird.
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 12:33   #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?)

MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 12:38   #4 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Beiträge: 27.714
Abgegebene Danke: 0
Erhielt 1.799 Danke für 1.780 Beiträge
was sollte denn stattdessen ausgegeben werden? oder erwartest du eine Fehlermeldung 'Aufruf geht nicht'?
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 12:41   #5 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Registriert seit: 17.02.2009
Beiträge: 6.243
Abgegebene Danke: 5
Erhielt 940 Danke für 938 Beiträge
Ober besitzt eine Methode gg(Mitte m) und Unter erbt von Mitte --> B
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 13:04   #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?
MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 13:17   #7 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Registriert seit: 17.02.2009
Beiträge: 6.243
Abgegebene Danke: 5
Erhielt 940 Danke für 938 Beiträge
Achso Du redest vom zweiten B!
Du must bedenken, dass ff als Objekt von Typ Ober deklariert ist
und Ober besitzt keine Methode gg(Unter u)
Java Code: Quelltext in neuem Fenster öffnen
1
Ober ff = new Mitte();
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 13:25   #8 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
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.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 13:30   #9 (permalink)
Neuer Benutzer
Bit
Themenstarter
 
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
Dann frage ich mich, wo der Unterschied zwischen

Java Code: Quelltext in neuem Fenster öffnen
1
Ober ff = new Mitte();

und

Java Code: Quelltext in neuem Fenster öffnen
1
Ober ff = new Ober();

ist?
MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 13:50   #10 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
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.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 14:01   #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 Methode
gg(Ober o) {System.out.println("A");} der Klasse Ober
durch 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
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 14:02   #12 (permalink)
Neuer Benutzer
Bit
Themenstarter
 
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
Vielen dank...ich werde das erstmal so akzeptieren...meine Frage wäre, wo man so ein Mist programmiert?
Ist ja nur eine Klausuraufgabe
MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 16.02.2010, 22:10   #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)
miwoe ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
MrIP (17.02.2010)
Alt 17.02.2010, 14:14   #14 (permalink)
Neuer Benutzer
Bit
Themenstarter
 
Registriert seit: 16.02.2010
Beiträge: 6
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
Ja damit kann ich was anfangen...Ich glaub diese Form ist in C++ nicht ohne weiteres möglich wenn ich jetzt richtig überlege...vielen Dank
MrIP ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Lesezeichen

Stichworte
extends , klassen , konstruktoren , veerbung

Latex Maths & Physics Editor ...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ä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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de