1. Pembolehubah rujukan

Dalam bahasa Java, terdapat dua jenis pembolehubah: pembolehubah primitif dan segala-galanya. Seperti yang berlaku, kita akan bercakap tentang "segala-galanya" sekarang.

Malah, adalah lebih tepat untuk mengatakan bahawa terdapat pembolehubah primitif dan pembolehubah rujukan . Jadi apakah pembolehubah rujukan ini?

Tidak seperti jenis primitif, yang pembolehubahnya menyimpan nilai secara langsung, pembolehubah rujukan menyimpan rujukan kepada objek. Iaitu, terdapat objek di suatu tempat dalam ingatan, dan pembolehubah rujukan hanya menyimpan alamat objek ini dalam ingatan (rujukan kepada objek).

Hanya jenis primitif menyimpan nilai terus di dalam pembolehubah. Semua jenis lain hanya menyimpan rujukan objek . Ngomong-ngomong, anda telah menemui dua jenis pembolehubah sedemikian - Stringpembolehubah dan pembolehubah tatasusunan .

Kedua-dua tatasusunan dan rentetan adalah objek yang disimpan di suatu tempat dalam ingatan. Stringpembolehubah dan pembolehubah tatasusunan hanya menyimpan rujukan kepada objek.

Pembolehubah rujukan dalam Java

int a, int b and double dadalah pembolehubah primitif yang menyimpan nilainya di dalam diri mereka.

Pembolehubah String strialah rujukan dan menyimpan alamat (rujukan) kepada Stringobjek dalam ingatan.

Apabila memberikan nilai primitif kepada pembolehubah jenis primitif, nilainya disalin (pendua). Apabila menetapkan pembolehubah rujukan, hanya alamat objek disalinobjek itu sendiri tidak disalin .


2. Apakah maksud rujukan?

Apakah perbezaan asas antara pembolehubah rujukan dan pembolehubah primitif?

Pembolehubah primitif adalah seperti kotak: anda boleh menyimpan beberapa nilai di dalamnya. Pembolehubah rujukan lebih seperti sekeping kertas dengan nombor telefon padanya.

Kereta vs kunci kereta

Bayangkan anda memutuskan untuk memberikan rakan anda sebuah kereta untuk hari lahirnya. Anda tidak akan membungkusnya dalam kotak dan membawanya bersama anda: kereta itu terlalu besar untuk itu.

Adalah lebih mudah untuk membentangkan hanya kunci kereta dalam kotak yang cukup besar untuk memuatkannya. Rakan anda akan memahami segala-galanya apabila dia mengeluarkan kunci dari kotak. Tidak perlu membawa keseluruhan kereta bersama anda apabila anda hanya boleh menyerahkan kunci.

Seseorang vs nombor telefonnya

Atau inilah perbandingan lain: seseorang dan nombor telefonnya. Nombor telefon bukanlah orangnya, tetapi nombor telefon boleh digunakan untuk menghubunginya, meminta maklumat daripadanya atau memberikan arahan.

Begitu juga, rujukan digunakan untuk berinteraksi dengan objek. Semua objek berinteraksi antara satu sama lain menggunakan rujukan. Daripada "bertukar orang", kami hanya bertukar nombor telefon.

Apabila memberikan nilai kepada pembolehubah primitif, nilainya disalin (pendua). Apabila memberikan nilai kepada pembolehubah rujukan, hanya alamat (nombor telefon) objek yang disalin — objek itu sendiri tidak disalin.

Rujukan menawarkan satu lagi kelebihan: anda boleh menghantar rujukan objek kepada beberapa kaedah, dan kaedah itu akan dapat mengubah suai (menukar) objek dengan menggunakan rujukan kepadanya, memanggil kaedahnya dan mengakses data di dalam objek.


3. Memberikan rujukan

Apabila menetapkan pembolehubah rujukan, hanya alamat objek dalam ingatan diberikan. Objek itu sendiri tidak muncul atau hilang.

Pendekatan ini mengelakkan menyalin sejumlah besar memori. Jika anda perlu menghantar objek yang sangat besar kepada kaedah, kami hanya lulus rujukan objek dan itu sahaja. Rujukan mengambil lebih sedikit ruang.

Menetapkan rujukan

Saiz semua pembolehubah rujukan (tanpa mengira jenisnya) adalah sama — 4 bait (seperti int). Tetapi! Jika aplikasi anda berjalan pada mesin Java 64-bit, maka semua rujukan akan bersaiz 8 bait (64 bit).

Apatah lagi, rujukan hanya boleh diberikan kepada satu sama lain. Anda tidak boleh menukar rujukan atau menetapkan nilai arbitrari kepada pembolehubah rujukan:

Kod Penerangan
String hello = "Hello";
String s = hello;
Ini dibenarkan
String hello = "Hello";
hello++;
Tetapi ini tidak dibenarkan
String hello = 0x1234;
Dan ini tidak dibenarkan

4. nullRujukan

Dan apakah yang boleh disimpan oleh pembolehubah rujukan jika tiada apa yang telah ditetapkan kepadanya lagi?

Ia menyimpan rujukan nol . nullialah kata kunci Java khas yang bermaksud ketiadaan rujukan (rujukan kosong). Nilai nullboleh diberikan kepada mana-mana pembolehubah rujukan.

Semua pembolehubah rujukan adalah nullmelainkan mereka mempunyai beberapa jenis rujukan yang diberikan kepada mereka.

Contoh:

Kod Penerangan
class Person
{
   public static String name;
   public static int age;
}


Pembolehubah String namemempunyai nilai lalai: null.
Pembolehubah int agemempunyai nilai lalai: 0.

Pembolehubah tempatan yang belum diberikan nilai dianggap tidak dimulakan untuk kedua-dua jenis primitif dan rujukan.

Jika pembolehubah menyimpan rujukan kepada beberapa objek, dan anda ingin mengosongkan nilai pembolehubah itu, maka tetapkan rujukan itu sebagai rujukan nol.

Kod Penerangan
String s = null;
s = "Hello";
s = null;
skedai null.
smenyimpan rujukan kepada
smenyimpan objek rentetan null.

5. Lulus rujukan kepada kaedah

Jika kaedah mempunyai parameter yang merupakan jenis rujukan , maka nilai dihantar kepada kaedah dengan cara yang sama seperti semasa bekerja dengan pembolehubah bukan rujukan. Parameter hanya diberikan nilai pembolehubah lain.

Contoh:

Kod Penerangan
class Solution
{
   public static void fill(String[] array, String value)
   {
      for (int i = 0; i < array.length; i++)
        array[i] = value;
   }

   public static void main(String[] args)
   {
     String[] data = new String[10];
     fill(data, "Hello");
   }
}


Mengisi filltatasusunan yang diluluskan ( array) dengan nilai yang diluluskan ( value).

Apabila fillkaedah dipanggil, arrayparameter diberikan rujukan kepada datatatasusunan. Pembolehubah valuediberikan rujukan kepada objek rentetan ("Hello").

Inilah rupa memori sebelum memanggil fill kaedah:

Meluluskan rujukan kepada kaedah

Inilah rupa memori apabila fill kaedah sedang berjalan :

Memberi rujukan kepada kaedah 2

Pembolehubah datadan arraymerujuk kepada (menyimpan rujukan kepada) bekas yang sama dalam ingatan.

Pembolehubah valuemenyimpan rujukan kepada objek rentetan ( "Hello").

Sel tatasusunan juga hanya menyimpan rujukan kepada "Hello"objek.

Malah, tiada objek yang diduplikasi — hanya rujukan disalin.



6. Perbandingan dengan bahasa C/C ++

Dalam temu bual, kadangkala pengaturcara Java ditanya bagaimana data dihantar ke kaedah di Jawa? Dan kadangkala persoalannya ialah sama ada data diluluskan melalui rujukan atau nilai?

Soalan ini datang daripada C++, tetapi tidak begitu bermakna dalam Java . Dalam Java, parameter sentiasa diberikan nilai-nilai argumen. Jadi jawapan yang betul ialah " mengikut nilai ".

Tetapi bersedia untuk menerangkan kedudukan anda , kerana anda mungkin mendengar balas dengan segera: "jenis primitif diluluskan mengikut nilai, dan jenis rujukan diluluskan melalui rujukan."

Asal isu ini berpunca daripada fakta bahawa ramai pengaturcara Java adalah pengaturcara C++ pada masa lalu. Dalam bahasa pengaturcaraan itu, persoalan bagaimana parameter dihantar ke kaedah adalah sangat penting.

Di Java, semuanya tidak jelas: jenis primitif menyimpan nilai dan jenis rujukan juga menyimpan nilai — rujukan. Ini adalah persoalan sama ada pembolehubah dianggap sebagai nilai .

Dalam C++, pembolehubah boleh menyimpan kedua-dua rujukan kepada objek dan objek itu sendiri. Perkara yang sama berlaku tentang jenis primitif: pembolehubah primitif boleh menyimpan nilai atau mengisytiharkan pembolehubah sebagai rujukan kepada int. Jadi, untuk mengelakkan kekeliruan, pengaturcara C++ sentiasa merujuk objek kepada rujukan sebagai rujukan dan objek itu sendiri — sebagai nilai.

Dalam C++, anda boleh dengan mudah mempunyai situasi di mana satu pembolehubah mengandungi objek, tetapi yang lain mengandungi rujukan kepada objek itu. Sehubungan itu, persoalan tentang apa yang disimpan oleh pembolehubah - objek itu sendiri atau hanya rujukan kepadanya - adalah sangat penting. Apabila objek dihantar ke kaedah, ia disalin (jika diluluskan oleh nilai), dan tidak disalin (jika diluluskan melalui rujukan).

Di Jawa, dualitas ini tidak wujud, jadi jawapan yang betul ialah: argumen dihantar ke kaedah Java mengikut nilai . Cuma apabila kita bercakap tentang pembolehubah rujukan, nilai ini adalah rujukan.