Middle
Kādi ir iekšējo klasu veidi?
sobes.tech AI
Atbilde no AI
Java iekšējās klases (Nested Classes) galvenokārt ir sadalītas divos galvenajos tipos:
-
Statiskās iekšējās klases (Static Nested Classes)
- atzīmētas ar
staticmodifikatoru. - uzvedas kā parasti statiski klases locekļi.
- var piekļūt ārējās klases statiskajiem locekļiem (pat ja tie ir privāti).
- tieši nevar piekļūt ārējās klases nestatiskajiem locekļiem.
- tiek izveidotas bez ārējās klases eksemplāra:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- atzīmētas ar
-
Iekšējās klases (Inner Classes)
Iekšējās klases nav atzīmētas ar
staticun ir saistītas ar ārējās klases eksemplāru. Tās iedala:-
Členklases (Member Inner Classes)
- deklarētas kā ārējās klases locekļi, bet ārpus tās metožu robežām.
- piekļūst visiem ārējās klases locekļiem, ieskaitot privātos.
- prasa ārējās klases eksemplāru:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Vietējās klases (Local Classes)
- tiek izveidotas metožu, konstruktoru vai inicializācijas bloku iekšienē.
- to redzamības ir ierobežota ar to bloku.
- nevar deklarēt ar piekļuves modifikatoriem (
public,private,protected). - var piekļūt
finalvai efektīvifinalvietējiem mainīgajiem ārējā bloka ietvaros. - nevar izmantot ārpus tā bloka, kur tas ir deklarēts.
-
Anonīmās klases (Anonymous Classes)
- būtībā, tās ir bezvārda vietējās klases.
- deklarē un instancē vienlaikus.
- tiek izmantotas, lai īstenotu abstraktu klasi vai interfeisu "uz vietas".
- tāpat kā vietējās klases, tām ir piekļuve
finalvai efektīvifinalvietējiem mainīgajiem ārējā bloka ietvaros.
Piemērs struktūrai:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statiskā iekšējā klase
static class StaticNestedClass {
void accessOuter() {
// Var piekļūt ārējās klases statiskajiem locekļiem
int value = staticOuterField;
// Nevar piekļūt nestatiskajiem locekļiem
// int value2 = outerField; // Kompilācijas kļūda
}
}
// Členklase (Iekšējā klase)
class MemberInnerClass {
void accessOuter() {
// Var piekļūt visiem locekļiem
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // efektīvi final
// Vietējā klase
class LocalClass {
void accessOuter() {
// Var piekļūt ārējās klases locekļiem un vietējiem final/efektīvi final mainīgajiem
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Anonīma klase (īsteno Runnable interfeisu)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Var piekļūt ārējās klases locekļiem un vietējiem final/efektīvi final mainīgajiem
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}