Java Polymorphie - kein Zugriff auf Methoden oder Attribute einer Unterklasse?!

drunken.panda

Captain
Registriert
Juli 2008
Beiträge
3.917
Servus miteinander,

sitze aktuell an einem Problem und zwar habe ich das Problem, dass ich drei Klassen erstellt habe die da heißen:

Figur, Kreis, Kreissektor.

Kreis extends Figur und Kreissektor extends Kreis.

Nun möchte ich gerne in einem Testtreiber eine Referenzvariable vom Typ Kreis erstellen, der auf ein Objekt der Klasse Kreissektor zeigt. Funktioniert auch soweit nur leider habe ich keinerlei Zugriff auf die Attribute/Methoden der Kreissektor Klasse. Sollte das nicht möglich sein?

Ich kann erst auf die Attribute der Klasse Kreissektor zugreifen, wenn die Referenzvariable, die auf das Objekt zeigt vom Typ Kreissektor ist also:

Code:
Kreis Testkreis = new Kreissektor();

Testkreis.winkel = 25; --- Fehler kein Attribut namens Winkel gefunden

im Anhang noch zwei Screenshots. Machts vielleicht klarer.

Wo liegt mein Denkfehler?
 

Anhänge

  • Screenshot 2013-10-24 21.18.46.png
    Screenshot 2013-10-24 21.18.46.png
    93,4 KB · Aufrufe: 292
  • Screenshot 2013-10-24 21.18.01.png
    Screenshot 2013-10-24 21.18.01.png
    94,9 KB · Aufrufe: 274
Das funktioniert nur in die andere Richtung, d.h. du siehst alle Member der geerbten Typen. Schließlich ist nicht jeder Kreis ein Kreissektor und was da genau zur Laufzeit drin ist, kann der Compiler nicht wissen. Deshalb ist hier an der Stelle für den Compiler der statische Typ der Objektvariable entscheidend.
 
Fehlt vielleicht für die Instanzvariable "winkel" der Initialwert?


und die müsste statisch sein.
 
Okay dann war das der Fehler also von Kreissektor zu Kreis gehts.... Shit und ich saß Stunden dran...

Ne den Initialwert habe ich aus Faulheit weggelassen ;).
Ja beim Programmieren sinds immer so kleine Dinge. Danke Kinglouy.
 
Du kannst nur mit Unterklasse Methoden der Oberklasse aufrufen nicht umgekehrt, warum auch? :)
Du könntest natürlich das das Objekt nach "Unterklasse" casten, aber sinnvoll ist das nicht

Edit: Ups da war jemand schneller
 
Danke Leute aber wenn man erstmal sowas falsch im Kopf hat, denkt man darüber so schnell nicht mehr nach :/
Ergänzung ()

So wäre es dann richtig für alle die mal das selbe Problem haben:

Code:
Kreis Testkreis = new Kreissektor();
Testkreis.get_Flaecheninhalt();
// nutzt Methode aus der Klasse Kreissektor
Testkreis = new Kreis();
Kreis.get_Flaecheninhalt();
// nutzt Methode aus der Klasse Kreis

So kann ich die überschriebenen Methoden nutzen
 
Zuletzt bearbeitet:
KnoLLe123 schrieb:
Du könntest natürlich das das Objekt nach "Unterklasse" casten, aber sinnvoll ist das nicht

das ist manchmal schon sinnvoll ^^ würde dann so aussehen:

Code:
Kreis testkreis = new Kreissektor();   //Variablennamen haben der übersicht halber einen kleinen Anfangsbuchstaben ;)
 //am besten vorher überprüfen ob es wirklich eine Instanz dieser Klasse ist, sonst gibt es einen Fehler
if(testkreis instanceof Kreissektor)         
{
    ((Kreissektor)testkreis).winkel = 25; //Kein Fehler, da das Objekt jetzt auch wirklich ein Kreissektor ist
    //oder etwas schöner
    Kreissektor sektor=(Kreissektor)testkreis;
    sektor.winkel=25;
}
 
drunken.panda schrieb:
Code:
Kreis Testkreis = new Kreissektor();
Testkreis.get_Flaecheninhalt();
// nutzt Methode aus der Klasse Kreissektor
Testkreis = new Kreis();
Kreis.get_Flaecheninhalt();
// nutzt Methode aus der Klasse Kreis

Den Bezeichner "Kreis" gibt es nicht als Variable in Zeile 5. Da wird der Compiler meckern. Das wird nur funktionieren, wenn die Klasse Kreis eine statische Methode get_Flaecheninhalt() hat.
 
Zurück
Oben