"สวัสดี Amigo ฉันเองค่ะ Ellie ขอโทษที่พูดซ้ำแล้วซ้ำเล่า แต่มันเป็นธรรมเนียมของโลกในศตวรรษที่ 31 ฉันต้องการให้รายละเอียดเพิ่มเติมเกี่ยวกับตัวแปรอ้างอิงและการส่งตัวแปรอ้างอิงไปยังฟังก์ชัน ( วิธีการ)"

"ฉันพร้อมแล้ว."

"เยี่ยมมาก ฟังให้ดี ตัวแปรอ้างอิงคือตัวแปรที่ไม่ใช่ตัวแปรดั้งเดิม ตัวแปรดังกล่าวมีการอ้างอิงวัตถุเท่านั้น (การอ้างอิงถึงวัตถุ)"

"ตัวแปรดั้งเดิมประกอบด้วยค่า ในขณะที่ตัวแปรอ้างอิงจัดเก็บการอ้างอิงไปยังอ็อบเจกต์หรือ null ฉันถูกไหม"

"อย่างแน่นอน."

"อ้างอิงอะไร"

"ความสัมพันธ์ระหว่างวัตถุกับวัตถุอ้างอิงก็เหมือนกับความสัมพันธ์ระหว่างบุคคลกับหมายเลขโทรศัพท์ของเธอ หมายเลขโทรศัพท์ไม่ใช่บุคคล แต่สามารถใช้โทรหาบุคคลนั้น ขอข้อมูลบางอย่าง จัดการเธอ หรือ ให้คำสั่ง การอ้างอิงยังใช้ในการทำงานกับวัตถุ วัตถุทั้งหมดโต้ตอบกับอีกคนหนึ่งโดยใช้การอ้างอิง "

“เหมือนกับว่าพวกเขาคุยกันทางโทรศัพท์?”

"ถูกต้องเมื่อมีการกำหนดตัวแปรดั้งเดิม ค่าจะถูกคัดลอก หากมีการกำหนดการอ้างอิง เฉพาะที่อยู่ของวัตถุ (หมายเลขโทรศัพท์) เท่านั้นที่จะถูกคัดลอก ตัววัตถุเองจะไม่ถูกคัดลอก "

"โอเคเข้าใจแล้ว."

"การอ้างอิงให้ประโยชน์อีกอย่างแก่คุณ: คุณสามารถส่งการอ้างอิงวัตถุไปยังเมธอดใดก็ได้ และวิธีการนั้นจะสามารถใช้การอ้างอิงเพื่อแก้ไข (เปลี่ยนแปลง) ออบเจกต์ได้โดยการเรียกเมธอดของมันและเข้าถึงข้อมูลภายในอ็อบเจกต์"

ตัวอย่างที่ 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;
  }
}
และนี่คือเหตุผล
รหัสนี้คล้ายกับรหัสทางด้านซ้าย
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) ตามลำดับเท่านั้นที่ถูกกำหนดให้กับตัวแปรและ;และไม่รู้อะไรเกี่ยวกับ (และไม่มีอิทธิพลในทางใดทางหนึ่ง) m และ n"

“บอกตามตรงว่าตอนนี้ฉันเข้าใจแล้วว่าฉันไม่เข้าใจอะไรเลย คุณช่วยยกตัวอย่างให้ฉันดูอีกหน่อยได้ไหม”

"ด้วยการอ้างอิงวัตถุ เราสามารถทำสิ่งต่อไปนี้:"

ตัวอย่างที่ 2
ข้อมูลของวัตถุเปลี่ยนแปลงในรหัสนี้
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;
  }
}
และนี่คือเหตุผล
รหัสนี้คล้ายกับรหัสทางด้านซ้าย
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"

"และคุณสามารถประกาศคลาสภายในคลาสอื่นได้ใช่ไหม เจ๋ง!"

“แต่ฉันยังไม่เข้าใจอย่างอื่นดีนัก”

"ทั้งหมดในเวลาที่กำหนด"