— Demak, mavzu raqami ikki – ichki klasslar.
Ichki klass e'lon qilishdan oldin biz static kalit so'zini qo'yishimiz mumkin, shunda ichki klass ichiga kiradi.
Keling, static so'zi ichki klass e'lon qilish bilan yonma-yon nima anglatishini tushunaylik. Siz nima deb o'ylaysiz?
— Agar o'zgaruvchi statik deb e'lon qilingan bo'lsa, u yagona nusxada mavjud, agar ichki klass – statik bo'lsa, bunday klassdan faqat bitta ob'yekt yaratilishi mumkinmi?
— Static kalit so'zi sizni bu yerda adashtirmasin. Agar o'zgaruvchi statik deb e'lon qilingan bo'lsa, u yagona nusxada mavjud – bu to'g'ri. Lekin statik ichki klass bu jihatdan statik metodga ko'proq o'xshaydi. Statik so'zi klass e'lon qilishdan oldin, ushbu klass tashqi klassning ob'yektlariga referenslar saqlamasligini bildiradi, u qaysi ichida e'lon qilingan.
— Ha-ha. Oddiy metodlar siri bilan ob'yektga referens saqlaydi, ammo statiklari – yo'q. Shu ham statik klasslar bilan, to'g'rimi, Elli?
— Mutlaqo to'g'ri. Sizning sezgirligingiz juda maqtovga sazovor. Statik ichki klasslar o'zlari e'lon qilingan tashqi klass ob'yektlariga maxfiy referenslarga ega emas.
class Zoo
{
private static int count = 7;
private int mouseCount = 1;
public static int getAnimalCount()
{
return count;
}
public int getMouseCount()
{
return mouseCount;
}
public static class Mouse { public Mouse() { } public int getTotalCount() { return count + mouseCount; //kompilyatsiya xatosi. } }
}
Kelin, bu misolga diqqat bilan qaraylik.
Statik metod getAnimalCount qaysi o'zgaruvchilarga murojaat qilishi mumkin?
— Faqat statiklarga. Axir bu statik metod.
Metod getMouseCount qaysi o'zgaruvchilarga murojaat qilishi mumkin?
— Ham statiklarga, ham nostatiklarga. U Zoo tipidagi ob'yektga referensi (this) maxfiy saqlaydi.
— To'g'ri. Mana, statik ichki klass Mouse, statik metod kabi, Zoo klassining statik o'zgaruvchilariga murojaat qilishi mumkin, lekin nostatiklarga murojaat qila olmaydi.
Biz Zoo klassining bitta ham ob'yekti yaratilmagan bo'lsa ham, Mouse klassining ob'yektlarini erkin yaratishimiz mumkin. Buni qanday qilish mumkin:
class Home
{
public static void main(String[] args)
{
Zoo.Mouse mouse = new Zoo.Mouse();
}
}
Aslida Mouse klassi – bu oddiy klass. Zoo klassining ichida e'lon qilinganligi sababli, unga ikki xususiyat bor.
1) Tashqi ota-klassdan tashqarida ichki klass (Mouse klassi kabi) ob'yektlarini yaratishda, nuqta orqali tashqi klassning nomini ham ko'rsatish kerak.
Masalan: Zoo.Mouse.
2) Zoo.Mouse klassi va uning ob'yektlari Zoo klassining private static o'zgaruvchilari va metodlariga kirish huquqiga ega (Mouse klassi ham Zoo klassining ichida e'lon qilingan).
Bugun shuncha.
— Ya'ni, faqat qo'shimcha nom va tamom?
Ha.
— Bu dastlab ko'ringandan ko'ra osonroq ekan.
GO TO FULL VERSION