JavaRush /Java blogi /Random-UZ /Java tilidagi ma'lumotlar turlari

Java tilidagi ma'lumotlar turlari

Guruhda nashr etilgan
Java sintaksisini tushunmasdan, jiddiy dasturchi bo'lish mumkin emas, shuning uchun bugungi kunda biz sintaksisni o'rganishda davom etamiz. Oldingi maqolalardan birida biz ibtidoiy o'zgaruvchilar haqida gapirgan edik, lekin o'zgaruvchilarning ikki turi mavjud bo'lganligi sababli, bugun biz ikkinchi turdagi - Java'dagi mos yozuvlar turlari haqida gapiramiz. Xo'sh, bu nima? Nima uchun Java-da mos yozuvlar ma'lumotlar turlari kerak? Java-da mos yozuvlar ma'lumotlar turlari - 1Tasavvur qilaylik, bizda kanal raqami, ovoz balandligi va bayroq kabi ba'zi xususiyatlarga ega televizor ob'ekti bor:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
Qanday qilib oddiy turdagi , intbu ma'lumotlarni saqlashi mumkin? Esda tutaylik: bitta o'zgaruvchi int4 bayt. Ammo ichkarida bir xil turdagi ikkita o'zgaruvchi (4 bayt + 4 bayt) mavjud, shuningdek boolean(+1 bayt) ... Jami - 4 dan 9 gacha, lekin qoida tariqasida ob'ektda ko'proq ma'lumot saqlanadi. Nima qilish kerak? Ob'ektni o'zgaruvchiga qo'yib bo'lmaydi. Bizning hikoyamizning ushbu nuqtasida mos yozuvlar o'zgaruvchilari paydo bo'ladi. Yo'naltiruvchi o'zgaruvchilar ma'lum bir ob'ekt joylashgan xotira joyining manzilini saqlaydi. Ya'ni, bu manzilga ega bo'lgan "vizit karta" bo'lib, uning yordamida biz umumiy xotirada ob'ektimizni topamiz va u bilan ba'zi manipulyatsiyalarni amalga oshiramiz. Java-dagi har qanday ob'ektga havola mos yozuvlar o'zgaruvchisidir. Bu bizning televizor ob'ektimiz bilan shunday ko'rinadi:
TV telly = new TV();
tellyBiz televizor tipidagi yaratilgan ob'ektga havola bilan nom bilan televizor tipidagi o'zgaruvchini o'rnatdik. Ya'ni, JVM televizor ob'ekti uchun xotirani yig'ishda ajratadi, uni va uning joylashuvi manzilini xotirada yaratadi, uni tellystekda saqlanadigan o'zgaruvchiga qo'yadi. Siz ushbu ma'ruzada xotira haqida, ya'ni stek va boshqa ko'plab foydali ma'lumotlarni o'qishingiz mumkin . Televizor tipidagi o'zgaruvchi va televizor tipidagi ob'ekt, siz payqadingizmi? Bu bejiz emas: ma'lum turdagi ob'ektlar bir xil turdagi mos o'zgaruvchilarga ega bo'lishi kerak (meros va interfeys ilovalarini hisobga olmaganda, lekin hozir biz buni hisobga olmaymiz). Axir, biz sho'rvani stakanlarga quymoqchi emasmiz, shunday emasmi? Ma'lum bo'lishicha, bizning ob'ektimiz televizor bo'lib, u uchun mos yozuvlar o'zgaruvchisi boshqaruv paneliga o'xshaydi. Ushbu masofadan boshqarish pulti yordamida biz ob'ektimiz va uning ma'lumotlari bilan o'zaro aloqada bo'lishimiz mumkin. Masalan, televizorimiz uchun xususiyatlarni o'rnating:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
Bu erda biz nuqta operatoridan .o'zgaruvchiga tegishli bo'lgan ob'ektning ichki elementlariga kirish va ulardan foydalanishni boshlash uchun foydalandik. Misol uchun, birinchi qatorda biz o'zgaruvchiga aytdik : "Bizga havola qilayotgan ob'ektning tellyichki o'zgaruvchisini bering va uni rost deb belgilang" (biz uchun televizorni yoqing).isOn

Malumot o'zgaruvchilarni qayta aniqlash

Aytaylik, bizda mos yozuvlar turidagi ikkita o'zgaruvchi va ular nazarda tutilgan ob'ektlar mavjud:
TV firstTV = new TV();
TV secondTV = new TV();
Agar yozsak:
firstTV = secondTV;
bu biz birinchi o'zgaruvchini qiymat sifatida manzilning nusxasi (manzil bitlari qiymati) ikkinchi ob'ektga tayinlaganimizni anglatadi va endi ikkala o'zgaruvchi ham ikkinchi ob'ektga ishora qiladi (boshqacha qilib aytganda, bir xil ob'ekt uchun ikkita masofadan boshqarish pulti) televizor). Shu bilan birga, birinchi ob'ekt unga tegishli o'zgaruvchisiz qoldi. Natijada, bizda kirish imkoni bo'lmagan ob'ekt bor, chunki o'zgaruvchi unga shunday shartli ip edi, usiz u axlatga aylanadi, shunchaki xotirada yotadi va joy egallaydi. Keyinchalik bu ob'ekt axlat yig'uvchi tomonidan xotiradan yo'q qilinadi . Java-da mos yozuvlar ma'lumotlar turlari - 2Siz boshqa havolasiz ob'ekt bilan bog'lovchi ipni uzishingiz mumkin:
secondTV = null;
Natijada, ob'ektga faqat bitta havola bo'ladi - firstTV, va secondTVendi hech kimga ishora qilmaydi (bu bizga kelajakda televizor kabi biron bir ob'ektga havolani belgilashimizga to'sqinlik qilmaydi).

String sinfi

Alohida, men String sinfini eslatib o'tmoqchiman . Bu satr sifatida saqlanadigan ma'lumotlarni saqlash va ular bilan ishlash uchun mo'ljallangan asosiy sinf. Misol:
String text = new String("This TV is very loud");
Bu erda biz ob'ekt konstruktorida saqlanadigan satrni o'tkazdik. Lekin hech kim buni qilmaydi. Axir, satrlarni yaratish mumkin:
String text = "This TV is very loud";
Ko'proq qulayroq, to'g'rimi? Foydalanishning mashhurligi jihatidan Stringu ibtidoiy turlardan qolishmaydi, lekin u hali ham sinf bo'lib, unga tegishli bo'lgan o'zgaruvchi ibtidoiy tur emas, balki mos yozuvlar turidir. Bizda Stringsatrlarni birlashtirishning ajoyib qobiliyati bor:
String text = "This TV" + " is very loud";
Natijada, biz yana matnni olamiz: This TV is very loud, chunki ikkita satr bir butunga birlashtiriladi va o'zgaruvchi ushbu to'liq matnga murojaat qiladi. Muhim nuance - Stringbu o'zgarmas sinf. Bu nima degani? Keling, ushbu misolni olaylik:
String text = "This TV";
text = text + " is very loud";
Hamma narsa oddiy ko'rinadi: biz o'zgaruvchini e'lon qilamiz, unga qiymat beramiz. Keyingi qatorda biz uni o'zgartiramiz. Lekin biz aslida o'zgarmaymiz. Bu o'zgarmas sinf bo'lgani uchun, ikkinchi qatorda boshlang'ich qiymat o'zgartirilmaydi, lekin o'z navbatida birinchisidan iborat yangisi yaratiladi + " is very loud".

Yo'naltiruvchi konstantalar

Ibtidoiy turlar haqidagi maqolada biz doimiylar mavzusiga to'xtaldik. Biz uni yakuniy deb e'lon qilganimizda mos yozuvlar o'zgaruvchisi qanday harakat qiladi ?
final TV telly = new TV();
Bu ob'ektni o'zgarmas qiladi deb o'ylashingiz mumkin. Lekin yo'q, bu to'g'ri emas. Java-da mos yozuvlar ma'lumotlar turlari - 3Modifikatorli mos yozuvlar o'zgaruvchisi finalma'lum bir ob'ektga bog'langan bo'ladi, uni hech qanday tarzda ajratib olish imkoniyatisiz (uni qayta aniqlang yoki ga tenglashtiring null). Ya'ni, bunday o'zgaruvchining qiymatini o'rnatgandan so'ng, quyidagi kodni kiriting:
telly = new TV();
yoki
telly = null;
kompilyatsiya xatosiga olib keladi. Ya'ni, finalu faqat havolada harakat qiladi va ob'ektning o'ziga ta'sir qilmaydi. Agar bizda dastlab o'zgaruvchan bo'lsa, biz uning ichki holatini hech qanday muammosiz o'zgartirishimiz mumkin:
telly.soundVolume = 30;
Ba'zan, o'zgaruvchilar hatto usul argumentlarida ham yakuniy sifatida belgilanadi!
public void enableTV (final TV telly){
   telly.isOn = true;
}
Bu usulni yozish jarayonida ushbu dalillarni bekor qilib bo'lmasligi va shunga mos ravishda kamroq chalkashliklarni keltirib chiqarishi uchun amalga oshiriladi. Agar biz finalo'zgarmas ob'ektga ishora qiluvchi mos yozuvlar o'zgaruvchisini belgilasak nima bo'ladi? Masalan String:
final String PASSWORD = "password";
Natijada, biz konstantani, ibtidoiy tipdagi konstantalar analogini olamiz, chunki bu erda biz havolani qayta aniqlay olmaymiz va ob'ektning ichki holatini (ichki ma'lumotlarni) o'zgartira olmaymiz.

Keling, xulosa qilaylik

  1. Oddiy o'zgaruvchilar qiymat bitlarini saqlasa, mos yozuvlar o'zgaruvchilari ob'ekt qanday olinishini ko'rsatadigan bitlarni saqlaydi.
  2. Ob'ektga havolalar faqat bitta turdagi ob'ekt uchun e'lon qilinadi.
  3. Java tilidagi har qanday sinf mos yozuvlar turi hisoblanadi.
  4. Java-dagi har qanday mos yozuvlar o'zgaruvchining standart qiymati null.
  5. Stringmos yozuvlar turining standart namunasidir. Bu sinf ham o'zgarmasdir.
  6. Modifikatorli mos yozuvlar o'zgaruvchilari finalqayta aniqlash imkoniyatisiz faqat bitta ob'ektga bog'langan.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION