1. Variabel referensi

Ing basa Jawa, ana rong jinis variabel: variabel primitif lan liyane. Kaya sing kedadeyan, saiki kita bakal ngomong babagan "kabeh liyane".

Nyatane, luwih bener yen ana variabel primitif lan variabel referensi . Dadi apa variabel referensi kasebut?

Ora kaya jinis primitif, sing variabel nyimpen nilai langsung, variabel referensi nyimpen referensi kanggo obyek. Sing, ana obyek nang endi wae ing memori, lan variabel referensi mung nyimpen alamat obyek iki ing memori (referensi kanggo obyek).

Mung jinis primitif nyimpen nilai langsung ing variabel. Kabeh jinis liyane mung nyimpen referensi obyek . Miturut cara, sampeyan wis nemoni rong jinis variabel kasebut - Stringvariabel lan variabel array .

Loro-lorone array lan senar minangka obyek sing disimpen ing memori. Stringvariabel lan variabel array mung nyimpen referensi kanggo obyek.

Variabel referensi ing Jawa

int a, int b and double dvariabel primitif sing nyimpen nilai ing dhewe.

Variabel String strminangka referensi lan nyimpen alamat (referensi) menyang Stringobyek ing memori.

Nalika nemtokake nilai primitif menyang variabel saka jinis primitif, nilai kasebut disalin (duplikat). Nalika nemtokake variabel referensi, mung alamat obyek sing disalinobyek dhewe ora disalin .


2. Apa sing dimaksud referensi?

Apa bedane dhasar antarane variabel referensi lan variabel primitif?

Variabel primitif kaya kothak: sampeyan bisa nyimpen sawetara nilai ing kono. Variabel referensi luwih kaya selembar kertas kanthi nomer telpon.

Mobil vs kunci mobil

Mbayangno sampeyan arep menehi kanca mobil kanggo ulang tahun. Sampeyan ora bakal mbungkus ing kothak lan nggawa karo sampeyan: mobil gedhe banget kanggo sing.

Luwih trep kanggo nampilake mung kunci mobil ing kothak sing cukup gedhe kanggo ngemot. Kanca bakal ngerti kabeh nalika dheweke entuk kunci metu saka kothak. Ora perlu nggawa kabeh mobil nalika sampeyan mung bisa ngulungake kunci.

A wong vs dheweke nomer telpon

Utawa iki perbandingan liyane: wong lan nomer telpon. Nomer telpon dudu wong kasebut, nanging nomer telpon bisa digunakake kanggo nelpon dheweke, takon sawetara informasi, utawa menehi instruksi.

Kajaba iku, referensi digunakake kanggo sesambungan karo obyek. Kabeh obyek sesambungan karo siji liyane nggunakake referensi. Tinimbang "ijol-ijolan wong", kita mung ngganti nomer telpon.

Nalika menehi nilai menyang variabel primitif, nilai kasebut disalin (duplikat). Nalika menehi nilai menyang variabel referensi, mung alamat (nomer telpon) obyek sing disalin - obyek kasebut ora disalin.

A referensi nawakake siji liyane kauntungan: sampeyan bisa pass referensi obyek kanggo sawetara cara, lan cara bakal bisa kanggo ngowahi (ngganti) obyek kanthi nggunakake referensi kanggo iku, nelpon cara lan ngakses data nang obyek.


3. Nemtokake referensi

Nalika nemtokake variabel referensi, mung alamat obyek ing memori diutus. Obyek dhewe ora katon utawa ilang.

Pendekatan iki ngindhari nyalin memori sing akeh. Yen sampeyan perlu kanggo pass obyek gedhe banget kanggo cara, kita mung pass referensi obyek lan sing. Referensi njupuk akeh kurang papan.

Nemtokake referensi

Ukuran kabeh variabel referensi (preduli saka jinise) padha - 4 bita (kaya int). Nanging! Yen aplikasi sampeyan mlaku ing mesin Java 64-bit, kabeh referensi bakal ukurane 8 bita (64 bit).

Apa maneh, referensi mung bisa diutus kanggo saben liyane. Sampeyan ora bisa ngganti referensi utawa menehi nilai arbitrer menyang variabel referensi:

Kode Katrangan
String hello = "Hello";
String s = hello;
Iki diijini
String hello = "Hello";
hello++;
Nanging iki ora diijini
String hello = 0x1234;
Lan iki ora diijini

4. nullReferensi

Lan apa nyimpen variabel referensi yen ora ana sing ditugasake?

Iku nyimpen referensi null . nullyaiku tembung kunci Jawa khusus sing tegese ora ana referensi (referensi kosong). Nilai kasebut nullbisa ditugasake menyang variabel referensi apa wae.

Kabeh variabel referensi nullkajaba padha duwe sawetara jinis referensi diutus.

Tuladha:

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


Variabel kasebut String namenduweni nilai standar: null.
Variabel kasebut int agenduweni nilai standar: 0.

Variabel lokal sing durung diwenehi nilai dianggep ora diinisialisasi kanggo jinis primitif lan referensi.

Yen variabel nyimpen referensi kanggo sawetara obyek, lan sampeyan pengin mbusak nilai variabel, banjur mung nemtokake referensi null.

Kode Katrangan
String s = null;
s = "Hello";
s = null;
stoko null.
snyimpen referensi menyang
stoko obyek senar null.

5. Maringaken referensi kanggo cara

Yen metode nduweni paramèter sing minangka jinis referensi , banjur nilai kasebut diterusake menyang metode kanthi cara sing padha nalika nggarap variabel non-referensi. Parameter kasebut mung diwenehi nilai variabel liyane.

Tuladha:

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


Ing fillngisi larik liwati ( array) karo nilai liwati ( value).

Nalika fillmetode kasebut diarani, arrayparamèter kasebut minangka referensi kanggo dataarray. Variabel kasebut valuediwenehi referensi kanggo obyek senar ("Hello").

Iki kaya memori sadurunge nelpon fill metode kasebut:

Maringaken referensi kanggo cara

Iki kaya memori nalika fill metode kasebut mlaku :

Referensi kanggo metode 2

Variabel datalan arraynuduhake (nyimpen referensi kanggo) wadhah sing padha ing memori.

Variabel valuenyimpen referensi kanggo obyek senar ( "Hello").

Sel-sel array uga mung nyimpen referensi kanggo "Hello"obyek kasebut.

Nyatane, ora ana obyek sing diduplikasi - mung referensi sing disalin.



6. Perbandingan karo basa C/C ++

Ing wawancara, kadang programer Jawa ditakoni kepiye data dikirim menyang metode ing Jawa? Lan kadhangkala pitakonan apa data dilewati kanthi referensi utawa kanthi nilai?

Pitakonan iki asalé saka C ++, nanging ora banget migunani ing Jawa . Ing Jawa, paramèter tansah diwenehi nilai-nilai argumen. Dadi jawaban sing bener yaiku " dening nilai ".

Nanging disiapake kanggo nerangake posisi sampeyan , amarga sampeyan bisa langsung krungu retort: ​​"jinis primitif liwati dening nilai, lan jinis referensi sing liwati dening referensi."

Iki asal saka Jeksa Agung bisa ngetokake iki Asal-Usul saka kasunyatan sing akeh programer Jawa padha C++ programer ing sasi. Ing basa pamrograman kasebut, pitakonan babagan cara paramèter dikirim menyang metode kasebut penting banget.

Ing Jawa, kabeh ora jelas: jinis primitif nyimpen nilai lan jinis referensi uga nyimpen nilai - referensi. Iku pitakonan apa variabel dianggep minangka nilai .

Ing C ++, variabel bisa nyimpen referensi kanggo obyek lan obyek kasebut dhewe. Semono uga babagan jinis primitif: variabel primitif bisa nyimpen nilai utawa nyatakake variabel kasebut minangka referensi menyang int. Dadi, supaya ora kebingungan, programer C ++ tansah ngrujuk obyek kasebut minangka referensi minangka referensi , lan obyek kasebut dhewe - minangka nilai.

Ing C ++, sampeyan bisa kanthi gampang duwe kahanan ing ngendi siji variabel ngemot obyek, nanging liyane ngemot referensi kanggo obyek kasebut. Mulane, pitakonan babagan apa sing disimpen variabel - obyek kasebut dhewe utawa mung referensi - penting banget. Nalika obyek ditransfer menyang metode, disalin (yen dilewati kanthi nilai), lan ora disalin (yen dilewati kanthi referensi).

Ing Jawa, dualitas iki ora ana, mula jawaban sing bener yaiku: argumen diterusake menyang metode Jawa kanthi nilai . Mung yen kita ngomong babagan variabel referensi, nilai iki minangka referensi.