Middle
Kokie yra vidinių klasių tipai?
sobes.tech AI
Atsakymas iš AI
Java viduje esančios klasės (Nested Classes) iš esmės skirstomos į du pagrindinius tipus:
-
Statinės vidinės klasės (Static Nested Classes)
- pažymėtos
staticmodifikatoriumi. - elgiasi kaip įprasti statiniai klasės nariai.
- gali pasiekti išorinės klasės statinius narius (net jei jie yra privačiai).
- neturi tiesioginio priėjimo prie išorinės klasės nestatinių narių.
- kuriamos be išorinės klasės egzemplioriaus:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- pažymėtos
-
Vidinės klasės (Inner Classes)
Vidinės klasės nėra pažymėtos
staticir yra susijusios su išorinės klasės egzemplioriumi. Jos skirstomos į:-
Nario klasės (Member Inner Classes)
- deklaruojamos kaip išorinės klasės nariai, bet už jos metodų ribų.
- turi prieigą prie visų išorinės klasės narių, įskaitant privačius.
- reikalauja išorinės klasės egzemplioriaus:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Vietinės klasės (Local Classes)
- kuriamos metodų, konstruktorių ar inicializacijos blokų viduje.
- jų matomumas yra ribotas to bloko ribose.
- negali būti deklaruotos su prieigos modifikatoriais (
public,private,protected). - gali naudotis
finalarba efektyviaifinallokalinių kintamųjų iš išorinio bloko. - negali būti naudojamos už to bloko ribų.
-
Anoniminės klasės (Anonymous Classes)
- iš esmės, tai be vardo vietinės klasės.
- deklaruojamos ir instancijuojamos vienu metu.
- naudojamos įgyvendinti abstraktų klasę ar sąsają "skraidant".
- kaip ir vietinės klasės, turi prieigą prie
finalarba efektyviaifinallokalinių kintamųjų iš išorinio bloko.
Pavyzdinė struktūra:
-
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statinė vidinė klasė
static class StaticNestedClass {
void accessOuter() {
// Gali pasiekti išorinės klasės statinius narius
int value = staticOuterField;
// Negali pasiekti nestatinių narių
// int value2 = outerField; // Kompiliacijos klaida
}
}
// Nario klasė (Vidinė klasė)
class MemberInnerClass {
void accessOuter() {
// Gali pasiekti visus narius
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // efektyviai final
// Vietinė klasė
class LocalClass {
void accessOuter() {
// Gali pasiekti išorinės klasės narius ir vietinius final/efektyviai final kintamuosius
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Anoniminė klasė (įgyvendinanti Runnable)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Gali pasiekti išorinės klasės narius ir vietinius final/efektyviai final kintamuosius
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Running with local variable: " + localValue);
}
};
anonymousRunnable.run();
}
}