kleine Verständisfrage zur Klassenhierarchie, speziel JMenuItem

Mane123

Bekanntes Mitglied
Hallo zusammen,

wenn ich folge Quelltextzeile gegeben habe:

Java:
JMenuItem.add(AbstractAction)

Welche Methode "add" wird dann aufgerufen?

Wird dann automatisch die Methode add der Klasse java.awt.Container (public Component add(Component comp)) aufgerufen, da es in der Klasse JMenuItem ja keine Methode add(AbstractAction) gibt?

Vielen Dank!

Viele Grüße
 
Da AbstractAction nur eine Unterklasse von Object ist, wird denke ich mal Component.add(Object) aufgerufen.

Edit: Ist Quatsch, habe mich in der API verguckt.
 
Zuletzt bearbeitet:
Da AbstractAction keine Unterklasse von Component ist, und es keine andere passende Methode gibt, wird der Compiler eine Fehlermeldung ausgeben.

Ansonsten wird immer die 'neueste Version' einer Methode aufgerufen (von der Klassenhierarchie aus).
Ebenso wird bei Überladungen versucht die passendste Methode auszuwählen.

Ein paar Beispiele:
Java:
public static void main(String[] args)
{
	String s = "";
	
	print(s); // calling String with java.lang.String
	
	// Erzwingen eines Aufrufes
	print((Object) s); // calling Object with java.lang.String
	
	// Objekt hinter Referenz ist noch immer ein String
	Object o = s;
	
	print(o); // calling Object with java.lang.String
	
	print(new Object()); // calling Object with java.lang.Object
	
	AB ab = new AB();
	
	// Compilerfehler, da beide Methoden auf der gleichen 'Stufe' stehen
	// print(ab);
}

private static void print(String s)
{
	System.out.printf("calling String with %s\n", s.getClass().getName());
}

private static void print(Object o)
{
	System.out.printf("calling Object with %s\n", o.getClass().getName());
}

static interface A
{
}

static interface B
{
}

static class AB implements A, B
{
}

private static void print(A a)
{
	System.out.printf("calling A with %s\n", a.getClass().getName());
}

private void print(B b)
{
	System.out.printf("calling B with %s\n", b.getClass().getName());
}
 
Danke für die Antworten.

Also bei meiner oben genannten Methode erscheint keine Fehlermeldung, die habe ich aus einem Java Lehrbuch.

Warum würde bei deinem Quelltext eine Fehlermeldung erscheinen?

print(ab) ist ja nur ein Objekt und nicht zwei?

Viele Grüße
 
Die Schreibweise aus deinem Buch scheint recht ungewöhnlich. Variablen werden eigentlich grundsätzlich klein geschrieben, daher liest es sich schon merkwürdig.

Suinos hat schon recht. Bei dir muss eine Fehlermeldung erscheinen, je nachdem was für eine IDE du nutzt. Da JMenuItem keine eigene .add() Methode hat, jedoch eine von der Klasse Container erbt kann sie diese nutzen. Jedoch benötigen alle add-Methoden der Klasse Container ein Objekt vom Typ Component und können daher keine AbstractAction entgegen nehmen.

Möchte man ein JMenuItem mit einer Action versehen, so gibt man diese üblicherweise im Konstruktor mit:

Java:
 JMenuItem item = new JMenuItem( new BlaAction() );

oder setzt sie über die Methode

Java:
JMenuItem item = new JMenuItem();
item.setAction(AbstractAction);

Da man von Abstrakten Klassen keine Objekte erzeugen kann, kann man hier nur Klassen übergeben, die vom Typ AbstractAction erben.
 
Zuletzt bearbeitet:
Schau mal ob das in dem Lehrbuch nicht nur ein Groß/Kleinschreibungs-Tippfehler ist, und
jMenuItem.add(abstractAction);
oder so heißen sollte. Ansonsten wäre mehr Kontext hilfreich.
 
Mane123 hat gesagt.:
Warum würde bei deinem Quelltext eine Fehlermeldung erscheinen?

print(ab) ist ja nur ein Objekt und nicht zwei?

Das eine Objekt implementiert aber zwei Interfaces (
Code:
class AB implements A, B
).
Der Compiler kann also nicht wissen, welche Methode aufgerufen werden soll (
Code:
print(A)
oder
Code:
print(B)
), da beide gültig wären.

--

Zu deiner Methode:

Die Klassenhierarchie von
Code:
AbstractAction
sieht so aus:
Code:
Object
 - AbstractAction

Zusätzlich werden diese Interfaces implementiert:
Code:
Action, Cloneable, Serializable
(Quelle)

Um ein
Code:
AbstractAction
-Objekt als Parameter übergeben zu können, muss der Typ des Parameters einer der genannten Typen sein.

Da keine solche
Code:
add
Methode existiert, gibt der Compiler eine Fehlermeldung aus.
 
Hallo zusammen,

ich glaub ich weiß was ich falsch gemacht habe:

Ich war gestern nicht zu Hause und hatte das Buch nicht dabei. Ich habe die Codezeile aus dem Kopf heraus getippt.

Korrekt müsste es so lauten (allgemein formuliert):

Java:
JMenu.add(AbstractAction)

In der Klasse JMenu gibt es auch eine Methode add(AbstractAction)


JMenu und AbstractAction sollen wirklich nur die Klasse darstellen, ich glaube das habe ich auch falsch ausgedruckt?

In meinem Listing schaut es tatsächlich so aus:

Java:
dateiOeffnen.add(oeffnenAct);

Wie kann ich denn in Zukunft die oben stehende Zeile allgemein formulieren, dass sie jeder versteht?

Vielen Dank!
 

Zurück
Oben