Rumah >Java >javaTutorial >Bagaimana Java Mengendalikan Objek Lulus: Mengikut Nilai atau Rujukan?

Bagaimana Java Mengendalikan Objek Lulus: Mengikut Nilai atau Rujukan?

DDD
DDDasal
2024-11-11 03:18:02843semak imbas

How Does Java Handle Passing Objects: By Value or by Reference?

Java Pass By Value vs. Rujukan: Menganalisis Perbezaan

Dalam Java, hujah diluluskan mengikut nilai, bukan rujukan. Konsep ini boleh mengelirukan, terutamanya apabila berurusan dengan objek. Mari kita periksa perbezaan halus antara dua coretan kod:

Kod A:

Foo myFoo;
myFoo = createfoo();

Kod B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}

Memahami Kod A

Dalam Kod A, pembolehubah rujukan myFoo dicipta dan diberikan kepada objek yang dikembalikan oleh createfoo(). Walau bagaimanapun, dalam Java, objek diluluskan oleh nilai, bukan dengan rujukan. Ini bermakna salinan objek dibuat dan diberikan kepada myFoo. Sebarang perubahan yang dibuat pada salinan ini tidak akan menjejaskan objek asal dalam createfoo().

Memahami Kod B

Kod B menggunakan fungsi createFoo() dengan parameter foo . Sekali lagi, foo ialah salinan pembolehubah rujukan asal myFoo. Jadi, apabila f dicipta dan diberikan kepada foo, ia sebenarnya menggantikan salinan myFoo di dalam createFoo(). Sebarang perubahan yang dibuat kepada foo dalam createFoo() akan ditunjukkan dalam pembolehubah rujukan myFoo asal.

Contoh untuk Menjelaskan Perbezaan

Untuk menjelaskan lebih lanjut, pertimbangkan contoh berikut :

public class Main {
   public static void main(String[] args) {
      Foo f = new Foo("f");
      changeReference(f); // Will not change the reference!
      modifyReference(f); // Will modify the object referred by "f"!
   }
   public static void changeReference(Foo a) {
      Foo b = new Foo("b");
      a = b;  // Re-assigns 'a' reference to the new object, not 'f'.
   }
   public static void modifyReference(Foo c) {
      c.setAttribute("c");  // Modifies the object referred by 'c', same as 'f'.
   }
   private static class Foo {
      private String attribute;
      public Foo(String attribute) { this.attribute = attribute; }
      public void setAttribute(String attribute) { this.attribute = attribute; }
   }
}

Apabila melaksanakan kod ini:

  • Foo f = new Foo("f"); mencipta objek dengan "f" sebagai atributnya.
  • changeReference(f); mencipta salinan baharu objek Foo, memperuntukkan "b" sebagai atributnya, tetapi ia tidak menjejaskan objek asal yang dirujuk oleh f.
  • modifyReference(f); mengubah suai objek yang f ditunjuk, menukar atributnya kepada "c".

Kesimpulan

Dalam Java, objek dihantar mengikut nilai, yang bermaksud salinan objek diluluskan sebagai hujah. Sebarang perubahan yang dibuat pada salinan dalam kaedah tidak menjejaskan objek asal. Walau bagaimanapun, jika kaedah mengubah suai objek itu sendiri (cth., dengan menukar atributnya), objek asal akan terjejas. Adalah penting untuk memahami konsep ini apabila bekerja dengan objek dalam Java untuk mengelakkan kemungkinan kekeliruan.

Atas ialah kandungan terperinci Bagaimana Java Mengendalikan Objek Lulus: Mengikut Nilai atau Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn