klassen2:casting:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | klassen2:casting:start [2024/08/31 12:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Type Casting und der Operator instanceof ====== | ||
+ | |||
+ | {{ youtube> | ||
+ | |||
+ | | ||
+ | Da Variablen vom Datentyp einer Oberklasse auch auf Objekte der Unterklasse zeigen können, ergeben sich Situationen, | ||
+ | |||
+ | === Die Klasse Tier === | ||
+ | Wir beginnen mit einer einfachen Klasse, die ein Tier beschreibt. Jedes Tier hat ein Attribut '' | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | Tier t = new Tier(" | ||
+ | t.schreibeName(); | ||
+ | class Tier { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | | ||
+ | === Die Klassen Hund und Katze === | ||
+ | Nun gibt es Tiere, die nicht nur einen Namen besitzen, sondern auch noch Methoden haben, die andere Tiere nicht haben, bspw. Hunde, die bellen können und Katzen, die miauen können. Wir modellieren sie als Unterklassen der Klasse Tier, instanzieren ein Hund-Objekt und ein Katzen-Objekt und rufen deren Methoden auf: | ||
+ | | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Hund h = new Hund(" | ||
+ | Katze k = new Katze(" | ||
+ | |||
+ | h.belle(); | ||
+ | h.schreibeName(); | ||
+ | |||
+ | k.miaue(); | ||
+ | k.schreibeName(); | ||
+ | |||
+ | Tier t = h; | ||
+ | t.schreibeName(); | ||
+ | // t.belle(); // geht nicht, da die Variable t vom Typ Tier ist (obwohl sie auf ein Hund-Objekt zeigt!) | ||
+ | |||
+ | t = k; | ||
+ | t.schreibeName(); | ||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | class Tier { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Hund extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Katze extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== 1.Aspekt: Zuweisung des Objekts einer Unterklasse==== | ||
+ | Einer Variable vom Datentyp Tier (Oberklasse) kann man nicht nur Objekte vom Datentyp Tier zuweisen, sondern auch Objekte beliebiger Unterklassen der Klasse Tier. Im Beipsiel unten: | ||
+ | <code learnj> | ||
+ | Hund h = new Hund(" | ||
+ | Tier t = h; | ||
+ | </ | ||
+ | Nach Ausführung der Zeile 2 zeigen sowohl '' | ||
+ | Der Compiler geht davon aus, dass '' | ||
+ | Nicht zulässig ist '' | ||
+ | |||
+ | Auch die Zuweisung '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Hund h = new Hund(" | ||
+ | Katze k = new Katze(" | ||
+ | |||
+ | Tier t = h; | ||
+ | t.schreibeName(); | ||
+ | // t.belle(); // geht nicht, da die Variable t vom Typ Tier ist (obwohl sie gerade auf ein Hund-Objekt zeigt!) | ||
+ | |||
+ | t = k; | ||
+ | t.schreibeName(); | ||
+ | // t.miaue(); // geht nicht, da die Variable t vom Typ Tier ist (obwohl sie gerade auf ein Katze-Objekt zeigt!) | ||
+ | |||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | Tier t = new Tier(" | ||
+ | t.schreibeName(); | ||
+ | |||
+ | class Tier { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Hund extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Katze extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | == Aufgaben: == | ||
+ | - Entferne das Kommentarzeichen %%//%% am Beginn der Zeile 6 bzw. 10. Welche Fehlermeldung zeigt der Compiler an? Warum tut er das? | ||
+ | - Nach Zeile 10 wird folgendes Programm ergänzt: | ||
+ | <code learnj> | ||
+ | Katze k1 = h; | ||
+ | | ||
+ | </ | ||
+ | sind diese Anweisungen zulässig? Falls " | ||
+ | [[.aufgabe12: | ||
+ | ==== 2. Aspekt: Casten ==== | ||
+ | Wurmt es Dich nicht auch, dass im Falle von | ||
+ | <code learnj> | ||
+ | Hund h = new Hund(" | ||
+ | Tier t = h; | ||
+ | t.belle(); | ||
+ | </ | ||
+ | die Anweisung in Zeile 3 nicht möglich ist, obwohl wir sicher wissen, dass '' | ||
+ | Denke Dir folgende Variante: | ||
+ | <code learnj> | ||
+ | Hund h = new Hund(" | ||
+ | Katze k = new Katze(" | ||
+ | Tier t; | ||
+ | if(Math.random() < 0.5){ | ||
+ | t = h; | ||
+ | } else { | ||
+ | t = k; | ||
+ | } | ||
+ | t.belle(); | ||
+ | </ | ||
+ | Zur Compilezeit (also während der Compiler das Programm übersetzt und auf Korrektheit überprüft) kann der Compiler nicht wissen, ob sich bei der Ausführung des Programms in '' | ||
+ | Falls wir als Programmierer uns sicher sind, dass in der Variable '' | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Hund h = new Hund(" | ||
+ | |||
+ | Tier t = h; | ||
+ | t.schreibeName(); | ||
+ | ((Hund)t).belle(); | ||
+ | |||
+ | // Variante mit zusätzlicher Variable: | ||
+ | Hund h2 = (Hund)t; | ||
+ | h2.belle(); | ||
+ | |||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | class Tier { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Hund extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Katze extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | == Aufgaben == | ||
+ | 3. Nimm in Zeile 8 das Casting weg, schreibe also '' | ||
+ | 4. Wenn wir ungerechtfertigt casten, vertraut uns der Compiler dann? Probiere es aus, indem Du die Zeile 5 ersetzt durch '' | ||
+ | 5. Verändert das Casten durch den Term '' | ||
+ | | ||
+ | [[.aufgabe345: | ||
+ | ==== 3. Aspekt: instanceof ==== | ||
+ | Oft kann eine Variable an einer Stelle des Programms zu verschiedenen Zeiten verschiedene Objekte enthalten, so dass wir im Programm flexibel darauf reagieren müssen. Für diesen Zweck gibt es den Operator '' | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | <script type=" | ||
+ | Hund h = new Hund(" | ||
+ | Katze k = new Katze(" | ||
+ | |||
+ | Tier t; | ||
+ | if(Math.random() < 0.5){ | ||
+ | t = h; | ||
+ | } else { | ||
+ | t = k; | ||
+ | } | ||
+ | |||
+ | if(t instanceof Hund){ | ||
+ | | ||
+ | } else { | ||
+ | | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | <script type=" | ||
+ | class Tier { | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | this.name = name; | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Hund extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | <script type=" | ||
+ | class Katze extends Tier { | ||
+ | |||
+ | | ||
+ | super(name); | ||
+ | } | ||
+ | |||
+ | | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
klassen2/casting/start.txt · Zuletzt geändert: 2024/08/31 12:03 von 127.0.0.1