Middle
Aké druhy vnorených tried existujú?
sobes.tech AI
Odpoveď od AI
Vnorené triedy (Nested Classes) v Jave sa delia na dva hlavné typy:
-
Statické vnorené triedy (Static Nested Classes)
- Označené modifikátorom
static. - Správajú sa ako bežné statické členy triedy-obalu.
- Môžu pristupovať k statickým členom vonkajšej triedy (aj keď sú súkromné).
- Nemajú priame prístup k nestatickým členom vonkajšej triedy.
- Sú vytvorené bez inštancie vonkajšej triedy:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- Označené modifikátorom
-
Vnorené triedy (Inner Classes)
Vnorené triedy nie sú označené
statica sú spojené s inštanciou vonkajšej triedy. Delenia na:-
Členové triedy (Member Inner Classes)
- Deklarované na úrovni člena triedy-obalu, ale mimo jej metód.
- Majú prístup ku všetkým členom vonkajšej triedy, vrátane súkromných.
- Vyžadujú inštanciu vonkajšej triedy na vytvorenie vlastnej inštancie:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Lokálne triedy (Local Classes)
- Vytvárajú sa v rámci metód, konštruktorov alebo inicializačných blokov.
- Rozsah ich platnosti je obmedzený na blok, v ktorom sú deklarované.
- Nemôžu byť deklarované s prístupovými modifikátormi (
public,private,protected). - Môžu pristupovať k
finalalebo efektívnefinallokálnym premenným vonkajšieho bloku. - Nemôžu byť použité mimo bloku, v ktorom sú definované.
-
Nevnorené triedy (Anonymous Classes)
- V podstate ide o lokálne triedy bez mena.
- Deklarujú sa a inštancujú súčasne.
- Používajú sa na implementáciu abstraktnej triedy alebo rozhrania "na mieste".
- Rovnako ako lokálne triedy, majú prístup k
finalalebo efektívnefinallokálnym premenným vonkajšieho bloku.
Príklad štruktúry:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statická vnorená trieda
static class StaticNestedClass {
void accessOuter() {
// Môže sa odvolávať na statické členy vonkajšej triedy
int value = staticOuterField;
// Nemôže sa odvolávať na nestatické členy vonkajšej triedy
// int value2 = outerField; // Chyba kompilácie
}
}
// Členová trieda (Vnorená trieda)
class MemberInnerClass {
void accessOuter() {
// Môže sa odvolávať na všetky členy vonkajšej triedy
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // efektívne final
// Lokálna trieda
class LocalClass {
void accessOuter() {
// Môže sa odvolávať na členy vonkajšej triedy a lokálne final/efektívne final premenné
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Nevnořená trieda (implementujúca rozhranie Runnable)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Môže sa odvolávať na členy vonkajšej triedy a lokálne final/efektívne final premenné
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}