Polymorphie Verständnisproblem Vererbung/Polymorphie

HansSchnier

Neues Mitglied
Hallo Java Freunde,

ich habe ein Verständnisproblem im Bezug auf die Vererbung.
Wenn ich ein Objekt einer Oberklasse erzeuge, wir beim Versuch dieses auf eine Unterklasse zu casten eine ClassCastException ausgegeben. Ich verstehe nicht warum. Die Unterklasse verfügt doch über die gleichen Membervariablen wie die Unterklasse. Oder habe ich da grundsätzlich was falsch verstanden?

Beispiel:
Java:
public class test {
	

	public static void main(String[] args) {
		
		Stift stift = new Stift();
		stift.farbe = "blau";
		
		Druckbleistift druckbleistift = (Druckbleistift) stift;
		druckbleistift.mienenstaerke = "0.7";
		
	}

}

class Stift{
	String farbe;
}

class Druckbleistift extends Stift{
	String mienenstaerke;
	
}


Vielen Dank für eure Hilfe!
 
Wenn ich ein Objekt einer Oberklasse erzeuge, wir beim Versuch dieses auf eine Unterklasse zu casten eine ClassCastException ausgegeben.

Ja, leider kann man sich beim casten von Ober- zu Unterklasse nicht sicher sein ob es die passende Unterklasse gibt.
(Das es vielleicht nur 1 Unterklasse gibt - was unlogisch wäre - weiß Java nicht)
Umgekehrt ist das ganze kein Problem!

Auf dein Beispiel bezogen
Java:
class Stift{
String farbe;
}
 
class Druckbleistift extends Stift{
String mienenstaerke;
}

Die Klasse Druckbleistift ERWEITERT die Klasse Stift um mehr Funktionalität.
Das heißt ein Druckbleistift kann auch immer ein Stift sein! Aber ein Stift muss nicht unbedingt ein Druckbleistift sein.

Anschaulicher wird es wenn du eine weitere Klasse hinzufügst die auch von der Klasse Stift ableitet.
Java:
class Kugelschreiber extends Stift{
String tintenart;
}

Wenn du nun nur ein Objekt von "Stift" erstellst, woher soll Java wissen ob es nun ein Kugelschreiber oder ein Druckbleistift ist?
Und nein man soll es nicht nach Wunsch in eines von beiden Casten können:
1) Java muss für das objekt Speicher reservieren, wenn ich dann caste braucht das Objekt vielleicht mehr Speicher den es nicht mehr gibt oder ähnliches
2) Erstelle ich zuerst ein Stift-Objekt und caste es dann zum passenden, hätte ich eigentlich auch gleich das passende Objekt erstellen können
 
Zuletzt bearbeitet:
Es geht schon, aber man muss es vorher sicherstellen:
Java:
class KFZ {
  String fahrgestellnummer;
}
class Auto extends KFZ {
  boolean hatAnhaengerKupplung ;
}
class Motorrad extends KFZ {
  boolean isFussRasteEingeklappt ;
}

class HauptProgi {
  public static void main(String[] args) {
    KFZ fahrzeug1 = new Auto();
    KFZ fahrzeug2 = new Motorrad();
    Auto auto1 ;

    auto1 = (Auto) fahrzeug2 ; // fuehrt zu ClassCastException
    // richtig:
    if( fahrzeug1 instanceOf Auto )
      auto1 = (Auto) fahrzeug1 ;
    // else: TODO

  }
}
 

Zurück
Oben