JavaRush /Kurslar /All lectures for UZ purposes /Java'da Havolali o'zgaruvchilar

Java'da Havolali o'zgaruvchilar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Havolali o'zgaruvchilar

Java tilida o'zgaruvchilar ikki xil bo'lishi mumkin: primitiv turdagi o'zgaruvchilar va qolganlari. "Qolganlar" haqida hozir gaplashamiz.

To'g'riroq aytganda, primitiv turdagi o'zgaruvchilar (primitive type variables) va havolali o'zgaruvchilar (reference variables) bor. Xo'sh, bu havolali o'zgaruvchilar nima o'zi?

Primitiv turlardan farqli o'laroq, bu turlar o'zgaruvchilar ichida qiymatlarni to'g'ridan-to'g'ri saqlash imkonini beradi, havolali turlardagi o'zgaruvchilar obyektlarga havolalarni saqlaydi. Ya'ni, xotirada biror obyekt mavjud, va havolali o'zgaruvchida faqat xotiraning bu obyektga manzili (havola) saqlanadi.

Qiymatlar to'g'ridan-to'g'ri o'zgaruvchilar ichida faqat primitiv turlar saqlaydi, boshqa barcha turlar faqat obyektga havola saqlaydi. Oldin ham aynan shu turdagi ikkita o'zgaruvchilar bilan tanishgan edingiz: ular String turi va massiv turi o'zgaruvchilari edi.

Ham massiv, ham satrlar obyektlarga kiradi, ular xotirada qayerdadir saqlanadi. String turi va massiv turi o'zgaruvchilari faqat obyektlarga havolalarni saqlaydi.

int a, int b и double d o'zgaruvchilari primitiv bo'lib, qiymatni o'z ichida saqlaydi.

String str o'zgaruvchisi havolali bo'lib, xotirada String turidagi obyektning manzilini (havolasini) saqlaydi.

Primitiv qiymatni primitiv turdagi o'zgaruvchiga tayinlashda, uning qiymati nusxalanadi (dublanadi). Havolali o'zgaruvchiga esa faqat obyekt manzili nusxalanadi, lekin obyektning o'zi nusxalanmaydi.


2. Havolalarning mohiyati

Havolali o'zgaruvchilarni primitiv o'zgaruvchilardan nimasi bilan prinsipial farqlanadi?

Primitiv o'zgaruvchi — bu go'yo quti: unda qandaydir qiymatni saqlash mumkin. Havolali o'zgaruvchi esa ko'proq qog'oz varag'iga yozilgan telefon raqamiga o'xshaydi.

Avtomobil vs mashina kalitlari

Tasavvur qiling, do'stingizning tug'ilgan kunida unga mashina sovg'a qilmoqchisiz. Uni qutiga solib olib borasizmi: mashina buning uchun juda katta.

Ancha osonroq yo'li - mashina kalitini olib borish va uni qutiga solish. Do'stingiz ham qutidan kalitni olganda hammasini tushunadi. Butun mashinani olib borishning hojati yo'q, shunchaki kalitlarni topshirish kifoya.

Inson vs ularning telefon raqami

Yoki yana bir misol: inson va uning telefon raqami. Telefon raqami - bu insonning o'zi emas, lekin telefon raqami orqali unga qo'ng'iroq qilish, undan ma'lumotlar so'rash, buyruqlar berish mumkin.

Havola ham obyekt bilan ishlash uchun ishlatiladi. Barcha obyektlar bir-biri bilan havolalar orqali bog'lanadi. Bir-biriga "odamlar almashish" o'rniga, shunchaki telefon raqamlarini almashtirish kifoya.

Primitiv o'zgaruvchiga qiymat tayinlashda, uning qiymati nusxalanadi (dublanadi). Havolali o'zgaruvchiga qiymat tayinlashda esa faqat obyekt manzili ("telefon raqami") nusxalanadi, lekin obyektning o'zi nusxalanmaydi.

Havola yana bir afzallikni beradi: obyektga havolani qandaydir metodga uzatish mumkin, va bu metod obyektting o'zgartirishi (modifikatsiya qilishi) mumkin, unga havola orqali, uning metodlarini chaqirib va obyekt ichidagi ma'lumotlarga murojaat qilib.


3. Havolalarni tayinlash

Havolali o'zgaruvchilarni tayinlashda xotirada obyekt manzili tayinlanadi. Obyektlar o'zlari paydo bo'lmaydi yoki yo'qolmaydi.

Bunday yondashuv katta xotira hajmlarini nusxalashdan qochishga yordam beradi. Agar juda katta obyektni uzatish kerak bo'lsa, biz shunchaki metodga obyekt havolasini uzatamiz va hammasi. Havola ancha kam joy egallaydi.

Havolalarni tayinlash

Barcha havolali o'zgaruvchilar hajmi (typdan qat'i nazar) bir xil va 4 bayt (int turi kabi). Lekin! Agar dasturingiz 64 bitli Java-mashinada ishga tushirilgan bo'lsa, barcha havolalar hajmi 8 bayt (64 bit) bo'ladi.

Havolalarni faqat bir-biriga tayinlash mumkin. Siz havolalarni o'zgartira olmaysiz yoki ularga tasodifiy qiymatlar tayinlay olmaysiz:

Kod Tavsif
String hello = "Salom";
String s = hello;
Bunday mumkin
String hello = "Salom";
hello++;
Buni esa — mumkin emas
String hello = 0x1234;
Bu ham — mumkin emas

4. Bo'sh havola — null

Havolali o'zgaruvchiga hali hech narsa tayinlanmagan bo'lsa, nima saqlanadi?

U holda u bo'sh havola — null saqlaydi. null — bu Java'da maxsus kalit so'z bo'lib, havola yo'qligini (bo'sh havola) ko'rsatadi. null qiymatini har qanday havolali o'zgaruvchiga tayinlash mumkin.

Agar havolali o'zgaruvchiga biror havola tayinlanmagan bo'lsa, u null qiymatiga ega bo'ladi.

Misollar:

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


O'zgaruvchi String name default qiymatiga ega: null.
O'zgaruvchi int age default qiymatiga ega: 0.

Agar lokal o'zgaruvchilar qiymatsiz bo'lsa, ular ham primitiv, ham havolali turlar uchun inicializatsiya qilinmagan deb hisoblanadi.

Agar o'zgaruvchi biror obyektga havola saqlasa, va siz o'zgaruvchi qiymatidan qutulmoqchi bo'lsangiz, unga faqat null havolasini tayinlang.

Kod Tavsif
String s = null;
s = "Salom";
s = null;
s null havolasini saqlaydi.
s satr obyektiga havolani saqlaydi
s null havolasini saqlaydi

5. Havolalarni metodlarga uzatish

Agar biron-bir metodda havolali o'zgaruvchilar parametrlari mavjud bo'lsa, ularga qiymatlar uzatilishi xuddi oddiy o'zgaruvchilar bilan ishlash kabi bo'ladi. Parametr-o'zgaruvchiga shunchaki boshqa o'zgaruvchining qiymati tayinlanadi.

Misol:

Kod Tavsif
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");
   }
}


fill metodi berilgan array massivini berilgan qiymat bilan value to'ldiradi.

fill metodi chaqirilganda, array o'zgaruvchiga data massiviga havola tayinlanadi. value o'zgaruvchiga esa "Hello" satr obyektiga havola tayinlanadi.

Mana metod chaqirilishidan oldin xotirada qanday holatda bo'ladi:

Havolalarni metodlarga uzatish

Mana metod ishlayotgan vaqtda qanday holatda bo'ladi::

Havolalarni metodlarga uzatish 2

data va array o'zgaruvchilar xotirada bir xil massiv-konteynerga havolani saqlaydi.

value o'zgaruvchi Hello satr obyektiga havolani saqlaydi.

Massiv hujayralari ham shunchaki Hello obyekti havolalarini saqlaydi.

Aslida hech qanday obyektlar nusxalanmaydi — faqat havolalar nusxalanadi.



6. C/C++ tili bilan taqqoslash

Ba'zida Java dasturchilardan intervyularda so'rashadi: Java'da metodlarga ma'lumotlar qanday uzatiladi? Ba'zida aniqlashtirishadi: havola orqali yoki qiymat orqali?

Bu savol C++ tilidan kelib chiqadi — Java tilida bu savol ma'noga ega emas. Java'da parametr-o'zgaruvchilarga har doim faqat argument-o'zgaruvchilar qiymatlari tayinlanadi. To'g'ri javob — qiymat orqali.

Lekin pozitsiyangizni tushuntirishga tayyor bo'ling, chunki sizga darhol javob berishi mumkin, "primitiv turlar qiymat orqali uzatiladi, havolali turlar esa havola orqali".

Bu masalaning ildizi shundaki, koʻplab Java dasturchilar oldin C++ dasturchilari boʻlgan. U yerda "parametrlar metodlarga qanday uzatiladi" savoli juda muhim rol oʻynar edi.

Java'da hammasi aniq: primitiv turlar qiymatlarni saqlaydi, havolali turlar ham qiymatni saqlaydi — havolani. Hammasi o'zgaruvchining qiymatini nimada ko'rishni anglab olishda.

C++ tilida o'zgaruvchida obyektga havolani yoki o'zini saqlash mumkin edi. Primitiv turlar ham xuddi shunday: qiymatni yoki int turiga havola orqali o'zgaruvchini e'lon qilish mumkin edi. Shuning uchun adashmaslik uchun, C++ dasturchilar obyektga havolani har doim havola deb ataydilar, o'zini esa — qiymat.

C++ tilida osonlik bilan shunday vaziyat hosil bo'lishi mumkinki, bir o'zgaruvchi obyektni saqlagan bo'lsa, boshqa bir o'zgaruvchi esa aynan shu obyektga havolani saqlaydi. Shuning uchun o'zgaruvchi nima saqlaydi — obyektning o'zi yoki faqat havola — bu juda muhim edi. Obyektni metodga uzatishda u nusxalanar edi (agar qiymat orqali uzatilgan bo'lsa), va nusxalanmas edi (agar havola orqali uzatilgan bo'lsa).

Java'da bu ikilik yo'q, va to'g'ri javob shunday bo'ladi: Java metodlarga parametrlar qiymat orqali uzatiladi. Faqat havolali o'zgaruvchilar holatida bu qiymat — havola.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION