1. Variabel referensi

Dalam bahasa Java, ada dua jenis variabel: variabel primitif dan yang lainnya. Seperti yang terjadi, kita akan berbicara tentang "segala sesuatu yang lain" sekarang.

Faktanya, akan lebih tepat untuk mengatakan bahwa ada variabel primitif dan variabel referensi . Jadi apa variabel referensi ini?

Tidak seperti tipe primitif, yang variabelnya menyimpan nilai secara langsung, variabel referensi menyimpan referensi ke objek. Artinya, ada objek di suatu tempat di memori, dan variabel referensi hanya menyimpan alamat objek ini di memori (referensi ke objek).

Hanya tipe primitif yang menyimpan nilai secara langsung di dalam variabel. Semua jenis lainnya hanya menyimpan referensi objek . Omong-omong, Anda telah menemukan dua jenis variabel seperti itu — Stringvariabel dan variabel array .

Baik array dan string adalah objek yang disimpan di suatu tempat di memori. Stringvariabel dan variabel array hanya menyimpan referensi ke objek.

Variabel referensi di Jawa

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

Variabel String stradalah referensi dan menyimpan alamat (referensi) ke Stringobjek di memori.

Saat menetapkan nilai primitif ke variabel bertipe primitif, nilainya disalin (digandakan). Saat menetapkan variabel referensi, hanya alamat objek yang disalinobjek itu sendiri tidak disalin .


2. Apa yang dimaksud dengan referensi?

Apa perbedaan mendasar antara variabel referensi dan variabel primitif?

Variabel primitif seperti sebuah kotak: Anda dapat menyimpan beberapa nilai di dalamnya. Variabel referensi lebih seperti selembar kertas dengan nomor telepon di atasnya.

Mobil vs kunci mobil

Bayangkan Anda memutuskan untuk memberi teman Anda sebuah mobil untuk ulang tahunnya. Anda tidak akan membungkusnya dalam sebuah kotak dan membawanya bersama Anda: mobilnya terlalu besar untuk itu.

Jauh lebih nyaman untuk hanya menyajikan kunci mobil di dalam kotak yang cukup besar untuk menampungnya. Teman Anda akan mengerti segalanya saat dia mengeluarkan kunci dari kotaknya. Tidak perlu membawa seluruh mobil saat Anda cukup menyerahkan kuncinya.

Seseorang vs nomor teleponnya

Atau inilah perbandingan lain: seseorang dan nomor teleponnya. Nomor telepon bukanlah orangnya, tetapi nomor telepon dapat digunakan untuk meneleponnya, menanyakan beberapa informasi, atau memberikan instruksi.

Demikian pula, referensi digunakan untuk berinteraksi dengan objek. Semua objek berinteraksi satu sama lain menggunakan referensi. Alih-alih "bertukar orang", kami hanya bertukar nomor telepon.

Saat menetapkan nilai ke variabel primitif, nilainya disalin (digandakan). Saat menetapkan nilai ke variabel referensi, hanya alamat (nomor telepon) objek yang disalin — objek itu sendiri tidak disalin.

Referensi menawarkan satu keuntungan lagi: Anda dapat meneruskan referensi objek ke beberapa metode, dan metode tersebut akan dapat memodifikasi (mengubah) objek dengan menggunakan referensi ke sana, memanggil metodenya, dan mengakses data di dalam objek.


3. Menetapkan referensi

Saat menetapkan variabel referensi, hanya alamat objek dalam memori yang ditetapkan. Objek itu sendiri tidak muncul atau menghilang.

Pendekatan ini menghindari penyalinan memori dalam jumlah besar. Jika Anda perlu meneruskan objek yang sangat besar ke suatu metode, kami hanya meneruskan referensi objek dan hanya itu. Referensi membutuhkan lebih sedikit ruang.

Menetapkan referensi

Ukuran semua variabel referensi (terlepas dari jenisnya) adalah sama — 4 byte (seperti int). Tetapi! Jika aplikasi Anda berjalan pada mesin Java 64-bit, maka semua referensi akan berukuran 8 byte (64 bit).

Terlebih lagi, referensi hanya dapat diberikan satu sama lain. Anda tidak dapat mengubah referensi atau menetapkan nilai arbitrer ke variabel referensi:

Kode Keterangan
String hello = "Hello";
String s = hello;
Ini diperbolehkan
String hello = "Hello";
hello++;
Tapi ini tidak diperbolehkan
String hello = 0x1234;
Dan ini tidak diperbolehkan

4. nullReferensi

Dan apa yang disimpan variabel referensi jika belum ada yang ditugaskan padanya?

Ini menyimpan referensi nol . nulladalah kata kunci Java khusus yang berarti tidak adanya referensi (referensi kosong). Nilai nulldapat diberikan ke variabel referensi apa pun.

Semua variabel referensi adalah nullkecuali mereka memiliki semacam referensi yang ditugaskan kepada mereka.

Contoh:

Kode Keterangan
class Person
{
   public static String name;
   public static int age;
}


Variabel String namememiliki nilai default: null.
Variabel int agememiliki nilai default: 0.

Variabel lokal yang belum diberi nilai dianggap tidak diinisialisasi untuk tipe primitif dan referensi.

Jika variabel menyimpan referensi ke beberapa objek, dan Anda ingin menghapus nilai variabel, maka berikan saja referensi nol.

Kode Keterangan
String s = null;
s = "Hello";
s = null;
stoko null.
smenyimpan referensi ke
stoko objek string null.

5. Melewati referensi ke metode

Jika suatu metode memiliki parameter yang merupakan tipe referensi , maka nilai akan diteruskan ke metode dengan cara yang sama seperti saat bekerja dengan variabel non-referensi. Parameter hanya diberi nilai dari variabel lain.

Contoh:

Kode Keterangan
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");
   }
}


Isi filllarik yang diteruskan ( array) dengan nilai yang diteruskan ( value).

Saat fillmetode dipanggil, arrayparameter diberi referensi ke dataarray. Variabel valuediberi referensi ke objek string ("Halo").

Seperti inilah tampilan memori sebelum memanggil fill metode:

Melewati referensi ke metode

Seperti inilah tampilan memori saat fill metode ini berjalan :

Melewati referensi ke metode 2

Variabel dataand arraymerujuk ke (menyimpan referensi ke) wadah yang sama di memori.

Variabel valuemenyimpan referensi ke objek string ( "Hello").

Sel-sel array juga hanya menyimpan referensi ke "Hello"objek.

Faktanya, tidak ada objek yang digandakan — hanya referensi yang disalin.



6. Perbandingan dengan bahasa C/C++

Dalam wawancara, terkadang programmer Java ditanya bagaimana data diteruskan ke metode di Java? Dan terkadang pertanyaannya adalah apakah data dilewatkan dengan referensi atau dengan nilai?

Pertanyaan ini berasal dari C++, tetapi tidak terlalu berarti di Java . Di Jawa, parameter selalu diberi nilai argumen. Jadi jawaban yang benar adalah " berdasarkan nilai ".

Tetapi bersiaplah untuk menjelaskan posisi Anda , karena Anda mungkin langsung mendengar jawaban: "tipe primitif diteruskan dengan nilai, dan tipe referensi diteruskan dengan referensi."

Asal usul masalah ini berasal dari fakta bahwa banyak programmer Java adalah programmer C++ di masa lalu. Dalam bahasa pemrograman itu, pertanyaan tentang bagaimana parameter diteruskan ke metode sangatlah penting.

Di Jawa, semuanya tidak ambigu: tipe primitif menyimpan nilai dan tipe referensi juga menyimpan nilai — referensi. Ini pertanyaan apakah suatu variabel dianggap sebagai nilai .

Di C++, variabel dapat menyimpan referensi ke objek dan objek itu sendiri. Hal yang sama berlaku untuk tipe primitif: variabel primitif dapat menyimpan nilai atau mendeklarasikan variabel sebagai referensi ke int. Jadi, untuk menghindari kebingungan, pemrogram C++ selalu merujuk objek ke referensi sebagai referensi , dan objek itu sendiri — sebagai nilai.

Di C++, Anda dapat dengan mudah mengalami situasi di mana satu variabel berisi objek, tetapi yang lain berisi referensi ke objek tersebut. Oleh karena itu, pertanyaan tentang apa yang disimpan variabel - objek itu sendiri atau hanya referensi untuk itu - menjadi sangat penting. Ketika sebuah objek diteruskan ke metode, itu disalin (jika diteruskan dengan nilai), dan tidak disalin (jika diteruskan dengan referensi).

Di Jawa, dualitas ini tidak ada, jadi jawaban yang benar adalah: argumen diteruskan ke metode Java dengan nilai . Hanya saja ketika kita berbicara tentang variabel referensi, nilai ini adalah referensi.