Erweiterte Zuweisungskompatibilität
Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Beispiel:
Haustier Hund - name: String + Haustier(String pName) - gewicht: int Haustier ist die Basisklasse (Oberklasse) Hund - gewicht: int + Hund(String pName, int pGewicht) Hund ist Subklasse (Unterklasse) von Haustier Hund und Haustier können noch weitere Methoden und Attribute haben. Diese werden aus Gründen der Vereinfachung weggelassen.
Es gilt folgende Regel: Einem Objekt einer Oberklasse darf ein Objekt einer Unterklasse zugewiesen werden, aber nicht umgekehrt. Kurze Merkregel: richtig: "Oberklasse = Unterklasse" ("Obertyp = Untertyp") falsch: "Unterklasse = Oberklasse " (" Untertyp = Obertyp ")
Beispiel:
public class MainTest1{ public static void main(String[] args){ Haustier ht; Hund h; ht=new Haustier("doma"); h=new Hund("Rrrrex", 20); Welche Anweisung ist korrekt, welche falsch? (Compiler meldet Fehler) h=ht; ht=h; } Diese Anweisung ist falsch. Diese Anweisung ist korrekt.
Weitere Beispiele:
class Hund extends Haustier{ private int gewicht; public Hund(String pName, int pGewicht){ super(pName); gewicht = pGewicht; } abstract class Haustier{ private String name; public Haustier( String pName){ name = pName;
public class MainZuweis { public static void main(String[] args){ Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Diese Anweisung ist falsch, weil die Klasse Haustier abstract ist und deshalb kein Objekt davon gebildet werden kann. Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Es wird ein Zeiger mit Typ Haustier angelegt, aber kein Objekt der Klasse Haustier. Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); Es wird ein Objekt des Typs Hund angelegt, auf das der Zeiger myDog1 zeigt. Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex"); Falsch ! Diese Anweisung ist falsch, weil von einer abstrakten Klasse kein Objekt erzeugt werden kann. Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex"); Falsch ! Falsch ! myDog1 = myHaustier2; Diese Anweisung ist falsch, weil einem Objekt einer Unterklasse kein Objekt einer Oberklasse zugewiesen werden kann. Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen. Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex"); Falsch ! Falsch ! myDog1 = myHaustier2; myHaustier2 = myDog1;
public class MainZuweis { public static void main(String[] args){ Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen. Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex"); Falsch ! Falsch ! myDog1 = myHaustier2; myHaustier2 = myDog1; Ist diese Anweisung korrekt?
public class MainZuweis { public static void main(String[] args){ Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen. Haustier myHaustier1 = new Haustier("Rrocco",11); Falsch ! Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex"); Falsch ! Falsch ! myDog1 = myHaustier2; myHaustier2 = myDog1; Ja, weil einem Objekt einer Oberklasse ein Objekt einer Unterklasse zugewiesen wird.
Haustier[] myTiere; Es wird der Zeiger myTiere mit Typ Haustier angelegt. Dieser soll später auf ein Feld von Zeigern zeigen.
myTiere = new Haustier[5]; Haustier[] myTiere; myTiere = new Haustier[5]; Es wird ein Objekt angelegt, das aus lauter Zeigern besteht, wobei myTiere auf dieses Feld zeigt.
myTiere = new Haustier[5]; myTiere[2]=new Haustier("Bello"); Falsch ! Diese Anweisung ist falsch, weil die Klasse Haustier abstract ist und deshalb kein Objekt davon gebildet werden kann.
myTiere = new Haustier[5]; myTiere[2]=new Haustier("Bello"); Falsch ! myTiere[2]=new Hund("Rrolf", 17); } Es wird ein Objekt der Klasse Hund erstellt, das auf den Zeiger myTiere[2] zeigt. Dieser Zeiger ist vom Typ Haustier. Also Zuweisung: "Oberklasse = Unterklasse" (d.h. korrekt)