"Ciao, Amigo, sono di nuovo io, Ellie. Scusa se lo ripeto più e più volte, ma è consuetudine sulla Terra nel 31° secolo. Vorrei darti maggiori dettagli sulle variabili di riferimento e sul passaggio delle variabili di riferimento alle funzioni ( metodi)."

"Sono pronto."

"Ottimo, allora ascolta. Le variabili di riferimento sono variabili non primitive. Tali variabili contengono solo un riferimento a un oggetto (un riferimento a un oggetto)."

"Le variabili primitive contengono valori, mentre le variabili di riferimento memorizzano riferimenti a oggetti o null. Dico bene?"

"Assolutamente."

"Cos'è un riferimento?"

"La relazione tra un oggetto e un oggetto di riferimento è come la relazione tra una persona e il suo numero di telefono. Il numero di telefono non è la persona, ma può essere usato per chiamare la persona, chiedere informazioni, gestirla o dare ordini. Un riferimento è anche usato per lavorare con gli oggetti. Tutti gli oggetti interagiscono tra loro usando i riferimenti."

"Come se si stessero parlando al telefono?"

"Esattamente. Quando viene assegnata una variabile primitiva, il valore viene copiato. Se viene assegnato un riferimento, viene copiato solo l'indirizzo dell'oggetto (il numero di telefono). L'oggetto stesso non viene copiato. "

"Ok ho capito."

"Un riferimento ti offre un ulteriore vantaggio: puoi passare un riferimento a un oggetto a qualsiasi metodo e quel metodo sarà in grado di utilizzare il riferimento per modificare (cambiare) l'oggetto chiamando i suoi metodi e accedendo ai dati all'interno dell'oggetto."

Esempio 1
I valori m e n non cambiano qui.
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;
  }
}
Ed ecco perché.
Questo codice è analogo al codice a sinistra
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);
  }
}

"Solo i valori 5 (m) e 6 (n), rispettivamente, sono assegnati alle variabiliUNEB;UNEBnon sanno nulla di (e non influenzano in alcun modo) me n."

"A dirti la verità, ora mi rendo conto di non aver capito niente. Mi fai qualche altro esempio?"

"Con un riferimento a un oggetto, avremmo potuto fare quanto segue:"

Esempio 2
I dati degli oggetti cambiano in questo codice
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;
  }
}
Ed ecco perché.
Questo codice è analogo al codice a sinistra
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;
  }
}

"I riferimenti a jen e beth, rispettivamente, sono assegnati alle variabili a e b; a e b cambiano i valori all'interno degli oggetti jen e beth."

"E puoi dichiarare classi all'interno di altre classi, giusto? Fantastico!"

"Ma continuo a non capire molto bene tutto il resto."

"Tutto a tempo debito."