« Salut Amigo, c'est encore moi, Ellie. Pardon de te le dire chaque fois, mais c'est la coutume sur Terre au 31e siècle. Je voudrais te donner plus de détails sur les variables de référence et le passage de variables de référence aux fonctions (méthodes). »

« Je suis prêt. »

« Parfait, alors écoute bien. Les variables de référence désignent toute variable non primitive. Ces variables contiennent seulement une référence à un objet. »

« Les variables primitives contiennent des valeurs, et les variables de référence stockent des références à des objets ou null. C'est bien ça ? »

« Absolument. »

« C'est quoi, une référence ? »

« La relation entre un objet et une référence d'objet est semblable à celle entre une personne et son numéro de téléphone. Le numéro de téléphone n'est pas la personne, mais tu peux l'utiliser pour appeler la personne, lui demander des informations, la coacher ou lui donner des ordres. Une référence sert également à travailler avec les objets. Tous les objets interagissent entre eux à l'aide de références. »

« Comme s'ils se parlaient entre eux au téléphone ? »

« Exactement. Quand une variable primitive est affectée, la valeur est copiée. Si une référence est affectée, seule l'adresse de l'objet (le numéro de téléphone dans notre analogie) est copiée. L'objet lui-même n'est pas copié. »

« OK, j'ai compris. »

« Une référence te donne un avantage supplémentaire : tu peux passer une référence d'objet à n'importe quelle méthode, et cette méthode sera en mesure d'utiliser la référence pour modifier l'objet en appelant ses méthodes et en accédant aux données qui s'y trouvent. »

Exemple 1
Les valeurs m et n ne changent pas ici.
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;
  }
}
Et voilà pourquoi.
Ce code est analogue au code à gauche.
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);
  }
}

« Seules les valeurs 5 (m) et 6 (n), respectivement, sont affectées aux variables a et b ; a et b ne savent rien au sujet de m et n (en ne les influencent d'aucune façon). »

« Je vais t'avouer un truc : je réalise maintenant que je n'ai rien compris du tout. Tu pourrais me donner plus d'exemples ? »

« Avec une référence d'objet, nous aurions pu faire ce qui suit : »

Exemple 2
Les données des objets changent dans ce code
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;
  }
}
Et voilà pourquoi.
Ce code est analogue au code à gauche.
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;
  }
}

« Les références à jen et beth, respectivement, sont affectées aux variables a et b ; a et b modifient les valeurs à l'intérieur des objets jen et beth. »

« Et tu peux déclarer des classes dans d'autres classes, c'est ça ? Trop cool ! »

« Mais j'ai encore du mal à comprendre tout le reste. »

« Ça finira par venir. »