Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer...

Preview:

Citation preview

Erweiterte Zuweisungskompatibilität

Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?

Beispiel:

Haustier - name: String + Haustier(String pName)

Hund ist Subklasse (Unterklasse) von Haustier

Haustier ist die Basisklasse (Oberklasse)

Hund - gewicht: int + Hund(String pName, int pGewicht)

Hund und Haustier können noch weitere Methoden und Attribute haben. Diese werden aus Gründen der Vereinfachung weggelassen.

Kurze Merkregel: richtig:"Oberklasse = Unterklasse"("Obertyp = Untertyp")

falsch: "Unterklasse = Oberklasse " (" Untertyp = Obertyp ")

Es gilt folgende Regel:

Einem Objekt einer Oberklasse darf ein Objekt einer Unterklasse zugewiesen werden, aber nicht umgekehrt.

Beispiel:

public class MainTest1{ public static void main(String[] args){ Haustier ht; Hund h; ht=new Haustier("doma"); h=new Hund("Rrrrex", 20);

h=ht;ht=h;

}

Welche Anweisung ist korrekt, welche falsch?

(Compiler meldet Fehler)

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; }}

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Diese Anweisung ist falsch, weil die Klasse Haustier abstract ist und deshalb kein Objekt davon gebildet werden kann.

Falsch !

Ist diese Anweisung korrekt?

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Es wird ein Zeiger mit Typ Haustier angelegt, aber kein Objekt der Klasse Haustier.

Haustier myHaustier2;Falsch !

Ist diese Anweisung korrekt?

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Es wird ein Objekt des Typs Hund angelegt, auf das der Zeiger myDog1 zeigt.

Haustier myHaustier2; Hund myDog1=new Hund("Rrudi",13);

Falsch !

Ist diese Anweisung korrekt?

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Diese Anweisung ist falsch, weil von einer abstrakten Klasse kein Objekt erzeugt werden kann.

Haustier myHaustier2;

myHaustier2 = new Haustier("Rex");

Falsch !

Ist diese Anweisung korrekt?

Hund myDog1=new Hund("Rrudi",13);

Falsch !

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Diese Anweisung ist falsch, weil einem Objekt einer Unterklasse kein Objekt einer Oberklasse zugewiesen werden kann.

Haustier myHaustier2;

myDog1 = myHaustier2;

Falsch !

Falsch !

Ist diese Anweisung korrekt?

Falsch !

Hund myDog1=new Hund("Rrudi",13); myHaustier2 = new Haustier("Rex");

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen.

Haustier myHaustier2;

myHaustier2 = myDog1;

Falsch !

Hund myDog1=new Hund("Rrudi",13);

Falsch !

myHaustier2 = new Haustier("Rex"); myDog1 = myHaustier2; Falsch !

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen.

Haustier myHaustier2;

myHaustier2 = myDog1;

Falsch !

Hund myDog1=new Hund("Rrudi",13);

Falsch !

myHaustier2 = new Haustier("Rex"); myDog1 = myHaustier2; Falsch !

Ist diese Anweisung korrekt?

Haustier myHaustier1 = new Haustier("Rrocco",11);

public class MainZuweis { public static void main(String[] args){

Einem Objekt einer Unterklasse wird ein Objekt einer Oberklasse zugewiesen.

Haustier myHaustier2;

myHaustier2 = myDog1;

Falsch !

Hund myDog1=new Hund("Rrudi",13);

Falsch !

myHaustier2 = new Haustier("Rex"); myDog1 = myHaustier2; Falsch !

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.

Haustier[] myTiere;

Es wird ein Objekt angelegt, das aus lauter Zeigern besteht, wobei myTiere auf dieses Feld zeigt.

myTiere = new Haustier[5];

Haustier[] myTiere;

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 !

Haustier[] myTiere;

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)

myTiere = new Haustier[5]; myTiere[2]=new Haustier("Bello"); myTiere[2]=new Hund("Rrolf", 17); }}

Falsch !

Recommended