1. İç içə siniflər
Yaxınlarda öyrəndiniz ki, statik dəyişənlər və statik metodlar var, amma məlum olur ki, həm də statik siniflər olur. Amma bir az uzaqdan başlayaq.
Java dilində tamamilə mümkündür ki, siniflərin içində siniflər elan edilsin. Hətta siniflərin içində olan, başqa siniflərin içində olan siniflər də. Bütün bunlar çox sadə görünür:
class XariciSinif
{
sinif dəyişənləri
sinif metodları
class DaxiliSinif
{
sinif dəyişənləri
sinif metodları
}
}
Sadəcə bir sinifi başqa bir sinifin içində elan edirik — vəssalam.
Nümunə:
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;
}
}
Daxili siniflər statik və qeyri-statik ola bilər. Statik siniflərə əlavə olaraq daxili (static nested class) adı da verilir, qeyri-statik olanlara isə sadəcə daxili siniflər (inner class) deyilir.
2. Statik siniflər
Statik daxili siniflər öz valideyn sinifindən kənarda istifadə oluna bilər. Əgər belə sinifdə public giriş modifikatoru varsa, bunu proqramın istənilən yerində istifadə etmək olar. Belə siniflər əslində adi siniflərdən heç nə ilə fərqlənmir. Amma bir neçə fərq var.
Sinif adı
Əgər siz statik daxili sinifə onun valideyn sinifindən deyil, proqramdakı başqa bir yerdən müraciət etmək istəyirsinizsə, sinif adını göstərməli olacaqsınız: bu ad valideyn sinifin adı və daxili sinifin adından ibarətdir. Bu adın ümumi forması belədir:
ValideynSinif.DaxiliSinif
Nümunələr:
Valideyn sinif | Daxili sinif | Daxili sinifin tam adı |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Əgər daxili sinifin öz daxili sinifi varsa, onların adları sadəcə nöqtə ilə birləşir.
JDK-da daxili sinifin tipik nümunəsi Entry sinifi Map sinifinin daxilindədir. Əgər siz HashMap
obyektindən elementlərin cütlük dəstini əldə etmək istəyirsinizsə, entrySet()
metodu sizə Set<Map.Entry>
tipində cüt dəstə qaytaracaq.
Bu qeydiyyat Map.Entry
— bu xarici və daxili siniflərdir.
Obyekti yaratmaq
Statik daxili sinifin obyektini yaratmaq çox asandır. Bu belə görünür:
ValideynSinif.DaxiliSinif ad = new ValideynSinif.DaxiliSinif();
Hamısı adi siniflərdə olduğu kimi, yalnız ad ikili.
Statik metodlara müraciət
Əgər statik sinifin statik metodları varsa, onlara adi siniflərin statik metodlarına müraciət etdiyi kimi müraciət etmək olar (yalnız sinifin adı indi ikilidir).
ValideynSinif.DaxiliSinif.statikMetod();
Statik dəyişənlərə müraciət
Daxili sinifin publik statik dəyişənlərinə müraciət etmək də asandır:
ValideynSinif.DaxiliSinif.statikDeyisenAdi
3. Statik siniflərin xüsusiyyətləri
Statik daxili sinifləri ən az statik adlandırmaq lazım idi. Onlar adi siniflər kimi davranır. Statik metodlardan onlara müraciət etmək üçün heç bir məhdudiyyət yoxdur.
Əgər siz daxili statik siniflə onun "valideyn" sinifinin daxilində işləyirsinizsə, onun adi sinifdən (nə daxili, nə də statik olan) fərqini ümumiyyətlə hiss etməyəcəksiniz.
Nümunə:
Daxili statik sinif Point | Adi sinif Point |
---|---|
|
|
Əgər hər hansı bir daxili statik sinifi götürüb onun valideyn sinifindən çıxarsanız, yalnız yeni sinif artıq keçmiş valideyn sinifin private static
dəyişənlərinə və metodlarına müraciət edə bilməyəcək.
Nümunə:
Daxili statik sinif Point | Adi sinif Point |
---|---|
|
|
Point
adi sinifindəki main
metodu Solution
sinifinin private static
points
dəyişəninə müraciət edə bilmir!
Bu, əslində, statik daxili sinifin adi sinifdən əsas fərqidir. Statik daxili sinif metodları öz valideyn siniflərinin bütün statik dəyişənlərinə və metodlarına, hətta onlar private
ilə işarələndikdə belə, müraciət edə bilər.
Eh, əgər bu məsələyə əhəmiyyət versək, burda təəccüblü nə var ki? private
modifikatoru açıq şəkildə deyir ki, bu modifikatorla qeyd olunan dəyişənlərə və metodlara yalnız öz sinifləri daxilindən müraciət etmək olar. Statik daxili sinif valideyn sinifin daxilində yerləşir? Bəli, onda heç bir problem yoxdur: istədiyiniz qədər müraciət edin.
GO TO FULL VERSION