关于Java引用传递的一个困惑?
ringa_lee
ringa_lee 2017-04-18 10:47:30
0
6
519
    public static void swapEqual(int[] a,int[] b){
        int[] temp=new int[b.length];
        temp=b;
        b=a;
        a=temp;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] c={1,2};
        int[] d={3,4};
        swapEqual(c,d);
        System.out.println(c[1]);
    }

为什么打印出来的C[1]还是原来的2啊,为什么没有交换。数组的=不就是复制引用吗?通过函数可以把a,b的引用交换,这样不就是把内容交换了吗?
干嘛非要这样写?
public static void swap(int[] a,int[] b){
    int[] temp=new int[b.length];
    for(int i=0;i<b.length;i++){
        temp[i]=b[i];
    }
    for(int i=0;i<b.length;i++){
        b[i]=a[i];
    }
    for(int i=0;i<b.length;i++){
        a[i]=temp[i];
    }
}

这样子我试了一下,就可以达到交换的目的了
好困惑啊,求解!!

ringa_lee
ringa_lee

ringa_lee

membalas semua(6)
PHPzhong

swapEqual(int[] a,int[] b):
Pada permulaan:
a --> {1,2} (alamat 1)
b --> ,4} (Alamat 2)
Selepas diproses oleh kod anda (alamat yang ditunjukkan oleh a dan b ditukar):
b --> {1,2} (Alamat 1)
a - -&gt ; {3,4} (alamat 2)
tetapi ia tidak akan menjejaskan c, d, d masih:
c --> {1,2} (alamat 1)
d --> {3,4} (alamat 2)

//================================================

tukar(int[] a,int[] b):
Pada permulaan:
a --> {1,2} (alamat 1)
b --> ,4} (Alamat 2)
diproses oleh kod anda (nilai dalam alamat 1 dan 2 ditukar):
a --> {3,4} (Alamat 1)
b -- > {1,2} (Alamat 2)
Walaupun ia tidak akan menjejaskan alamat yang ditunjukkan oleh c dan d, nilai di bawah alamat asal telah berubah:
c --> 4} (Alamat 1)
d --> {1,2} (Alamat 2)

//=======================================

Pemahaman saya begini selepas menulisnya, saya dapati ia mempunyai maksud yang sama dengan ungkapan @lianera, jadi saya menganggapnya sebagai penjelasan tambahan.

//=======================================

Anda boleh cuba menggunakan return untuk menetapkan nilai a dan b yang ditukar dalam swapEqual(int[] a, int[] b) kepada c dan d dan lihat hasilnya.

Ty80

Dalam fungsi swapEqual, hanya rujukan parameter formal a dan b ditukar, tetapi rujukan parameter sebenar c dan d tidak diubah.
Dalam pertukaran, nilai kawasan yang sepadan dengan c dan d ditukar.
Untuk menambah, tatasusunan dalam Java juga merupakan objek, jadi a, b, c dan d adalah semua rujukan.

伊谢尔伦

Konsep rujukan dalam Java sedikit berbeza daripada rujukan dalam C++ Rujukan dalam Java adalah bersamaan dengan penunjuk dalam C++, jadi anda tidak boleh menukar parameter sebenar dengan memberikan nilai secara langsung kepada parameter formal.

Peter_Zhu

Lihat jawapan ini. https://www.zhihu.com/questio...

阿神

Rujukan Java (termasuk jenis asas, jenis rujukan objek) akan menjana rujukan baharu semasa pengisytiharan, panggilan kaedah, dll., salin rujukan di sebelah kanan tanda sama. Terbahagi kepada 3 situasi berikut:

  1. Nilai yang diwakili oleh jenis asas disimpan dalam rujukan Terdapat kawasan khas dalam rujukan untuk menyimpan nilai ini, jadi apabila menyalin, nilai itu juga disalin pada masa yang sama.

  2. Kawasan jenis rujukan ini menyimpan alamat memori objek dalam memori timbunan Apabila rujukan disalin, alamat memori yang ditunjuk adalah sama, jadi salinan nilai (iaitu. , objek) tidak akan terlibat

  3. Array mengandungi rujukan yang disimpan (termasuk jenis asas dan jenis rujukan objek)


Maklumat rujukan: Di Java, adakah jenis data rujukan menduduki memori?

Untuk menjelaskan isu ini, anda mesti terlebih dahulu memahami bahawa terdapat empat kategori dan lapan jenis asas dalam JAVA Kecuali jenis asas, semuanya adalah jenis rujukan. Sebagai contoh, jika anda menulis int i = 1;, maka peruntukannya dalam ingatan adalah seperti berikut: ruang diperuntukkan dalam ingatan, nama ruang ini ialah i, dan kandungan di dalamnya ialah 1.

Apabila anda menggunakan i, anda boleh mengakses kandungan dalam ruang ini. Jenis rujukan adalah berbeza Jenis rujukan menduduki dua blok memori dalam ingatan. Sebagai contoh: anda menulis String s; atau String s = null pada masa ini, sekeping memori diperuntukkan dalam memori. Memori ini dimuatkan dengan nilai nol, yang bermaksud tiada apa-apa yang dimuatkan. Kerana ia belum dimulakan lagi. Gambar sebelumnya:

Bagi peruntukan khusus s ini, ia bergantung kepada kedudukan di mana ia diisytiharkan. Jika s diisytiharkan sebagai pembolehubah tempatan, maka s berada dalam ruang tindanan. Jika ia bukan pembolehubah tempatan, ia tidak diperuntukkan pada timbunan. Tetapi apabila anda menggunakan s untuk menunjuk ke objek jenis String, sesuatu berubah. Iaitu, apabila anda seterusnya menulis s = new String("zhihu");. Gambar sebelumnya:

Akan ada nilai dalam s asal Berdasarkan nilai ini dalam ruang s, anda boleh mencari sekeping memori lain pada timbunan. Semua perkara baru ada dalam ingatan timbunan. Atribut rentetan diperuntukkan dalam ingatan ini pada timbunan. Memori timbunan adalah memori yang diperuntukkan secara dinamik. Oleh itu, kerana ia diperuntukkan pada timbunan, ia sebenarnya bermakna bahawa ia tidak pasti berapa banyak memori yang diduduki oleh objek baharu Ia hanya boleh diperuntukkan semasa masa jalan untuk memahami berapa besar objek diperuntukkan. Satu lagi sebab mengapa memori yang diduduki tidak dapat ditentukan ialah kaedah hanya memperuntukkan memori apabila ia dilaksanakan. Jika tiada kaedah dipanggil, kaedah itu hanyalah sekumpulan kod dan tidak menduduki memori.

伊谢尔伦

Terima kasih semua orang atas jawapan anda, semuanya sangat bagus. Saya pun faham

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!