Salom! Siz allaqachon ibtidoiy turlar bilan yaxshi tanishsiz va ular bilan ko'p ishlagansiz.
Dasturlashda, 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
int
satrga aylantira olmaysiz. Ammo o'rash sinfi bilan
Integer
bu 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,
int
biz 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/Float
Usullaringizni 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
b
ham 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.
true
Ba'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,
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;
y = x * 123;
}
}
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 int
va Integer
aslida 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);
}
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);
}
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
:
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
GO TO FULL VERSION