Middle
Koje vrste ugnježdenih klasa postoje?
sobes.tech АИ
Одговор од АИ
Ugnježdene klase (Nested Classes) u Javi se dele na dva osnovna tipa:
-
Statičke ugnježdene klase (Static Nested Classes)
- Obeležene su modifikatorom
static. - Ponašaju se kao obični statički članovi klase-omotača.
- Mogu pristupati statičkim članovima spoljne klase (čak i ako su privatni).
- Nemaju direktan pristup nestatičkim članovima spoljne klase.
- Kreiraju se bez instance spoljne klase:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- Obeležene su modifikatorom
-
Unutrašnje klase (Inner Classes)
Unutrašnje klase nisu označene
statici povezane su sa instancom spoljne klase. One se dele na:-
Član- klase (Member Inner Classes)
- Deklariraju se na nivou člana klase-omotača, ali van njenih metoda.
- Imaju pristup svim članovima spoljne klase, uključujući privatne.
- Za njihovo kreiranje je potrebna instanca spoljne klase:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Lokalne klase (Local Classes)
- Kreiraju se unutar metoda, konstruktora ili inicijalizacionih blokova.
- Opseg njihove vidljivosti je ograničen na blok u kojem su deklarisane.
- Ne mogu biti deklarisane sa pristupnim modifikatorima (
public,private,protected). - Mogu pristupati
finalili efektivnofinallokalnim promenljivima spoljnog bloka. - Ne mogu se koristiti van bloka u kojem su definisane.
-
Anonimne klase (Anonymous Classes)
- U suštini, to su lokalne klase bez imena.
- Deklarišu se i instanciraju istovremeno.
- Koriste se za implementaciju apstraktne klase ili interfejsa "na licu mesta".
- Kao i lokalne klase, imaju pristup
finalili efektivnofinallokalnim promenljivima spoljnog bloka.
Primer strukture:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statička ugnježdena klasa
static class StaticNestedClass {
void accessOuter() {
// Može pristupati statičkim članovima spoljne klase
int value = staticOuterField;
// Ne može pristupati nestatičkim članovima spoljne klase
// int value2 = outerField; // Greška pri kompajliranju
}
}
// Član- klasa (Unutrašnja klasa)
class MemberInnerClass {
void accessOuter() {
// Može pristupati svim članovima spoljne klase
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // efektivno final
// Lokalna klasa
class LocalClass {
void accessOuter() {
// Može pristupati članovima spoljne klase i lokalnim final/efektivno final promenljivima
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Anonimna klasa (koja implementira interfejs Runnable)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Može pristupati članovima spoljne klase i lokalnim final/efektivno final promenljivima
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}