Middle
Hansı daxili sinif növləri mövcuddur?
sobes.tech Süni İntellekt
AI-dan cavab
Java-da Nested Classes (Daxili Siniflər) iki əsas növə bölünür:
-
Statik Daxili Siniflər (Static Nested Classes)
staticmodifieri ilə işarələnmişdir.- Adətən konteyner sinifinin statik üzvləri kimi davranır.
- Xarici sinifin statik üzvlərinə daxil ola bilər (hətta onlar özəl olsa belə).
- Xarici sinifin qeyri-statik üzvlərinə birbaşa daxil ola bilməz.
- Xarici sinif nümunəsi olmadan yaradılır:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
-
Daxili Siniflər (Inner Classes)
Daxili siniflər
staticilə işarələnmir və xarici sinif nümunəsinə bağlıdırlar. Onlar aşağıdakı alt növlərə bölünür:-
Üzv Daxili Siniflər (Member Inner Classes)
- Konteyner sinifinin üzv səviyyəsində elan edilir, amma metodların xaricində.
- Xarici sinifin bütün üzvlərinə daxil ola bilər, o cümlədən özəl olanlara.
- Öz nümunəsini yaratmaq üçün xarici sinif nümunəsi tələb olunur:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Yerli Siniflər (Local Classes)
- Metodlar, konstruktörlər və ya inisialisasiya blokları daxilində yaradılır.
- Görünüş sahəsi elan olunduğu blokla məhdudlaşır.
- Giriş modifikatorları (
public,private,protected) ilə elan edilə bilməz. - Xarici blokun
finalvə ya effektivfinalolan yerli dəyişənlərinə daxil ola bilər. - Təyin olunduğu blok xaricində istifadə edilə bilməz.
-
Anonim Siniflər (Anonymous Classes)
- Əslində, adı olmayan yerli siniflərdir.
- Eyni zamanda elan edilir və nümunə alınır.
- Abstrakt sinfi və ya interfeysi "canlı" olaraq həyata keçirmək üçün istifadə olunur.
- Yerli siniflər kimi, xarici blokun
finalvə ya effektivfinalyerli dəyişənlərinə daxil ola bilər.
Struktur nümunəsi:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statik daxili sinif
static class StaticNestedClass {
void accessOuter() {
// Xarici sinifin statik üzvlərinə daxil ola bilər
int value = staticOuterField;
// Xarici sinifin qeyri-statik üzvlərinə daxil ola bilməz
// int value2 = outerField; // Yığım xətası
}
}
// Üzv daxili sinif
class MemberInnerClass {
void accessOuter() {
// Bütün xarici sinif üzvlərinə daxil ola bilər
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // effektiv final
// Yerli sinif
class LocalClass {
void accessOuter() {
// Xarici sinif üzvlərinə və yerli final/effectively final dəyişənlərə daxil ola bilər
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Anonim sinif (Runnable interfeysini həyata keçirən)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Xarici sinif üzvlərinə və yerli final/effectively final dəyişənlərə daxil ola bilər
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}