Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen2:casting:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
klassen2:casting:start [2020/05/05 14:05] – [1.Aspekt: Zuweisung des Objekts einer Unterklasse] Martin Pabstklassen2:casting:start [2021/12/29 11:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
-====== Casting und der Operator instanceof ======+====== Type Casting und der Operator instanceof ====== 
 + 
 +{{ youtube>iUYAXaDJpAA?large }} 
 + 
 + \\ 
 Da Variablen vom Datentyp einer Oberklasse auch auf Objekte der Unterklasse zeigen können, ergeben sich Situationen, in denen erst zur Laufzeit bekannt ist, welchen Datentyp das Objekt hat, auf das eine bestimmte Variable zeigt. Wie man damit umgeht, zeige ich konkret an einem Beispiel: Da Variablen vom Datentyp einer Oberklasse auch auf Objekte der Unterklasse zeigen können, ergeben sich Situationen, in denen erst zur Laufzeit bekannt ist, welchen Datentyp das Objekt hat, auf das eine bestimmte Variable zeigt. Wie man damit umgeht, zeige ich konkret an einem Beispiel:
  
Zeile 6: Zeile 10:
 <HTML> <HTML>
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'withBottomPanel': false}">+<div class="java-online" style="height: 370px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'Casting1'}">
  
 <script type="text/plain" title="Tier.java"> <script type="text/plain" title="Tier.java">
Zeile 33: Zeile 37:
 <HTML> <HTML>
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{ }">+<div class="java-online" style="height: 450px; width: 100%" data-java-online="'id': 'Casting2' , 'withBottomPanel': true}">
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
 Hund h = new Hund("Bello"); Hund h = new Hund("Bello");
Zeile 111: Zeile 115:
 <HTML> <HTML>
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{ }">+<div class="java-online" style="height: 300px; width: 100%" data-java-online="'id': 'Casting3', 'withBottomPanel': true }">
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
 Hund h = new Hund("Bello"); Hund h = new Hund("Bello");
Zeile 181: Zeile 185:
    h.schreibeName();    h.schreibeName();
 </code> </code>
-sind diese Anweisungen zulässig? Falls "nein": Warum nicht? Probiere sie aus, indem Du sie ins Beispiel oben einfügst! +sind diese Anweisungen zulässig? Falls "nein": Warum nicht? Probiere sie aus, indem Du sie ins Beispiel oben einfügst! \\ \\  
- +[[.aufgabe12:loesungen:start|Lösungen]]
-<hidden Lösungen> +
-== Aufgabe 1: == +
-Der Compiler zeigt folgenden Fehler an: \\  +
-"Der Typ besitzt keine Methode mit dem Bezeichner belle." +
-Das tut er, weil t eine Variable vom Typ Tier ist und die Klasse Tier keine Methode belle besitzt. Dass das Objekt, auf das t zeigt, ein Hund-Objekt ist (und sehr wohl eine Methode belle besitzt), weiß der Compiler nicht. +
- +
-== Aufgabe 2: == +
-Katze k1 = h;  \\  +
-ist nicht zulässig, da h eine Variable der Klasse Hund istDiese kann nicht nach Katze gecastet werden, da Katze keine Unterklasse von Hund ist. +
-h.schreibeName(); ist zulässig, da h eine Variable der Klasse Hund ist. Diese erbt von der Klasse Tier und besitzt daher eine Methode schreibeName(). +
-</hidden>+
 ==== 2. Aspekt: Casten ==== ==== 2. Aspekt: Casten ====
 Wurmt es Dich nicht auch, dass im Falle von  Wurmt es Dich nicht auch, dass im Falle von 
Zeile 219: Zeile 212:
 <HTML> <HTML>
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{ }">+<div class="java-online" style="height: 300px; width: 100%" data-java-online="'id': 'Casting4', 'withBottomPanel': true}">
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
 Hund h = new Hund("Bello"); Hund h = new Hund("Bello");
Zeile 279: Zeile 272:
  
 == Aufgaben == == Aufgaben ==
-  3. Nimm in Zeile 8 das Casting weg, schreibe also ''Hund h2 = t;''. Was passiert? Warum? +3. Nimm in Zeile 8 das Casting weg, schreibe also ''Hund h2 = t;''. Was passiert? Warum? \\ \\  
-  Wenn wir ungerechtfertigt casten, vertraut uns der Compiler dann? Probiere es aus, indem Du die Zeile 5 ersetzt durch ''((Katze)t).miaue();''. Was passiert? Warum? +4. Wenn wir ungerechtfertigt casten, vertraut uns der Compiler dann? Probiere es aus, indem Du die Zeile 5 ersetzt durch ''((Katze)t).miaue();''. Was passiert? Warum? \\ \\  
-  Verändert das Casten durch den Term ''(Katze)t'' das Objekt, auf das ''t'' zeigt von einem ''Tier''-Objekt zu einem ''Katze''-Objekt? Begründe Deine Antwort! +5. Verändert das Casten durch den Term ''(Katze)t'' das Objekt, auf das ''t'' zeigt von einem ''Tier''-Objekt zu einem ''Katze''-Objekt? Begründe Deine Antwort! \\ \\  
- + \\  
-<hidden Lösungen> +[[.aufgabe345:loesungen:start|Lösungen]]
-== Aufgabe 3: == +
-Der Compiler meldet: "Der Term vom Typ Tier kann der Variable vom Typ Hund nicht zugewiesen werden.". Einer Variable einer Oberklasse können Objekte einer Unterklasse zugewiesen werden, aber nicht anders herum. +
-== Aufgabe 4== +
-Zur Compilezeit geschieht nichts, der Computer "vertraut" uns. Der Fehler wird aber zur Laufzeit entdeckt. Der Computer meldet dann, dass ein Objekt vom Typ Hund nicht nach Katze gecastet werden kann. +
-== Aufgabe 5== +
-Das Casten (Katze)t geht nur, wenn t auf ein Objekt der Klasse Katze oder einer Unterklasse davon zeigt. Dieses Objekt wird beim Casten **nicht** verändert, sondern **ist** schon ein Katze-Objekt! +
-</hidden> +
 ==== 3. Aspekt: instanceof ==== ==== 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 ''instanceof''. Damit lässt sich testen, ob ein Objekt einer bestimmten Klasse angehört. 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 ''instanceof''. Damit lässt sich testen, ob ein Objekt einer bestimmten Klasse angehört.
 <HTML> <HTML>
  
-<div class="java-online" style="height: 300px; width: 100%" data-java-online="{ }">+<div class="java-online" style="height: 300px; width: 100%" data-java-online="'id': 'Casting5', 'withBottomPanel': true}">
 <script type="text/plain" title="Main.java"> <script type="text/plain" title="Main.java">
 Hund h = new Hund("Bello"); Hund h = new Hund("Bello");
klassen2/casting/start.1588680332.txt.gz · Zuletzt geändert: 2021/12/29 11:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki