Junior
Kas yra įterptosios klasės?
sobes.tech AI
Atsakymas iš AI
Įterpti klasės (nested classes) yra klasės, deklaruotos kitoje klasėje viduje. Jos gali būti statinės (static nested classes) ir nestatinės (inner classes).
Statinės įterptos klasės:
- Deklaruojamos su
staticmodifikatoriumi. - Tiesiogiai neturi prieigos prie ne-statinės išorinės klasės narių (tik per išorinės klasės egzempliorių).
- Gali turėti tiek statinius, tiek nestatinius narius.
- Sukuriamos be išorinės klasės egzemplioriaus.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public static class StaticNested {
// Turi prieigą prie staticOuterVar
public void printStaticValue() {
System.out.println(staticOuterVar);
}
// Tiesioginė prieiga prie instanceOuterVar nėra įmanoma
// public void printInstanceValue() {
// System.out.println(instanceOuterVar); // Kompiliacijos klaida
// }
}
}
Naudojimas statiniam įterptam klasės pavyzdžiui:
// Pavyzdys, kaip sukurti statinio įterpto klasės egzempliorių
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Išves 10
Nestatinės įterptos klasės (Inner Classes):
- Nėra deklaruotos su
static. - Turi pilną prieigą prie visų išorinės klasės narių, įskaitant privačius.
- Negali turėti statinių narių (išskyrus laiko konstantes).
- Reikalauja išorinės klasės egzemplioriaus sukūrimo.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public class Inner {
// Turi prieigą prie staticOuterVar ir instanceOuterVar
public void printValues() {
System.out.println(staticOuterVar); // Pasiekiama
System.out.println(instanceOuterVar); // Pasiekiama
}
}
}
Naudojimas nestatinio įterpto klasės pavyzdžiui:
// Pavyzdys, kaip sukurti nestatinio įterpto klasės egzempliorių
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Išves 10 ir 20
Naudojimo privalumai įterptų klasių:
- Loginė grupavimas: Klasės, kurios naudojamos tik vieno kito klases, gali būti logiškai sujungtos viduje.
- Inkapuliacija: Įterptos klasės turi prieigą prie privačių narių išorinėje klasėje.
- Skaitomumas ir palaikymas: Kodas tampa tvarkingesnis.
Nestatinės įterptos klasės tipai:
- Vietinės klasės: Deklaruojamos metodo viduje.
- Anoniminės klasės: Be aiškaus vardo, dažnai naudojamos kuriant išorinės klasės abstrakčius, sąsajas ar bazines klases su metodų perrašymu.
Vietinė klasė:
public class Outer {
public void myMethod() {
class LocalClass {
void display() {
System.out.println("Vietinio klases viduje");
}
}
LocalClass local = new LocalClass();
local.display();
}
}
Anoniminė klasė (pavyzdys su sąsaja):
interface Greeting {
void sayHello();
}
public class Outer {
public void greet() {
Greeting anonymousGreeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Sveiki iš anoniminės klasės!");
}
};
anonymousGreeting.sayHello();
}
}