1. Ichki sinflar
Yaqinda siz statik o'zgaruvchilar va statik metodlar haqida o'rgandingiz, lekin, ma'lum bo'lishicha, statik sinflar ham bor ekan. Lekin avval boshdan boshlaylik.
Java tilida hech qanday muammo yo'q: sinfni ichida boshqa sinflarni e'lon qilish mumkin. Hatto sinflar ichida sinflar, ular ichida boshqa sinflar ham mumkin. Bu juda oddiy ko'rinadi:
class TashqiClass
{
klass o'zgaruvchilari
klass metodlari
class IchkiClass
{
klass o'zgaruvchilari
klass metodlari
}
}
Bir sinfni boshqasining ichida e'lon qilamiz — va hammasi shu.
Misol:
public class Solution
{
static ArrayList<Point> points = new ArrayList<Point>();
public static void main(String[] args)
{
Point point = new Point();
point.x = 100;
point.y = 200;
points.add(point);
}
static class Point
{
int x;
int y;
}
}
Ichki sinflar statik va statik bo'lmagan bo'lishi mumkin. Statik sinflar kiritilgan sinflar (static nested class) deb ham ataladi, statik bo'lmaganlar esa shunchaki ichki sinflar (inner class) deyiladi.
2. Statik sinflar
Statik kiritilgan sinflardan ularning asosiy sinfidan tashqarida ham foydalanish mumkin. Agar bunday sinfda public kirish modifikatori bo'lsa, uni dasturda istalgan joyda ishlatish mumkin. Bunday sinflar aslida oddiy sinflardan farq qilmaydi. Lekin bir nechta farqlar bor.
Sinf nomi
Agar siz statik kiritilgan sinfga uning ota-sinfidan emas, balki dasturda boshqa joydan murojaat qilmoqchi bo'lsangiz, siz sinf nomini ko'rsatishingiz kerak bo'ladi: bu ota-sinf nomi va kiritilgan sinf nomidan iborat. Bu nomning umumiy ko'rinishi quyidagicha:
OtaClass.KiritilganClass
Misollar:
| Ota sinf | Kiritilgan sinf | Kiritilgan sinfning to'liq nomi |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Agar kiritilgan sinfda o'zining kiritilgan sinfi bo'lsa, ularning ismlari shunchaki nuqta orqali birlashadi.
JDKdagi kiritilgan sinfning tipik misoli — bu Map sinfi ichidagi Entry sinfi. Agar siz HashMap ob'ektidan juftliklar to'plamini olishni xohlasangiz, entrySet() metodi sizga Set<Map.Entry> tipidagi juftliklar to'plamini qaytaradi.
Mana bu Map.Entry yozuvi — bu tashqi va ichki sinflar.
Ob'ekt yaratish
Statik kiritilgan sinf ob'ektini yaratish juda oson. Bu quyidagicha ko'rinadi:
OtaClass.KiritilganClass nom = new OtaClass.KiritilganClass();
Hammasi xuddi oddiy sinflar bilan bir xil, faqat ism ikki marta yoziladi.
Statik metodlarga murojaat qilish
Agar statik sinfda statik metodlar mavjud bo'lsa, ularga murojaat qilish oddiy sinfning statik metodlariga murojaat qilish kabi, faqat endi sinf nomi ikki marta yozilgan.
OtaClass.KiritilganClass.statikMethod();
Statik o'zgaruvchilarga murojaat qilish
Kiritilgan sinfning jamoat statik o'zgaruvchilariga murojaat qilish ham oson:
OtaClass.KiritilganClass.statikO'zgaruvchiIsmi
3. Statik sinflarning xususiyatlari
Statik ichki sinflarni eng kam statik deb atash kerak edi. Ular oddiy sinflar kabi juda o'xshash harakat qiladi. Ularga statik bo'lmagan metodlardan murojaat qilishda hech qanday cheklovlar yo'q.
Agar siz ichki statik sinf bilan uning ota-sinfi ichida ishlaydigan bo'lsangiz, bu ichki sinf oddiy sinf (na kiritilgan, na statik) bo'lganida qanday farq borligini sezmaysiz.
Misol:
| Ichki statik sinf Point | Oddiy sinf Point |
|---|---|
|
|
Agar siz qandaydir kiritilgan statik sinfni olib, uni uning ota-sinfindan tashqariga chiqarsangiz, faqatgina yangi sinf private static o'zgaruvchilariga va sobiq ota-sinfning metodlariga murojaat qila olish qobiliyatini yo'qotadi.
Misol:
| Ichki statik sinf Point | Oddiy sinf Point |
|---|---|
|
|
Oddiy Point sinfidagi main metodi murojaat qila olmaydi private static points o'zgaruvchisiga Solution sinfida!
Bu, aslida, asosiy farqi kiritilgan statik sinfdan oddiy sinf. Kiritilgan statik sinfning metodlari ota-sinfining barcha statik o'zgaruvchilari va metodlariga, hatto ular private bo'lsa ham, ega bo'lish imkoniyatiga ega.
Yana ifodalash kerak bo'lsa, unda bunda ajablanarli nima bor? private modifikatori to'g'ridan-to'g'ri o'zgaruvchilar va metodlarga, ushbu modifikator bilan belgilangan, faqat ularning ichki sinfidagi kirish mumkinligini aytadi. Ichki statik sinf ota-sinfning ichida joylashganmi? Ha, unda hech qanday muammo yo'q: qancha xohlasangiz, shuncha murojaat qiling.
GO TO FULL VERSION