JavaRush /Java blogi /Random-UZ /O'rash, ochish va qadoqlash

O'rash, ochish va qadoqlash

Guruhda nashr etilgan
Salom! Siz allaqachon ibtidoiy turlar bilan yaxshi tanishsiz va ular bilan ko'p ishlagansiz. O'rash, ochish va qadoqlash - 1Dasturlashda, xususan, Java-da ibtidoiylar juda ko'p afzalliklarga ega: ular kam xotirani egallaydi va shu bilan dastur samaradorligini oshiradi va qiymatlar diapazonlariga aniq bo'linadi. Biroq, Java-ni o'rganish jarayonida biz bir necha marta takrorladik, xuddi mantra kabi, " Javada hamma narsa ob'ektdir ". Ammo ibtidoiy so'zlar bu so'zlarni to'g'ridan-to'g'ri rad etadi. Ular ob'ektlar emas. Xo'sh, "hamma narsa ob'ektdir" tamoyili noto'g'ri? Unchalik emas. Java-da har bir ibtidoiy tip o'zining egizak ukasi, o'rash sinfiga ( Wrapper) ega. O'ram nima? O'ram - bu primitivning qiymatini o'zida saqlaydigan maxsus sinf. Ammo bu sinf bo'lgani uchun u o'z misollarini yaratishi mumkin. Ular haqiqiy ob'ektlar bo'lgan holda kerakli ibtidoiy qiymatlarni o'z ichiga oladi. O'rash sinflarining nomlari mos keladigan ibtidoiylarning nomlariga juda o'xshash yoki ular bilan to'liq mos keladi. Shuning uchun ularni eslab qolish juda oson bo'ladi.
Primitiv ma'lumotlar turlari uchun o'rash sinflari
Primitiv ma'lumotlar turlari O'rash sinflari
int Butun son
qisqa Qisqa
uzoq Uzoq
bayt Bayt
suzmoq Float
ikki barobar Ikki marta
char Xarakter
mantiqiy Mantiqiy
Wrapper sinfi ob'ektlari xuddi boshqa har qanday kabi yaratilgan:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
O'rash sinflari ibtidoiy turlarning kamchiliklarini yumshatishga imkon beradi. Eng aniq biri shundaki, ibtidoiylarning usullari yo'q . Misol uchun, ular usuli yo'q toString(), shuning uchun siz, masalan, raqamni intsatrga aylantira olmaysiz. Ammo o'rash sinfi bilan Integerbu oson.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
Teskari konvertatsiya qilishda ham qiyinchiliklar bo'ladi. Aytaylik, bizda aniq biladigan qator bor, unda raqam bor. Biroq, ibtidoiy tipda, intbiz bu raqamni satrdan olib, uni, aslida, raqamga aylantira olmaymiz. Ammo o'rash darslari tufayli bizda bunday imkoniyat mavjud.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
Chiqish: 1166628 Biz qatordan raqamni muvaffaqiyatli oldik va uni mos yozuvlar oʻzgaruvchisiga tayinladik Integer i. Aytgancha, havolalar haqida. Parametrlar usullarga turli yo'llar bilan uzatilishini allaqachon bilasiz: ibtidoiy qiymatlar qiymat bo'yicha, ob'ektlar esa havola orqali uzatiladi. Double/FloatUsullaringizni yaratishda siz ushbu bilimlardan foydalanishingiz mumkin: agar sizning usulingiz, masalan, kasr sonlar bilan ishlayotgan bo'lsa, lekin sizga mos yozuvlar bo'yicha o'tish mantig'i kerak bo'lsa, o'rniga parametrlarni usulga o'tkazishingiz mumkin double/float. Bundan tashqari, usullardan tashqari, o'rash sinflari foydalanish uchun juda qulay bo'lgan statik maydonlarga ega. Misol uchun, siz hozir vazifaga duch kelganingizni tasavvur qiling: konsolga maksimal mumkin bo'lgan raqamni int, keyin esa minimal mumkin bo'lgan raqamni chop eting. Vazifa oddiy bo'lib tuyuladi, ammo baribir Googlesiz buni qila olmaysiz. Va o'rash sinflari sizga quyidagi "kundalik muammolarni" osongina hal qilishga imkon beradi:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
Bunday maydonlar sizni jiddiyroq vazifalardan chalg'itmaslikka imkon beradi. 2147483647 raqamini chop etish jarayonida (bu aniq MAX_VALUE) uni noto'g'ri yozish ajablanarli emasligini aytmasa ham bo'ladi :) Bundan tashqari, avvalgi ma'ruzalardan birida biz allaqachon e'tiborni o'rash sinflari ob'ektlariga qaratgan edik. o'zgarmasdir .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
Chiqish: 0 Malumot dastlab ko'rsatgan ob'ekt аo'z holatini o'zgartirmagan, aks holda qiymat bham o'zgargan bo'lar edi. dagi kabi String, o'rash ob'ektining holatini o'zgartirish o'rniga, xotirada butunlay yangi ob'ekt yaratiladi. Nima uchun Java yaratuvchilari oxir-oqibat tilda ibtidoiy turlarni saqlashga qaror qilishdi? Hamma narsa ob'ekt bo'lishi kerak va bizda ibtidoiylar ifodalagan hamma narsani ifodalash uchun ishlatilishi mumkin bo'lgan o'rash sinflari mavjud ekan, nega ularni faqat tilda qoldirib, ibtidoiylarni olib tashlamaslik kerak? Javob oddiy - ishlash. Ibtidoiy turlar ibtidoiy deb ataladi, chunki ular ob'ektlarning ko'plab "og'ir" xususiyatlaridan mahrum. Ha, ob'ektda juda ko'p qulay usullar mavjud, ammo ular har doim ham kerak emas. trueBa'zan sizga 33 raqami yoki 2,62 yoki / qiymati kerak bo'ladi false. Ob'ektlarning barcha afzalliklari ahamiyatsiz va dastur ishlashi uchun kerak bo'lmagan holatlarda, ibtidoiylar ancha yaxshi ish qiladi.

Avtomatik qadoqlash/avtomatik ochish

Java tilidagi primitivlar va ularning oʻrash sinflarining xususiyatlaridan biri bu autoboxing/autounboxing.Keling, O'rash, ochish va qadoqlash - 2 ushbu tushunchani tushunib olaylik. Siz va men allaqachon bilib olganimizdek, Java ob'ektga yo'naltirilgan tildir. Demak, Java tilida yozilgan barcha dasturlar obyektlardan tashkil topgan. Primitivlar ob'ekt emas. Biroq, o'rash sinfi o'zgaruvchisiga ibtidoiy turdagi qiymat tayinlanishi mumkin. Bu jarayon autoboxing deb ataladi . Xuddi shu tarzda, ibtidoiy tipdagi o'zgaruvchiga o'rash sinfining ob'ekti tayinlanishi mumkin. Bu jarayon autounboxing deb ataladi . Masalan:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
5-qatorda biz ibtidoiy x ga o'rash sinfining ob'ekti bo'lgan y qiymatini beramiz Integer. Ko'rib turganingizdek, buning uchun qo'shimcha harakatlar kerak emas: kompilyator buni biladi intva Integeraslida bir xil . Bu avtomatik ochish. Xuddi shu narsa 6-qatordagi avtoboks bilan sodir bo'ladi: y ob'ektiga ibtidoiy qiymatlar osongina beriladi (x * 123). Bu avtomatik qadoqlashning namunasidir. Shuning uchun "avto" so'zi qo'shilgan: ularning o'rash sinflari ob'ektlariga ibtidoiy havolalarni belgilash uchun (va aksincha) siz hech narsa qilishingiz shart emas, hamma narsa avtomatik ravishda sodir bo'ladi . Qulay, to'g'rimi? :) Avtomatik qadoqlash/avtomatik ochishning yana bir juda katta qulayligi usullarning ishlashida namoyon bo'ladi. Haqiqat shundaki, usul parametrlari ham autopacking va autounpackingga bo'ysunadi . Va, masalan, agar ulardan biri kirish sifatida ikkita ob'ektni olsa Integer, biz u erda oddiy ibtidoiylarni osongina o'tkazishimiz mumkin int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
Natija: Siz 7 raqamini kiritdingiz. U aksincha ishlaydi:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
Esda tutish kerak bo'lgan muhim nuqta: massivlar uchun autoboxing va unboxing ishlamaydi !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
Ob'ektlar massivini kirish sifatida qabul qiladigan usulga primitivlar massivini o'tkazishga urinish kompilyatsiya xatosiga olib keladi. Va nihoyat, keling, yana bir bor ibtidoiy va primitivlarni qisqacha taqqoslaylik :
  • ishlash ustunligiga ega
O'ramlar:
  • Ular sizga "hamma narsa ob'ektdir" tamoyilini buzmaslikka imkon beradi, shunda raqamlar, belgilar va mantiqiy qiymatlar haqiqiy / noto'g'ri tushunchadan tashqariga chiqmaydi.
  • Qulay usullar va maydonlarni taqdim etish orqali ushbu qiymatlar bilan ishlash qobiliyatini kengaytiring
  • Ba'zi bir usul faqat ob'ektlar bilan ishlashi mumkin bo'lganda kerak
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION