1. Daxili Siniflər
Yaxın zamanda öyrəndiniz ki, statik dəyişənlər və statik metodlar mövcuddur, amma məlum olur ki, statik siniflər də varmış. Amma gəlin bir az da uzaqdan başlayaq.
Java dilində sinifləri başqa siniflərin içində də elan etmək mümkündür. Hətta siniflərin içindəki siniflərdə də siniflər elan edə bilərsiniz. Bu çox sadə görünür:
class XariciSinif
{
sinif dəyişənləri
sinif metodları
class DaxiliSinif
{
sinif dəyişənləri
sinif metodları
}
}
Bir sinifi digərinin 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ə ya statik olmayan ola bilir. Statik siniflərə başqa cür quraşdırılmış (static nested class) deyirlər, statik olmayanlar isə sadəcə daxili siniflər adlanır (inner class).
2. Statik Siniflər
Statik quraşdırılmış sinifləri öz analıq sinifindən kənarda da istifadə etmək olar. Belə bir sinifin public giriş modifikatoru varsa, onu proqramın istənilən yerində istifadə etmək olar. Belə siniflər faktiki olaraq adi siniflərdən heç nə ilə fərqlənmir. Ancaq bir neçə fərqlər var.
Sinifin adı
Statik quraşdırılmış sinifə öz analıq sinifindən deyil, proqramda başqa bir yerdən müraciət etmək istəyirsinizsə, sinifin adını göstərməlisiniz: o, sinifin analıq sinifinin adı və quraşdırılmış sinifin adı ilə formalaşır. Adın ümumi görünüşü belədir:
AnaSinif.QuraşdırılmışSinif
Nümunələr:
Analıq sinif | Quraşdırılmış sinif | Quraşdırılmış sinifin tam adı |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Əgər quraşdırılmış sinifdə öz quraşdırılmış sinifi varsa, onların adları sadəcə nöqtə ilə birləşdirilir.
JDK-da quraşdırılmış sinifin tipik nümunəsi — bu Entry sinifi Map sinifinin içindəki sinifdir. Əgər HashMap
obyektindən cüt elementlər dəstini almaq istəyirsinizsə, entrySet()
metodu sizə Set<Map.Entry>
tipindən cüt dəsti qaytaracaq.
Bu Map.Entry
yazısı — bu xarici və daxili siniflərdir.
Obyektin yaradılması
Statik quraşdırılmış sinifin obyektini yaratmaq çox asandır. Bu belə görünür:
AnaSinif.QuraşdırılmışSinif ad = new AnaSinif.QuraşdırılmışSinif();
Hamısı adi siniflərdə olduğu kimi, sadəcə ad ikiqatdır.
Statik metodlara müraciət
Əgər statik sinifdə statik metodlar varsa, onlara adi siniflərin statik metodlarına müraciət etdiyiniz kimi müraciət edə bilərsiniz (sadəcə sinifin adı ikiqatdır).
AnaSinif.QuraşdırılmışSinif.statikMetod();
Statik dəyişənlərə müraciət
Quraşdırılmış sinifin publik statik dəyişənlərinə müraciət etmək də asandır:
AnaSinif.QuraşdırılmışSinif.statikDəyişənAdı
3. Statik Siniflərin Xüsusiyyətləri
Statik daxili siniflər ən az statik adlandırıla bilərdi. Onlar adi siniflər kimi davranırlar. Statik olmayan metodlardan onlara müraciətə heç bir məhdudiyyət yoxdur.
Əgər siz analıq sinifin içində daxili statik siniflə işləyirsinizsə, heç bir fərq görməyəcəksiniz, sanki həmin daxili sinif adi bir sinif olsaydı (nə quraşdırılmış, nə də statik).
Nümunə:
Daxili statik sinif Point | Adi sinif Point |
---|---|
|
|
Əgər siz hansısa quraşdırılmış statik sinifi onun analıq sinifindən çıxarsanız, yeganə dəyişiklik bu olacaq ki, yeni sinif private static
dəyişənlərinə və keçmiş analıq sinifinin metodlarına müraciət edə bilməyəcək.
Nümunə:
Daxili statik sinif Point | Adi sinif Point |
---|---|
|
|
Method main
adi Point
sinifində müraciət edə bilmir private static
dəyişən points
sinifdə Solution
!
Bu, əslində, quraşdırılmış statik sinifin adi sinifdən əsas fərqidir. Quraşdırılmış statik sinifin metodları öz analıq sinifinin bütün statik dəyişənlərinə və metodlarına müraciət edə bilir, hətta onlar private
olaraq elan edilsə belə.
Əgər dərindən baxsaq, burada nə təəccüblü var ki? Private
modifikatoru xüsusi olaraq bildirir ki, bu modifikator ilə müəyyən edilmiş dəyişənlərə və metodlara yalnız onların sinifinin içərisindən müraciət etmək olar. Daxili statik sinif analıq sinifin içərisindədir? Bəli, onda heç bir problem yoxdur: nə qədər istəyirsiniz müraciət edin.
GO TO FULL VERSION