Middle
Milyen típusú beágyazott osztályok léteznek?
sobes.tech MI
Válasz az MI-től
A Java-ban a beágyazott osztályok (Nested Classes) két fő típusra oszthatók:
-
Statikus beágyazott osztályok (Static Nested Classes)
- A
staticmódosítóval vannak ellátva. - Úgy viselkednek, mint a konténer osztály szokásos statikus tagjai.
- Hozzáférhetnek a külső osztály statikus tagjaihoz (még akkor is, ha privátok).
- Nincs közvetlen hozzáférésük a külső osztály nem-statikus tagjaihoz.
- Nélkül hozhatók létre példány nélkül:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- A
-
Belső osztályok (Inner Classes)
A belső osztályok nem
static-ek, és a külső osztály példányához kötöttek. Alcsoportokra oszthatók:-
Tag osztályok (Member Inner Classes)
- A konténer osztály tagjaként vannak deklarálva, de a metódusokon kívül.
- Minden külső osztály taghoz hozzáférnek, beleértve a privátokat is.
- Egy példány külső osztály példányára van szükség a példányuk létrehozásához:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Helyi osztályok (Local Classes)
- Metódusok, konstruktorok vagy inicializáló blokkok belsejében jönnek létre.
- A láthatóságuk a deklarációjukat tartalmazó blokkra korlátozódik.
- Nem lehet hozzáférési módosítókat (pl.
public,private,protected) használni. - Hozzáférhetnek a külső blokk
finalvagy effektívfinalhelyi változóihoz. - Nem használhatók a deklarációjukon kívül.
-
Névtelen osztályok (Anonymous Classes)
- Gyakorlatilag névtelen helyi osztályok.
- Egyidejűleg deklarálják és példányosítják őket.
- Absztrakt osztály vagy interfész "éles" megvalósítására használják.
- Hasonlóan a helyi osztályokhoz, hozzáférnek a
finalvagy effektívfinalhelyi változókhoz a külső blokkban.
Példaszerkezet:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statikus beágyazott osztály
static class StaticNestedClass {
void accessOuter() {
// Hozzáférhet a külső osztály statikus tagjaihoz
int value = staticOuterField;
// Nem férhet hozzá a nem-statikus tagokhoz
// int value2 = outerField; // Fordítási hiba
}
}
// Tag osztály (Belső osztály)
class MemberInnerClass {
void accessOuter() {
// Hozzáférhet minden külső osztály taghoz
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // effektív final
// Helyi osztály
class LocalClass {
void accessOuter() {
// Hozzáférhet a külső osztály tagjaihoz és a helyi final/effectively final változókhoz
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Névtelen osztály (Runnable interfész megvalósítása)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Hozzáférhet a külső osztály tagjaihoz és a helyi final/effectively final változókhoz
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}