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:
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; }
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.
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.
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.
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.
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!