"Hai, Amigo, ini aku lagi, Ellie. Maaf sudah mengatakan itu berulang kali, tapi sudah lazim di Bumi pada abad ke-31. Aku ingin memberimu detail lebih lanjut tentang variabel referensi dan meneruskan variabel referensi ke fungsi ( metode)."

"Saya siap."

"Bagus, kalau begitu dengarkan. Variabel referensi adalah variabel non-primitif apa pun. Variabel tersebut hanya berisi referensi objek (referensi ke objek)."

"Variabel primitif berisi nilai, sedangkan variabel referensi menyimpan referensi ke objek atau nol. Apakah saya benar?"

"Sangat."

"Apa itu referensi?"

“Hubungan antara objek dan referensi objek seperti hubungan antara seseorang dan nomor teleponnya. Nomor telepon itu bukan orangnya, tetapi dapat digunakan untuk memanggil orang tersebut, menanyakan beberapa informasi, mengaturnya, atau memberi perintah. Referensi juga digunakan untuk bekerja dengan objek. Semua objek berinteraksi satu sama lain menggunakan referensi."

"Seolah-olah mereka berbicara satu sama lain melalui telepon?"

"Tepat. Ketika variabel primitif ditugaskan, nilainya disalin. Jika referensi ditugaskan, hanya alamat objek (nomor telepon) yang disalin. Objek itu sendiri tidak disalin. "

"OK aku mengerti."

"Referensi memberi Anda satu keuntungan lagi: Anda dapat meneruskan referensi objek ke metode apa pun, dan metode itu akan dapat menggunakan referensi untuk memodifikasi (mengubah) objek dengan memanggil metodenya dan mengakses data di dalam objek."

Contoh 1
Nilai m dan n tidak berubah di sini.
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;
  }
}
Dan inilah alasannya.
Kode ini analog dengan kode di sebelah kiri
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);
  }
}

"Hanya nilai 5 (m) dan 6 (n), masing-masing, yang ditugaskan ke variabelADanB;ADanBtahu apa-apa tentang (dan tidak mempengaruhi dengan cara apapun) m dan n."

"Sejujurnya, saya sekarang menyadari bahwa saya tidak mengerti apa-apa. Bisakah Anda memberi saya beberapa contoh lagi?"

"Dengan referensi objek, kita bisa melakukan hal berikut:"

Contoh 2
Data objek berubah dalam kode ini
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;
  }
}
Dan inilah alasannya.
Kode ini analog dengan kode di sebelah kiri
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;
  }
}

"Referensi ke jen dan beth, masing-masing, ditugaskan ke variabel a dan b; a dan b mengubah nilai di dalam objek jen dan beth."

"Dan kamu bisa mendeklarasikan kelas di dalam kelas lain, kan? Keren!"

"Tapi aku masih tidak mengerti segalanya dengan baik."

"Semua pada waktunya."