Wert oder Referenz?
- Primitive Typen:
int,double,boolean,char— die Variable enthält den Wert selbst. - Objekttypen:Klassen wie
PunktoderString— die Variable enthält eine Referenz (einen Verweis) auf das Objekt. - Zuweisung:
b = a;kopiert den Wert,q = p;kopiert die Referenz. - Alias:zwei Variablen, die auf dasselbe Objekt zeigen; eine Änderung über q sieht man auch über p.
- null:Referenz, die auf kein Objekt zeigt — ein Methodenaufruf darauf führt zur
NullPointerException.
Links läuft ein Programm mit int-Variablen, rechts dasselbe Muster mit einem Punkt-Objekt. Gehe mit „Schritt“ Zeile für Zeile vor und vergleiche die beiden Speicherbilder. „Unterschied zeigen“ markiert, wo sie auseinanderlaufen.
intPunktHalte fest: b = a kopiert den Wert — danach sind a und b unabhängig. q = p kopiert nur die Referenz — p und q sind zwei Namen für dasselbe Objekt.
Vergleichen und übergeben
- ==:vergleicht bei Objekten die Referenzen: dasselbe Objekt?
- equals:vergleicht den Inhalt — Zeichenketten deshalb immer mit
s.equals(t). - Primitiver Parameter:die Methode bekommt eine Kopie des Werts; das Original ändert sich nicht.
- Objekt als Parameter:die Methode bekommt eine Kopie der Referenz und kann das Objekt verändern.
String a = new String("Ball");
String b = new String("Ball");
boolean x = (a == b); // false: zwei verschiedene Objekte
boolean y = a.equals(b); // true: gleicher Inhalt
Zuweisung: Bei primitiven Typen wird der Wert kopiert, bei Objekten die Referenz — q = p erzeugt kein neues Objekt.
Allgemeine Hinweise
q = p ist keine Kopie
Wer ein zweites, unabhängiges Objekt braucht, muss es mit new erzeugen und die Werte übertragen.
Zeichenketten nie mit ==
== kann bei gleichem Text false liefern, weil es zwei Objekte sind. Nimm equals.
Speicherbild zeichnen
Kästchen für Variablen, Pfeile zu den Objektkarten: So siehst du sofort, welche Variablen dasselbe Objekt meinen.
