"Hola, Amigo, soy yo otra vez, Ellie. Perdón por decir eso una y otra vez, pero es una costumbre en la Tierra en el siglo 31. Me gustaría brindarle más detalles sobre las variables de referencia y cómo pasar variables de referencia a funciones ( métodos)."

"Estoy listo."

"Genial, entonces escucha. Las variables de referencia son variables no primitivas. Dichas variables solo contienen una referencia de objeto (una referencia a un objeto)".

"Las variables primitivas contienen valores, mientras que las variables de referencia almacenan referencias a objetos o nulo. ¿Estoy en lo correcto?"

"Absolutamente."

"¿Qué es una referencia?"

"La relación entre un objeto y la referencia de un objeto es como la relación entre una persona y su número de teléfono. El número de teléfono no es la persona, pero puede usarse para llamar a la persona, pedirle información, gestionarla o dar órdenes. Una referencia también se usa para trabajar con objetos. Todos los objetos interactúan entre sí usando referencias".

"¿Como si estuvieran hablando entre ellos por teléfono?"

"Exactamente. Cuando se asigna una variable primitiva, se copia el valor. Si se asigna una referencia, solo se copia la dirección del objeto (el número de teléfono). El objeto en sí no se copia" .

"Está bien, lo tengo".

"Una referencia le brinda un beneficio más: puede pasar una referencia de objeto a cualquier método, y ese método podrá usar la referencia para modificar (cambiar) el objeto llamando a sus métodos y accediendo a los datos dentro del objeto".

Ejemplo 1
Los valores m y n no cambian aquí.
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;
  }
}
Y he aquí por qué.
Este código es análogo al código de la izquierda.
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 se asignan a las variables los valores 5 (m) y 6 (n), respectivamenteayb;aybno saben nada sobre (y no influyen de ninguna manera) m y n".

"A decir verdad, ahora me doy cuenta de que no entendí nada. ¿Puedes darme algunos ejemplos más?"

"Con una referencia a un objeto, podríamos haber hecho lo siguiente:"

Ejemplo 2
Los datos de los objetos cambian en este 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;
  }
}
Y he aquí por qué.
Este código es análogo al código de la izquierda.
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;
  }
}

"Las referencias a jen y beth, respectivamente, se asignan a las variables a y b; a y b cambian los valores dentro de los objetos jen y beth".

"Y puedes declarar clases dentro de otras clases, ¿verdad? ¡Genial!"

"Pero todavía no entiendo muy bien todo lo demás".

"Todo a su debido tiempo".