"Oi, amigo, sou eu de novo, Ellie. Desculpe por dizer isso repetidamente, mas é comum na Terra no século 31. Gostaria de fornecer mais detalhes sobre variáveis ​​de referência e passagem de variáveis ​​de referência para funções ( métodos)."

"Estou pronto."

"Ótimo, então ouça. As variáveis ​​de referência são quaisquer variáveis ​​não primitivas. Essas variáveis ​​contêm apenas uma referência de objeto (uma referência a um objeto)."

"As variáveis ​​primitivas contêm valores, enquanto as variáveis ​​de referência armazenam referências a objetos ou nulos. Estou certo?"

"Absolutamente."

"O que é uma referência?"

"A relação entre um objeto e uma referência de objeto é como a relação entre uma pessoa e seu número de telefone. O número de telefone não é a pessoa, mas pode ser usado para ligar para a pessoa, pedir alguma informação, gerenciá-la ou dar ordens. Uma referência também é usada para trabalhar com objetos. Todos os objetos interagem uns com os outros usando referências."

"Como se eles estivessem falando um com o outro pelo telefone?"

"Exatamente. Quando uma variável primitiva é atribuída, o valor é copiado. Se uma referência é atribuída, apenas o endereço do objeto (o número de telefone) é copiado. O objeto em si não é copiado. "

"OK, entendi."

"Uma referência oferece mais um benefício: você pode passar uma referência de objeto para qualquer método, e esse método poderá usar a referência para modificar (alterar) o objeto chamando seus métodos e acessando os dados dentro do objeto."

Exemplo 1
Os valores m e n não mudam aqui.
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;
  }
}
E aqui está o porquê.
Este código é análogo ao código à esquerda
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);
  }
}

"Apenas os valores 5 (m) e 6 (n), respectivamente, são atribuídos às variáveisaeb;aebnão sabem nada sobre (e não influenciam de forma alguma) m e n."

"Para dizer a verdade, agora percebo que não entendi nada. Você pode me dar mais alguns exemplos?"

"Com uma referência de objeto, poderíamos ter feito o seguinte:"

Exemplo 2
Os dados dos objetos mudam neste código
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;
  }
}
E aqui está o porquê.
Este código é análogo ao código à esquerda
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;
  }
}

"As referências a jen e beth, respectivamente, são atribuídas às variáveis ​​a e b; a e b alteram os valores dentro dos objetos jen e beth."

"E você pode declarar classes dentro de outras classes, certo? Legal!"

"Mas eu ainda não entendo todo o resto muito bem."

"Tudo no devido tempo."