— Salom, Amigo!
— Salom, Elli!
— Bugun juda qiziqarli mavzu bo'ladi. Bugun men ichki klasslar haqida gapirib beraman.
Agar bir klassni boshqa klass ichida e'lon qilsak, u holda bunday klass ichki klass deb ataladi.
Ichki klasslarning obyektlari tashqi klasslar obyektlariga joylashtiriladi va tashqi klasslar o'zgaruvchilariga murojaat qilishlari mumkin.
public class Car
{
int height = 160;
ArrayList doors = new ArrayList();
public Car
{
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
}
class Door()
{
public int getDoorHeight()
{
return (int)(height * 0.80);
}
}
}
Diqqat qil, Door (eshik) klassida getDoorHeight metod bor, u eshikning balandligini qaytaradi va Car obyektining height o'zgaruvchisidan foydalanadi.
Door turidagi obyekt Car turidagi obyekt bilan birga mavjud bo'lolmaydi – axir u uning o'zgaruvchilaridan foydalanadi. Kompilyator sezilmasdan Door klassining konstruktoriga va klassining ichiga Car tashqi klassining obyektiga ishora qo'shadi, shunda Door ichki klassining metodlari tashqi klass Car metodlar va o'zgaruvchilariga murojaat qila oladi.
— Ichki obyektlar. Hammasi tushunarli. Rasmga qaraganda barchasi juda oddiy.
— Shunday. Faqat bir nechta nozik jihatlar bor.
Ichki Door klassida Car obyekti uchun ishora mavjud, shuning uchun:
1) Door obyektini Car klassining statik metodida yaratish mumkin emas: Door turidagi konstruktoriga noaniq tarzda uzatiladigan Car turidagi obyektni olishning imkoniyati yo'q.
| To'g'ri | Noto'g'ri |
|---|---|
|
|
2) Door klassi statik o'zgaruvchilar va metodlarni o'z ichiga olmaydi.
| To'g'ri | Noto'g'ri |
|---|---|
|
|
— Agar menga barcha Door obyektlari uchun umumiy o'zgaruvchi kerak bo'lsa-chi?
Sen har doim uni Car klassida e'lon qilishing mumkin – bu Car obyektiga joylashtirilgan barcha Door obyektlari uchun umumiy o'zgaruvchi bo'ladi.
3) E'tibor bering, agar ichki klass public deb e'lon qilingan bo'lsa, uning obyektlari tashqi klassdan tashqarida yaratilishi mumkin, lekin tashqi klass obyekti mavjud bo'lishi shart:
Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().new Door();
4) Va yana bir eslatma – deyarli unutib qoldim.
Chunki bizda ikki ichki obyekt bor, ichki obyektning metodlarida this uchun ikkita qoʻlga kiritish mavjud:
public class Car
{
int width, height;
public class Door
{
int width, height;
public void setHeight(int height)
{
this.height = height;
}
public int getHeight()
{
if (height!=0)
return this.height;
else
return (int)(Car.this.height * 0.8);
}
}
}
Men maxsus holatda ikki klassda bir xil nomli o'zgaruvchilarni e'lon qildim.
Tashqi klassning o'zgaruvchisiga murojaat qilish uchun, u yashiringanida yoki tashqi klassning this o'zgaruvchisiga murojaat qilish uchun, shunchaki "klass nomi" nuqta this ni yozish kifoya:
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this
— Agarda biz ichki klass metodida this yozsa, bu this ichki klassga tegishli bo'ladi?
— Ha. Aynan shunday.
Ichki klasslar haqida nima deysan, Amigo?
— Juda qiziq. Men unchalik qiyin deb aytmagan bo'lardim.
Ko'p cheklovlar bor, lekin ular juda mantiqiy, sen menga ularga asos bo'lgan narsalarni tushuntirganingda, hammasi tushunarli bo'ldi.
Men ikki oydan beri amaliyotda uzluksiz ichki klasslar yozaman va endi nimani aynan yozayotganimni tushunib oldim.
Ajoyib dars uchun rahmat, Elli.
— Sen yoqtirgandan xursandman, Amigo.
GO TO FULL VERSION