Benutzer-Werkzeuge

Webseiten-Werkzeuge


klassen1:anwenden:objektreferenzen:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


klassen1:anwenden:objektreferenzen:start [2024/08/31 10:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +===== Genaue Betrachtung: Objektreferenzen und Objekte =====
 +
 +Schauen wir uns ein Beispielprogramm an:
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'id': 'klassenAnwenden1'}">
 +
 +<script type="text/plain" title="Main.java">
 +Rectangle r;                          // Deklarieren der Variable r vom Typ Rectangle
 +r = new Rectangle(10, 10, 400, 200);  // Instanzieren eines neuen Rechteck-Objekts und Zuweisen zu r
 +r.setFillColor(Color.red);            // Aufruf der Methode "setFillColor" von r; Übergabe es Parameterwertes Color.red
 +r.rotate(30);                         // Aufruf der Methode "rotate" von r; Übergabe des Parameterwertes 30
 +</script>
 +</div>
 +
 +</HTML>
 +
 +Führe das Programm in Einzelschritten aus ("Step over": {{:klassen1:anwenden:step_over.png?nolink|}}) und sieh Dir parallel dazu die folgende Erklärung an:
 +
 +|< 100% 200px 300px - >|
 +^Anweisung^Situation danach^Erklärung^
 +|''Rectangle r;'' | {{:klassen1:anwenden:pasted:20200504-121003.png}} | ''r'' ist eine Variable, die auf ein ''Rectangle''-Objekt zeigen kann (genannt **"Objektreferenz"** oder **"Zeiger"**). Noch zeigt sie auf kein Objekt, enthält daher den Wert ''null''.|
 +|''r = new Rectangle(50, 50, 400, 300);''|{{:klassen1:anwenden:pasted:20200504-091656.png}}|''new Rectangle(50, 50, 400, 300)'' erzeugt ein neues Rechteck-Objekt, dessen linke obere Ecke bei (50, 50) liegt und das 400 Pixel breit und 300 Pixel hoch ist. Die Zuweisung ''r = ...'' sorgt dafür, dass in der Variable''r'' die Speicheradresse dieses Objekts hinterlegt wird. Man sagt: "''r'' zeigt jetzt auf das Objekt."|
 +|''r.setFillColor(Color.red);''|{{:klassen1:anwenden:pasted:20200504-091755.png}}|Die Methode ''setFillColor'' des Objekts, auf das ''r'' zeigt, wird aufgerufen. Sie setzt das Attribut ''fillColor'' auf den übergebenen Wert ''Color.red''.|
 +|''r.rotate(30)''|{{:klassen1:anwenden:pasted:20200504-091916.png}}|Die Methode ''rotate'' des Objekts, auf das ''r'' zeigt, wird aufgerufen. Sie erhöht das Attribute ''angle'' des Objekts um den Wert 30, bewirkt also eine Rechtsdrehung des Rechtecks um 30°.|
 +
 +<WRAP center round info 60%>
 +**Objektreferenzen** (auch **Zeiger** genannt) sind **nicht** die Objekte selbst, sondern Variablen, die auf Objekte zeigen können. \\ **Genauer:** Die Objekte liegen im Arbeitsspeicher des Rechners. Zeigt eine Objektreferenz auf ein Objekt, dann bedeutet das, dass sie die Anfangsadresse des Speicherbereiches enthält, in dem das Objekt gespeichert ist. \\ \\ 
 +Zeigt eine Objektreferenz auf **kein** Objekt, so enthält sie den Wert ''null''.
 +</WRAP>
 +
 +**Verschiedene Objektvariablen können auch auf das selbe Objekt zeigen:**
 +<HTML>
 +
 +<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'id':'KlassenAnwenden2'}">
 +
 +<script type="text/plain" title="Main.java">
 +Rectangle r;                          // Deklarieren der Variable r vom Typ Rectangle
 +r = new Rectangle(10, 10, 400, 200);  // Instanzieren eines neuen Rectangle-Objekts und Zuweisen zu r
 +                                      // r zeigt jetzt auf das Rectangle-Objekt.
 +Rectangle k;
 +k = r;                                // Der Wert von r (d.h. die Adresse des Rectangle-Objekts) wird in die Variable k hineinkopiert
 +                                      // Beide Variablen zeigen jetzt auf dasselbe Rectangle-Objekt!
 +k.setFillColor(Color.red);            // Aufruf der Methode "setFillColor" von r; Übergabe es Parameterwertes Color.red
 +r.rotate(30);                         // Aufruf der Methode "rotate" von r; Übergabe des Parameterwertes 30
 +</script>
 +</div>
 +
 +</HTML>
 +Die Anweisung ''k = r'' in Zeile 4 bewirkt, dass der Wert von ''r'' (also die Adresse des Rechteck-Objekts) in die Variable ''k'' hineinkopiert wird. Nach dieser Anweisung sieht die Situation also so aus:
 +{{ :klassen1:anwenden:pasted:20200504-103704.png }}
 +<WRAP center round tip 80%>
 +  - Die Objektreferenzen ''r'' und ''k'' zeigen am Ende des Programms auf das selbe Rectangle-Objekt. Insbesondere gibt es **nur ein** Rectangle-Objekt! \\ \\ Die Anweisung ''r.rotate(30)'' bewirkt also **exakt dasselbe** wie ''k.rotate(30)''. \\ \\ 
 +  - Die Anweisungen ''Rectangle r;'' und ''r = new Rectangle(50, 50, 400, 300);'' kann man zu einer Anweisung zusammenfassen und kurz schreiben: \\ ''Rectangle r = new Rectangle(50, 50, 400, 300);''.
 +</WRAP>
 +
 +===== Primitive Datentypen =====
 +Variablen mit **primitiven Datentypen** (d.h. ''int, float, double, char, boolean'') speichern keine Referenzen auf Werte, sondern direkt die Werte selbst. Bei Ihnen bewirkt der Zuweisungsoperator also ein Kopieren des Wertes. Im folgenden Programm speichern die zwei Variablen am Ende zwei unterschiedliche Zahlenwerte:
 +<HTML>
 +<div class="java-online" style="height: 300px; width: 100%" data-java-online="{'id':'Objekte6'}">
 +
 +<script type="text/plain" title="Main.java">
 +int r;                                // Deklarieren der Variable r vom Datentyp int
 +r = 10;                               // Instanzieren eines neuen Rechteck-Objekts und Zuweisen zu r
 +                                      // r zeigt jetzt auf das Rechteck-Objekt.
 +int k;
 +k = r;                                // Der Wert von r wird in die Variable k hineinkopiert
 +k = k * 2;
 +println("r: " + r);
 +println("k: " + k);
 +</script>
 +</div>
 +
 +</HTML>
 +
 +