„Здравей, Амиго, отново съм аз, Ели. Съжалявам, че го казвам отново и отново, но това е обичайно на Земята в 31-ви век. Бих искал да ти дам повече подробности за референтните променливи и предаването на референтни променливи към функции ( методи)."

"Готов съм."

"Чудесно, тогава слушайте. Референтните променливи са всички непримитивни променливи. Такива променливи съдържат само препратка към обект (препратка към обект)."

"Примитивните променливи съдържат стойности, докато референтните променливи съхраняват препратки към обекти or null. Прав ли съм?"

— Абсолютно.

„Какво е справка?“

„Връзката между обект и препратка към обект е като връзката между човек и неговия телефонен номер. Телефонният номер не е лицето, но може да се използва за обаждане на лицето, за запитване за няHowва информация, за управление на нея or давайте заповеди. Препратката също се използва за работа с обекти. Всички обекти взаимодействат помежду си чрез препратки."

— Сякаш си говореха по телефона?

"Точно така. Когато е присвоена примитивна променлива, стойността се копира. Ако е присвоена препратка, само addressът на обекта (телефонният номер) се копира. Самият обект не се копира. "

"Добре, разбрах."

„Препратката ви дава още едно предимство: можете да предадете препратка към обект към всеки метод и този метод ще може да използва препратката, за да модифицира (промени) обекта, като извика неговите методи и получи достъп до данни вътре в обекта.“

Пример 1
Стойностите m и n не се променят тук.
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;
  }
}
И ето защо.
Този code е аналогичен на codeа отляво
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);
  }
}

„Само стойностите съответно 5 (m) и 6 (n) се присвояват на променливиаиb;аиbне знаят нищо за (и не влияят по ниHowъв начин) m и n."

„Честно да ви кажа, сега осъзнавам, че не съм разбрал нищо. Можете ли да ми дадете още няколко примера?“

„С препратка към обект можехме да направим следното:“

Пример 2
Данните на обектите се променят в този 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;
  }
}
И ето защо.
Този code е аналогичен на 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);

    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;
  }
}

"Препратките съответно към jen и beth се присвояват на променливите a и b; a и b променят стойностите вътре в обектите jen и beth."

„И можете да декларирате класове вътре в други класове, нали? Страхотно!“

— Но все още не разбирам всичко останало много добре.

— Всичко навреме.