Polymorphie Zugriff auf Instanzmethode in Großvaterklasse

crissiloop

Mitglied
Hallo,

ich habe ein kleines Probleme mit dem Zugriff auf eine Instanzmethode der Großvaterklasse. Es ist in der Großvaterklasse eine Methode definiert, welche in der Vaterklasse verdeckt wird. Nun möchte ich aus der Sohnklasse auf die Methode in der Großvaterklasse zugreifen.

laut meinem Buch müsste es gehen mit
Java:
((Großvaterklasse) this).methode();
Leider führt dies aber nicht zum Erfolg. Der Kompiler meckert zwar nicht, aber bei Ausführung werden in der Konsole unendliche viele Zeilen ausgegeben, die so aussehen
Code:
Klasse.methode(Klasse.java:Zeilennummer)

Ich habe auch schon den Aufruf über
Java:
Großvaterklasse.methode();
probiert, was der Kompiler aber mit Fehlermeldung wegen statisch und nicht statisch abbricht.

Kann mir jemand weiterhelfen?

Christian
 

Michael...

Top Contributor
Vielleicht machst Du mal ein Beispiel, was Du meinst.
Von Verdecken spricht man wenn eine Klasse eine Klassenmethode mit der selben Signatur besitzt wie deren Super Klasse.
Klassenmethoden werden dann allerdings an der Klasse und nicht an einem Objekt der Klasse aufgerufen.
 

Kevin94

Top Contributor
Er meint das er eine überschriebene Instanzmethode hat und die "Version" der Methode in der "Grosvaterklasse" ausführen möchte. Auserhalb der Klasse in der dies passieren soll ist dies afaik wegen Polymorphie nicht möglich, inerhalb der Klasse führt dein Code zum gewünschten Ergebniss.

Die Ausgabe, die du beschreibst hört sich verdächtig nach einer Exception an, poste doch sie doch mal (am besten mit konkretem Code).
 
B

bygones

Gast
mit "verdeckt" ist wahrscheinlich ueberschrieben gemeint.

D.h. in der Grossvater klasse ist eine Methode definiert, die die Vater klasse ueberschreibt. Die Kindklasse will nun aber die Grossvater methode aufrufen und nicht die Vater methode.

wenn das der fall ist wuesste ich keinen weg in der Kindklasse die methode der Grossvaterklasse aufzurufen.

Es klingt eher nach einem design-fehler und dass entweder die Vererbung nicht richtig ist bzw diese Methode anderweitig definiert werden muss
 

Crian

Top Contributor
Hilft sowas wie
Code:
super.super.method()
? Nachdem was Google ausspuckt, ist das allerdings nicht erlaubt.

Es klingt eher nach einem design-fehler und dass entweder die Vererbung nicht richtig ist bzw diese Methode anderweitig definiert werden muss

Das denke ich auch.


Edit: Ich habe gerade ein kleines Beispiel versucht zu basteln, super.super funktioniert wirklich nicht, was vermutlich sehr gut so ist.
 
Zuletzt bearbeitet:

crissiloop

Mitglied
so, also nochmal zu meinem Problem.
Ja ihr habt recht, dass ich Überschreiben meine und nicht Verdecken. Komme da noch ab und zu durcheinander.

Ich kann sicher die Methode in der Sohnklasse so definieren, wie ich sie benötige. Aber ich wollte halt die Methode aus der Großvaterklasse nutzen, so dass ich Änderungen nur einmal durchführen muss.
Dass super.super.methode() nicht funktioniert weiß ich auch bereits.

Nun ist hatl die Frage: Geht der Aufruf über
Java:
((Shape) this).toString()
oder nicht?

Ich bekomme leider keine Exception oder kann Sie zumindest nicht sehen im Prompt. Dort steht nur sehr oft:
Code:
Square.toString(Square.java:14

nun der Code der Dateien, welche ich benutze:
Großvaterklasse: Shape.java
Java:
public class Shape {

    /** x-Koordinate des Ursprungs */
    protected double xOrigin;

    /** y-Koordinate des Ursprungs */
    protected double yOrigin;

    /**
     * Konstruktor für eine Form mit Parametern X-Wert und Y-Wert des Ursprungs
     *
     *
     * @param x
     *            x-Koordinate des Ursprungs der "Form"
     * @param y
     *            y-Koordinate des Ursprungs
     *
     */
    public Shape(double x, double y) {
        xOrigin = x;
        yOrigin = y;
    }


    /**
     * Gibt die Werte des Ursprungspunktes aus in der Form "(x, y)".
     * *
     *
     * @return den Ursprungspunkt als Text
     */
    public String origin() {
        return ("(" + xOrigin + ", " + yOrigin + ")");
    }

    /**
     * Gibt die Werte des Ursprungspunktes aus .
     *
     * @return das aktuelle Objekt als Text
     */
    public String toString() {
        return ("Ursprung: " + origin());
    }
}

die Vaterklasse: Rectangle.java
Java:
public class Rectangle extends Shape {

	 public double xDelta;									// Hälfte der Seitenlänge x des Rechtecks
	 public double yDelta;									// Hälfte der Seitenlänge y des Rechtecks


	 /** Konstruktor zur Erzeugung eines Objektes vom Typ Rectangle
	 * mit den Parametern x, y, xDelta und yDelta
	 * unter Verwendung des Konstruktor aus der Oberklasse Shape
	 */

	 public Rectangle (double x, double y, double xDelta, double yDelta) {

		 super (x, y);
		 this.xDelta = xDelta;
		 this.yDelta = yDelta;
	 }


    /**
	* Gibt Art des Objektes, die Werte des Ursprungspunktes und die Werte für xDelta und yDelta aus .
	*
	* @return das aktuelle Objekt als Text
	*/

	@Override
	public String toString() {
	   return ("Ein Objekt vom Typ " + this.getClass().getName() + " mit dem " + super.toString() + " xDelta: " + xDelta + " yDelta: " + yDelta);
    }
}

die Sohnklasse: Square.java
Java:
public class Square extends Rectangle {

	 public double delta;

	 public Square (double x, double y, double delta) {

		 super ( x, y, delta, delta);
		 this.delta = delta;
	 }

	 @Override
	 public String toString() {
	 	 return ("Ein Objekt vom Typ " + this.getClass().getName() + " mit dem " + ((Shape) this).toString() + " und Delta: " + delta);
     }
}

dazu noch die Klasse zum Erzeugen vom Objekt: ShapeTester.java
Java:
 public class ShapeTester {

 	public static void main (String [] args ) {

	 	Square square1 = new Square (30,20,5);						// Erzeugen eines neuen Square Objekts
	 	Reporter.report (square1);
	}
}

und die Reporter.java
Java:
 public class Reporter {

	 /**
	 * in der Methode werden die einzelnen Methoden der geometrischen Formen aufgerufen
	 * @param Objekte als Typ Shape, da alle Objekte von der Superklasse Shape abstammen
	 */

	 public static void report(Shape s) {

		 System.out.println (s.toString());
		 System.out.println();
	 }
 }
 

Kevin94

Top Contributor
In diesem Fall geb ich den anderen Recht, dein Problem ist eindutig ein Designfehler.
Schreib halt einfach anstatt [c]super.toString()[/c] das was in toString steht [c]"Ursprung:" +origin()[/c]

Was die Exception angeht: Du hast unbeabsichtigt eine Endlos-Rekursion eingebaut, was zu einem StackOverflowError führt, und da die Konsol nur eine begrenzte Anzahl Zeilen speichert, siehst du den Anfang der Ausgabe nicht mehr. Daraus folgere ich, dass die man eine doppelt überschrieben Methode nicht in der Urfassung aufrufen kann, was eigentlich nur eine korrkte Umsetzung von Polymorphie ist.

wenn du in Windows arbeitest, dann leite die Ausgabe mal in eine Datei um: [c]java ShapeTester > Ausgabe.txt[/c]
 

Michael...

Top Contributor
Man könnte in der Klasse Shape eine Methode
Code:
protected String basicString()
implementieren, die dann in der toString() der Subklassen verwendet wird. Dann könnte man sich für die Klasse Square sogar das überschreiben der toString() Methode sparen.
Wobei mir aus dem Code nicht unbedingt klar wird wozu man die Klasse Square überhaupt benötigt, da sie keine anderen Möglichkeiten als die Klasse Rectanlge bietet. So wie es aussieht würde es reichen der Klasse Rectangle einen zweiten Konstruktor (wie der in Square) zu spendieren.
 
M

maki

Gast
IMHO ist die Klasse "Square" vollkommen überflüssig (der Designfehler).
Ohne diese stellt sich das Problem gar nicht.
 

mediafreak

Neues Mitglied
Java:
return ("Ein Objekt vom Typ " + this.getClass().getName() + " mit dem " + ((Shape) this).toString() + " und Delta: " + delta);

statt
Java:
((Shape) this).toString()
verwendest Du
Java:
origin()

dann sollte es funktionierten ... bei mir funzt es zumindestens


mfg
mediafreak
 
Zuletzt bearbeitet:

crissiloop

Mitglied
Vielen Dank für die vielen Antworten.

Über den Unsinn der Klasse Square brauchen wir ja nicht streiten. Leider war dies so vorgegeben und nicht meine Idee.

Ich habe es jetzt auch ähnlich gelöst, wie von Mediafreak geschrieben und habe mich auf die Funktion
Code:
origin()
in der Klasse Shape bezogen im Fall von Square.
Und ich denke ich habe jetzt eine ganz vernünftige Lösung gefunden, welche der Aufgabenstellung entspricht.

Die Frage kam aber auf, weil der Prof meinte, dass ein Zugriff mit
Code:
((Shape) this).toString()
auf die Instanzmethode der Großvaterklasse möglich sei!
Code:
super.methode()
wird wohl sowieso vom Kompiler auf
Code:
((Vaterklasse) this).methode()
.

mfG
crissiloop
 
B

bygones

Gast
Die Frage kam aber auf, weil der Prof meinte, dass ein Zugriff mit
Code:
((Shape) this).toString()
auf die Instanzmethode der Großvaterklasse möglich sei!
Code:
super.methode()
wird wohl sowieso vom Kompiler auf
Code:
((Vaterklasse) this).methode()
.
dann sagt der Prof Unsinn. nur wenn man ((Shape)this).toString() aufruft macht das noch nix.... sonst wuerde ja ((Object)this).tostring() immer die Object toString aufrufen, tuts aber nicht. this bleibt nun mal die Unterklasse, egal was man davor schreibt.
super.methode() spricht die Methode der Oberklasse an, der compiler macht da nicht irgendwelche casts
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
B Erste Schritte Array-Zugriff Java Basics - Anfänger-Themen 10
D OOP Zugriff auf Objekte A in Klasse A aus Objekt B in Klasse B Java Basics - Anfänger-Themen 3
T Collections Zugriff auf Elemente aus Iterator() Schleife Java Basics - Anfänger-Themen 4
J Threads Zugriff auf Attribute Java Basics - Anfänger-Themen 16
N Kein Zugriff auf Ordner -> NullPointerException Java Basics - Anfänger-Themen 2
I kein zugriff auf jList oder Textfield Java Basics - Anfänger-Themen 2
N Problem bei Zugriff auf Textfelder Java Basics - Anfänger-Themen 6
LittleJavaCup Zugriff auf Klasse von package Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben