MINT lernen

Primitive Typen und Referenzen

Du kopierst eine Zahl — und das Original bleibt. Du „kopierst“ ein Objekt — und plötzlich ändert sich das Original mit. Warum?

1

Wert oder Referenz?

  • Primitive Typen:int, double, boolean, char — die Variable enthält den Wert selbst.
  • Objekttypen:Klassen wie Punkt oder String — 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.

Kopie oder zweiter Name?

Primitiver Typ int
    Objekttyp Punkt

      Halte 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.

      2

      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
      Merke

      Zuweisung: Bei primitiven Typen wird der Wert kopiert, bei Objekten die Referenz — q = p erzeugt kein neues Objekt.

      3

      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.

      Videos