Junior
Mis on sisemised klassid?
sobes.tech AI
Vastus AI-lt
Sisemine klass (nested classes) on klassid, mis on deklareeritud teise klassi sees. Need võivad olla staatilised (static nested classes) ja mitte-staatilised (inner classes).
Staatilised sisemised klassid:
- Deklareeritud
staticmodifikaatoriga. - Ei pääse otse ligi välise klassi mitte-staatilistele liikmetele (ainult välise klassi eksemplari kaudu).
- Võivad sisaldada nii staatilisi kui mitte-staatilisi liikmeid.
- Loovad ilma välise klassi eksemplarita.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public static class StaticNested {
// Ligipääs staticOuterVar
public void printStaticValue() {
System.out.println(staticOuterVar);
}
// Otse ligipääs instanceOuterVar ei ole võimalik
// public void printInstanceValue() {
// System.out.println(instanceOuterVar); // Kompilatsiooni viga
// }
}
}
Staatilise sisemise klassi kasutamine:
// Näide staatilise sisemise klassi eksemplari loomise kohta
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Väljund 10
Mitte-staatilised sisemised klassid (Inner Classes):
- Deklareeritud ilma
static. - Omab täielikku juurdepääsu kõigile välise klassi liikmetele, kaasa arvatud privaatsed.
- Ei saa sisaldada staatilisi liikmeid (välja arvatud konstantsed, mis on compile-time).
- Vajab välise klassi eksemplari.
public class Outer {
private static int staticOuterVar = 10;
private int instanceOuterVar = 20;
public class Inner {
// Ligipääs staticOuterVar ja instanceOuterVar
public void printValues() {
System.out.println(staticOuterVar); // Saadaval
System.out.println(instanceOuterVar); // Saadaval
}
}
}
Mitte-staatilise sisemise klassi kasutamine:
// Näide mitte-staatilise sisemise klassi eksemplari loomise kohta
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Väljund 10 ja 20
Sisemiste klasside eelised:
- Loogiline grupimine: Klassid, mida kasutatakse ainult ühe teise klassi sees, saab loogiliselt grupeerida.
- Inkapulatsioon: Sisemised klassid pääsevad ligi privaatselt välise klassi liikmetele.
- Lugemise ja hoolduse lihtsustamine: Kood muutub organiseeritumaks.
Mitte-staatiliste sisemiste klasside tüübid:
- Lokaalsed klassid: Deklareeritud meetodi sees.
- Anonüümklassid: Klassi ilma nimega, tavaliselt kasutatakse abstraktsete klasside, liideste või alusklasside eksemplaride loomiseks meetodite ülekirjutamisega.
Lokaalne klass:
public class Outer {
public void myMethod() {
class LocalClass {
void display() {
System.out.println("Lokaalse klassi sees");
}
}
LocalClass local = new LocalClass();
local.display();
}
}
Anonüümne klass (liidese näide):
interface Greeting {
void sayHello();
}
public class Outer {
public void greet() {
Greeting anonymousGreeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Tere anonüümse klassist!");
}
};
anonymousGreeting.sayHello();
}
}