===== Genaue Betrachtung: Objektreferenzen und Objekte =====
Schauen wir uns ein Beispielprogramm an:
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°.|
**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''.
**Verschiedene Objektvariablen können auch auf das selbe Objekt zeigen:**
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 }}
- 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);''.
===== 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: