„Bună, Amigo, sunt din nou eu, Ellie. Îmi pare rău că spun asta iar și iar, dar este obișnuit pe Pământ în secolul 31. Aș dori să vă ofer mai multe detalii despre variabilele de referință și despre trecerea variabilelor de referință la funcții ( metode)."

"Sunt gata."

„Bine, atunci ascultă. Variabilele de referință sunt orice variabile non-primitive. Astfel de variabile conțin doar o referință la obiect (o referință la un obiect).”

„Variabilele primitive conțin valori, în timp ce variabilele de referință stochează referințe la obiecte sau nule. Am dreptate?”

"Absolut."

"Ce este o referință?"

„Relația dintre un obiect și o referință la obiect este ca relația dintre o persoană și numărul ei de telefon. Numărul de telefon nu este persoana respectivă, dar poate fi folosit pentru a suna persoana, pentru a cere informații, pentru a o gestiona sau dați ordine. O referință este, de asemenea, folosită pentru a lucra cu obiecte. Toate obiectele interacționează între ele folosind referințe."

— De parcă ar fi vorbit între ei la telefon?

"Exact. Când este atribuită o variabilă primitivă, valoarea este copiată. Dacă este atribuită o referință, este copiată doar adresa obiectului (numărul de telefon). Obiectul în sine nu este copiat. "

"OK am luat-o."

„O referință vă oferă încă un avantaj: puteți transmite o referință la obiect oricărei metode, iar metoda respectivă va putea folosi referința pentru a modifica (schimba) obiectul apelând metodele acestuia și accesând datele din interiorul obiectului.”

Exemplul 1
Valorile m și n nu se modifică aici.
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;
  }
}
Și iată de ce.
Acest cod este analog cu codul din stânga
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);
  }
}

„Numai valorile 5 (m) și respectiv 6 (n), sunt atribuite variabilelorAșib;Așibnu știu nimic despre (și nu influențează în niciun fel) m și n."

"Ca să vă spun adevărul, acum îmi dau seama că nu am înțeles nimic. Puteți să-mi mai dați câteva exemple?"

„Cu o referință la obiect, am fi putut face următoarele:”

Exemplul 2
Datele obiectelor se modifică în acest cod
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;
  }
}
Și iată de ce.
Acest cod este analog cu codul din stânga
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;
  }
}

„Referințele la jen și respectiv beth sunt atribuite variabilelor a și b; a și b modifică valorile din interiorul obiectelor jen și beth.”

„Și poți declara clase în interiorul altor clase, nu?

— Dar încă nu înțeleg prea bine totul în rest.

— Toate la timp.