Rumah >Java >javaTutorial >Adakah Objek Java Lulus mengikut Nilai atau Rujukan?

Adakah Objek Java Lulus mengikut Nilai atau Rujukan?

Barbara Streisand
Barbara Streisandasal
2024-11-21 06:14:10466semak imbas

Does Java Pass Objects by Value or Reference?

Java: Pass by Value vs. Pass by Reference

Di Jawa, miskonsepsi sering timbul mengenai mekanisme hantaran objek. Artikel ini akan menyelidiki perbezaan antara dua coretan kod, menjelaskan prinsip asas gelagat lulus parameter Java.

Kod A lwn. Kod B

Kod A:

Foo myFoo;
myFoo = createfoo();

public Foo createFoo() {
   Foo foo = new Foo();
   return foo;
}

Kod B:

Foo myFoo;
createFoo(myFoo);

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

Memahami Pasan Parameter Java

Bertentangan dengan kepercayaan popular, Java menggunakan nilai pas, bukan rujukan. Ini bermakna apabila objek diluluskan sebagai hujah, salinan rujukannya dibuat dan bukannya rujukan terus kepada yang asal.

Penjelasan Kod A

Dalam baris pertama, myFoo ialah diisytiharkan tetapi tidak ditugaskan. Baris kedua memanggil kaedah createFoo, yang mengembalikan objek Foo baharu yang diberikan kepada myFoo. Tugasan ini mencipta objek baharu yang berbeza daripada yang dibuat dalam kaedah.

Penjelasan Kod B

Sebaliknya, Kod B menghantar rujukan myFoo sebagai hujah kepada kaedah createFoo. Dalam kaedah tersebut, objek Foo baharu dicipta dan diberikan kepada parameter foo. Selepas itu, foo ditugaskan kepada a, yang merupakan pembolehubah tempatan dalam kaedah. Penugasan semula ini secara berkesan mengubah suai foo rujukan tempatan, bukan rujukan asal myFoo.

Contoh untuk Kejelasan

Untuk menggambarkan konsep, pertimbangkan kelas berikut:

public class Foo {
   private String attribute;

   public void setAttribute(String attribute) {
      this.attribute = attribute;
   }
}

Utama Kelas:

public class Main {
   public static void main(String[] args) {
      Foo f = new Foo("f");
      changeReference(f); // Attempt to change reference
      modifyReference(f); // Attempt to modify object attribute
   }

   public static void changeReference(Foo a) {
      Foo b = new Foo("b");
      a = b;
   }

   public static void modifyReference(Foo c) {
      c.setAttribute("c");
   }
}

Selepas kaedah utama mencipta tika Foo dan menetapkannya kepada f, ia memanggil changeReference, yang cuba menetapkan semula rujukan kepada objek lain. Walau bagaimanapun, ini tidak mengubah rujukan f.

Sebaliknya, modifyReference mengubah suai atribut objek yang dirujuk oleh c, iaitu objek yang sama dengan f. Ini menunjukkan bahawa hantaran rujukan mencipta salinan rujukan, bukan objek itu sendiri.

Kesimpulan

Pendekatan nilai lulus Java memastikan kebolehubahan objek dengan melindungi objek asal daripada pengubahsuaian yang tidak disengajakan di luar skopnya. Prinsip ini menggalakkan enkapsulasi dan memudahkan penciptaan kod yang mantap dan boleh diramal.

Atas ialah kandungan terperinci Adakah Objek Java 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