Methodenaufrufe abstrakte Klassen, Interfaces

JWZ

Mitglied
Hallo,

ich lerne gerade Java und habe ein Verständnisproblem bei einer Aufgabe. Es soll entschieden werden, ob bestimmte Methodenaufrufe vom Compiler zugelassen werden und wenn ja, welche Ausgabe es gibt. Ich bin durch die Forensuche leider nicht schlauer geworden, deshalb hoffe ich, dass mir jemand helfen kann.

Es sind folgende Klassen gegeben:

Interface Inter{
public m(Hund h, Object o)
}

abstract class Super implements Inter{
public m(Lebewesen l1, Lebewesen l2)
}

class Sub extends Super{
public m(Hund h, Object o){
System.out.println("m1");
}
public m(Lebewesen l1, Lebewesen l2){
System.out.println("m2");
}
public m(Hund h, Tier t){
System.out.println("m3");
}
}

Außerdem:

class Lebewesen{}
class Tier extends Lebewesen{}
class Hund extends Tier{}

In der main-Methode werden jetzt folgende Objekte erzeugt:

Inter s1=new Sub();
Super s2=new Sub();
Hund h = new Hund();
Tier t = h;
Lebewesen l1=new Tier();
Lebewesen l2=new Tier();

Frage:
1. beim Aufruf s1.m(h,t); wird "m1" ausgegeben. Der Deklarationstyp von s1 ist Inter, deshalb kommen nur Methoden m() in Frage, die in Inter deklariert sind. Es wird jetzt die speziellste der passenden Methoden bzgl. der Parameter gesucht, hier gibt es nur eine und die Signatur passt. Diese wird dann aufgrund des Typen der Instanz, die s1 referenziert dynamisch an die überschriebene Methode in Sub gebunden. So habe ich das zumindest verstanden.

2. wieso erzeugt der Aufruf s2.m(h,t) dann einen Compilerfehler? Die Methode in Super passt auf den Aufruf, denn die Deklarationstypen der Übergebenen Parameter sind Subtypen der Parameter in der Methodensignatur. Diese müsste doch dann genau wie in 1. dynamisch in Sub gebunden werden (also "m2" ausgeben). Falls die Methode in Inter auch in Super als abstrakte Methode existiert (dabei bin ich mir nicht sicher), dann müsste diese gewählt werden, denn sie ist spezieller oder täusche ich mich?

Ein weiterer Aufruf wäre z.B. s2.m(l1,l2), das funktioniert, weil es eine Methode m() in Super gibt, auf dessen Signatur der Aufruf passt. Die Methode wird dann aufgrund des Referenztypen in Sub dynamisch gebunden und es wird "m2" ausgegeben.

Mein Vorgehen ist also folgendes: Ich schaue mir als erstes den Deklartionstypen der Variablen an, der die Methode aufruft (z.B. Inter). Dann suche ich mir alle Methoden in dieser Klasse (geerbt und deklariert) raus, bei denen die Signatur passt. Bei den übergebenen Parametern ist hier nur der Deklarationstyp von Bedeutung, z.B. bei s1.m(h,t) Hund H und Tier t. Sollten jetzt noch mehr als eine Methode übrig sein, wird die speziellste (most-specific-algorithm) gewählt. Anschließend schaue ich mir den dynamischen Typen von s1 an, hier wäre es Sub, und finde damit die auszuführende Methode in Sub.

Wo mache ich den Fehler? Oder habe ich irgendwas total falsch verstanden?
 

Oneixee5

Top Contributor
Also das compiliert nicht, da ein ; fehlt:
Java:
Interface Inter{
public m(Hund h, Object o)
}
Somit compiliert alles andere auch nicht. Der Compiler wird also nichts weiter zulassen.
 

JWZ

Mitglied
Also das compiliert nicht, da ein ; fehlt:
Java:
Interface Inter{
public m(Hund h, Object o)
}
Somit compiliert alles andere auch nicht. Der Compiler wird also nichts weiter zulassen.
oh ja, sorry, da hast du recht. Ich hab das einfach schnell hin geschrieben. Es geht mir nicht um syntaktische Fehler, sondern darum, dass in der Lösung der Aufgabe steht, dass der Aufruf von 2. einen Compilerfehler erzeugt und ich nicht verstehe wieso. Nehmen wir also an, dass keine Semikolon, Klammern etc. vergessen wurden.
 

Jw456

Top Contributor
Super hat "public m(Lebewesen l1, Lebewesen l2) "
und nicht
s2.m(h,t) also "public m(Hund h, Object o)" oder "public m(Hund h, Tier t)"

das hat die Klasse SUB aber nicht Super.

Du hast aber den Typ Super (Super s2=new Sub();)



 

KonradN

Super-Moderator
Mitarbeiter
Super hat "public m(Lebewesen l1, Lebewesen l2) "
und nicht
s2.m(h,t) also public m(Hund h, Object o)
Doch, natürlich hat Super auch m(Hund, Object), denn Super implementiert Inter. Also mit paar Fixes sehen das Interface und die Klasse so aus:

Java:
Interface Inter{
    void m(Hund h, Object o);
}

abstract class Super implements Inter{
    public abstract void m(Lebewesen l1, Lebewesen l2);
}

Somit hat eine Instanz in einer Variable Super die Methoden:
void m(Hund h, Object o)
und
void m(Lebewesen l1, Lebewesen l2)

Mein Tipp: Schau es Dir doch einmal selbst in der IDE an ...
 

Jw456

Top Contributor
Doch, natürlich hat Super auch m(Hund, Object), denn Super implementiert Inter. Also mit paar Fixes sehen das Interface und die Klasse so aus:

Java:
Interface Inter{
    void m(Hund h, Object o);
}

abstract class Super implements Inter{
    public abstract void m(Lebewesen l1, Lebewesen l2);
}

Somit hat eine Instanz in einer Variable Super die Methoden:
void m(Hund h, Object o)
und
void m(Lebewesen l1, Lebewesen l2)

Mein Tipp: Schau es Dir doch einmal selbst in der IDE an ...
ja das stimmt
aber er will doch public m(Hund h, Tier t) und das ist erst in Sub.


edit: Und die Methode mit Hund, Objekt wird beim Implantieren auch nicht erstellt.
 

KonradN

Super-Moderator
Mitarbeiter
ja das stimmt
aber er will doch public m(Hund h, Tier t) und das ist erst in Sub.
Aber Hund -> Tier -> Lebewesen -> Object
Damit passen die Argumente Hund, Tier sowohl auf Hund, Object (Tier ist ein Object) als auch auf Lebewesen, Lebewesen, denn sowohl Hund als auch Tier sind Lebewesen.

Das Problem ist daher nicht, dass es keine Methode gibt, die verwendet werden könnte sondern, dass es zwei Methoden gibt, die in Frage kommen können. Und das erklärt auch den Punkt 2 vom TE.
 

Jw456

Top Contributor
Aber Hund -> Tier -> Lebewesen -> Object
Damit passen die Argumente Hund, Tier sowohl auf Hund, Object (Tier ist ein Object) als auch auf Lebewesen, Lebewesen, denn sowohl Hund als auch Tier sind Lebewesen.

Das Problem ist daher nicht, dass es keine Methode gibt, die verwendet werden könnte sondern, dass es zwei Methoden gibt, die in Frage kommen können. Und das erklärt auch den Punkt 2 vom TE.
ok
 

JWZ

Mitglied
Aber Hund -> Tier -> Lebewesen -> Object
Damit passen die Argumente Hund, Tier sowohl auf Hund, Object (Tier ist ein Object) als auch auf Lebewesen, Lebewesen, denn sowohl Hund als auch Tier sind Lebewesen.

Das Problem ist daher nicht, dass es keine Methode gibt, die verwendet werden könnte sondern, dass es zwei Methoden gibt, die in Frage kommen können. Und das erklärt auch den Punkt 2 vom TE.
Beim Aufruf s2.m(h,t) kommen also die Methoden m(Lebewesen l1, Lebewesen l2) aus Super und m(Hund h, Object o) aus Inter in Frage. Beim ersten Parameter ist m(Hund h, Object o) spezieller, denn h ist ein Hund. Beim zweiten Parameter sind bei beiden Methoden die Parameter Supertypen vom übergebenen Parameter Tier, es gibt also keinen spezielleren. Damit müsste doch die Methode m(Hund h, Object o) gewählt werden weil sie insgesamt spezieller ist oder nicht?

Einen Compilerfehler würde ich hier bei diesem Methodenaufruf verstehen, wenn z.B. die erste Methode die Signatur m(Lebewesen, Tier) anstatt m(Lebewesen, Lebewesen) hätte.
 

KonradN

Super-Moderator
Mitarbeiter
Ich denke, der wichtige Punkt aus der JLS aus 15.12.2.5 ist:
  • m2 is not generic, and m1 and m2 are applicable by strict or loose invocation, and where m1 has formal parameter types S1, ..., Sn and m2 has formal parameter types T1, ..., Tn, the type Si is more specific than Ti for argument ei for all i (1 ≤ in, n = k).

Auf Deutsch ist die Regel zu der spezifischsten Methode dann (jetzt einfach von ChatGPT erstellt):
Die spezifischste Methode gewinnt: Wenn mehrere Methoden aufgrund der oben genannten Konversionen passen, wählt Java die "spezifischste" Methode aus, d.h. die Methode, deren Parametertypen am besten zu den Argumenttypen passen. Eine Methode M1 gilt als spezifischer als eine Methode M2, wenn jeder Parameter von M1 vom gleichen oder einem abgeleiteten Typ jedes entsprechenden Parameters in M2 ist.

Also haben wir zwei Methoden mit den Parameter-Typen:
Hund / Object und Lebewesen / Lebewesen

Also vergleichen wir einmal:
Hund ist spezifischer als Lebewesen (Hund erbt von Tier erbt von Lebewesen)
Aber Object ist nicht spezifischer als Lebewesen. (Lebewesen erbt von Object)

Interessant wäre auch mal welchen Fehler du genau bekommst.
Wie schon gesagt: Spiel es doch einfach durch! Das ist der "Ambiguous method call" Fehler, der besagt, dass mehrere Methoden passen würden.
 

JWZ

Mitglied
Ich denke, der wichtige Punkt aus der JLS aus 15.12.2.5 ist:


Auf Deutsch ist die Regel zu der spezifischsten Methode dann (jetzt einfach von ChatGPT erstellt):


Also haben wir zwei Methoden mit den Parameter-Typen:
Hund / Object und Lebewesen / Lebewesen

Also vergleichen wir einmal:
Hund ist spezifischer als Lebewesen (Hund erbt von Tier erbt von Lebewesen)
Aber Object ist nicht spezifischer als Lebewesen. (Lebewesen erbt von Object)


Wie schon gesagt: Spiel es doch einfach durch! Das ist der "Ambiguous method call" Fehler, der besagt, dass mehrere Methoden passen würden.
Ich denke jetzt geht mir ein Licht auf! Ich dachte eine Methode m1 ist spezifischer als m2, wenn m1 mehr Parameter hat, dessen Typen genau mit den übergebenen Typen überein stimmen. Deshalb dachte ich, dass m(Hund,Object) spezifischer ist, da hier ja der erste Parameter genau übereinstimmt und bei m(Lebewesen,Lebewesen) stimmen beide nicht genau überein.
Mit der Definition macht das jetzt natürlich Sinn, denn Hund ist spezifischer als Lebewesen im ersten, aber Lebewesen ist spezifischer als Object im zweiten Parameter, so wie du erklärt hast!

Vielen Dank, damit wurde mir sehr für das Verständnis geholfen!
 

M.L.

Top Contributor
spezifischer...Verständnis
Generell geht es in der Programmierung darum, wie sich der Compiler ( Interpreter/Transpiler/...) verhält (z.B. via JLS definiert), wenn er auf ein Schlüsselwort trifft (oder i.V. mit anderen Schlüsselwörtern (nicht) trifft). Auch in der analogen Welt lässt z.B. eine Kaufanweisung für "eine Packung Salz von Hersteller X mit 500 Gramm" weniger Interpretation zu als "eine Packung Gewürz" (vorausgesetzt, es gibt etwas zu kaufen)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
M Lange Methodenaufrufe == suboptimales Klassendesign? Java Basics - Anfänger-Themen 5
D Wie baue ich sinnvoll eine Klasse, genauer die Methodenaufrufe auf? Java Basics - Anfänger-Themen 4
E Methoden Methodenaufrufe zählen Java Basics - Anfänger-Themen 11
D Interfaces und allgemeingültige Methodenaufrufe Java Basics - Anfänger-Themen 6
A Methodenaufrufe von Anonymen Klassen Java Basics - Anfänger-Themen 6
Kenan89 Methodenaufrufe verketten Java Basics - Anfänger-Themen 16
H Methodenaufrufe protokollieren Java Basics - Anfänger-Themen 7
T Methodenaufrufe zählen Java Basics - Anfänger-Themen 24
R Methodenaufrufe Java Basics - Anfänger-Themen 15
L Methodenaufrufe Protokollieren Java Basics - Anfänger-Themen 5
G Methodenaufrufe funktionieren nicht Java Basics - Anfänger-Themen 2
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
A Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt? Java Basics - Anfänger-Themen 7
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
K Abstrakte Klasse vs. Interface Java Basics - Anfänger-Themen 21
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
M abstrakte Klasse Java Basics - Anfänger-Themen 3
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
F Abstrakte Klasse: Konstruktor vs init() Java Basics - Anfänger-Themen 13
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
T abstrakte Klassen? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben