„Hi, Amigo, ich bin‘s wieder, Ellie. Sorry, dass ich das immer wieder sage, aber es ist auf der Erde im 31. Jahrhundert so üblich. Ich möchte dir mehr Einzelheiten über Referenzvariablen und die Übergabe von Referenzvariablen an Funktionen (Methoden) geben.“

„Ich bin bereit.“

„Prima, dann hör gut zu. Referenzvariablen sind alle nicht primitiven Variablen. Solche Variablen enthalten nur eine Objektreferenz (eine Referenz auf ein Objekt).“

„Primitive Variablen enthalten Werte, während Referenzvariablen Referenzen auf Objekte oder Null speichern. Habe ich das richtig verstanden?“

„Absolut.“

„Was ist eine Referenz?“

„Die Beziehung zwischen einem Objekt und einer Objektreferenz ist wie die Beziehung zwischen einer Person und ihrer Telefonnummer. Die Telefonnummer ist nicht die Person, aber sie kann verwendet werden, um die Person anzurufen, nach Informationen zu fragen, sie zu verwalten oder Anweisungen zu geben. Eine Referenz wird auch für die Arbeit mit Objekten verwendet. Alle Objekte interagieren miteinander über Referenzen.“

„Als ob sie am Telefon miteinander reden würden?“

„Genau. Wenn eine primitive Variable zugewiesen wird, wird der Wert kopiert. Wenn eine Referenz zugewiesen wird, wird nur die Adresse des Objekts (die Telefonnummer) kopiert. Das Objekt selbst wird nicht kopiert.

„Okay, das hab ich verstanden.“

„Eine Referenz bietet dir noch einen weiteren Vorteil: Du kannst eine Objektreferenz an eine beliebige Methode übergeben, und diese Methode kann die Referenz verwenden, um das Objekt zu modifizieren (zu ändern), indem sie seine Methoden aufruft und auf Daten innerhalb des Objekts zugreift.“

Beispiel 1
Die Werte m und n ändern sich hier nicht.
public class References
{
  public static void main (String[] args)
  {
    int m = 5;
    int n = 6;

    System.out.println("M=" + m + " N=" + n);
    swap(m, n);
    System.out.println("M=" + m + " N=" + n);
  }

  private static void swap(int a, int b)
  {
    int c = a;
    a = b;
    b = c;
  }
}
Und hier ist der Grund.
Dieser Code ist analog zum Code links
public class References
{
  public static void main (String[] args)
  {
    int m = 5;
    int n = 6;

    System.out.println("M=" + m + " N=" + n);
    int a = m, b = n;

    int c = a;
    a = b;
    b = c;

    System.out.println("M=" + m + " N=" + n);
  }
}

„Nur die Werte 5 (m) und 6 (n) sind den Variablen a und b zugewiesen; a und b wissen nichts über m und n (und beeinflussen sie in keiner Weise).“

„Um ehrlich zu sein, merke ich gerade, dass ich nichts verstanden habe. Hast du noch mehr Beispiele?“

„Mit einer Objektreferenz hätten wir folgendes tun können:“

Beispiel 2
In diesem Code ändern sich die Daten der Objekte
public class Primitives
{
  public static void main(String[] args)
  {
    Student jen = new Student();
    jen.name = "Jen";
    jen.age = 21;

    Student beth = new Student();
    beth.name = "Beth";
    beth.age = 15;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);

    ageSwap(jen, beth);

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);
  }

  private static void ageSwap(Student a,
                                    Student b)
  {
    int c = a.age;
    a.age = b.age;
    b.age = c;
  }

  static class Student
  {
    String name;
    int age;
  }
}
Und hier ist der Grund.
Dieser Code ist analog zum Code links
public class Primitives
{
  public static void main(String[] args)
  {
    Student jen = new Student();
    jen.name = "Jen";
    jen.age = 21;

    Student beth = new Student();
    beth.name = "Beth";
    beth.age = 15;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);

    Student a = jen, b = beth;

    int c = a.age;
    a.age = b.age;
    b.age = c;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);
  }





  static class Student
  {
    String name;
    int age;
  }
}

„Referenzen auf jen bzw. beth werden den Variablen a und b zugewiesen; a und b ändern die Werte innerhalb der Objekte jen und beth.“

„Und man kann Klassen innerhalb anderer Klassen deklarieren, richtig? Cool!“

„Aber alles andere verstehe ich immer noch nicht richtig.“

„Kommt Zeit, kommt Rat.“