Middle
Welke soorten geneste klassen bestaan er?
sobes.tech AI
Antwoord van AI
Geneste Klassen (Nested Classes) in Java worden onderverdeeld in twee hoofdtypen:
-
Statische geneste klassen (Static Nested Classes)
- Gemarkeerd met de modifier
static. - Gedragen zich als normale statische leden van de containerklasse.
- Kunnen toegang krijgen tot de statische leden van de externe klasse (zelfs als ze privé zijn).
- Hebben geen directe toegang tot de niet-statische leden van de externe klasse.
- Worden zonder instantie van de externe klasse gemaakt:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
- Gemarkeerd met de modifier
-
Binnenklassen (Inner Classes)
Binnenklassen zijn niet gemarkeerd met
staticen zijn gekoppeld aan een instantie van de externe klasse. Ze worden onderverdeeld in:-
Lid-binnenklassen (Member Inner Classes)
- Worden gedeclareerd op het niveau van een lid van de containerklasse, maar buiten haar methoden.
- Hebben toegang tot alle leden van de externe klasse, inclusief privéleden.
- Vereisen een instantie van de externe klasse om hun eigen instantie te maken:
OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
-
Lokale klassen (Local Classes)
- Worden gemaakt binnen methoden, constructors of initialisatieblokken.
- Hun bereik is beperkt tot het blok waarin ze zijn gedeclareerd.
- Kunnen niet worden gedeclareerd met toegangsspecificaties (
public,private,protected). - Kunnen toegang krijgen tot lokale variabelen die final of effectief final zijn van het externe blok.
- Kunnen niet buiten het blok worden gebruikt waarin ze zijn gedefinieerd.
-
Anonieme klassen (Anonymous Classes)
- Zijn in wezen lokale klassen zonder naam.
- Worden gelijktijdig gedeclareerd en geïnstantieerd.
- Worden gebruikt om een abstracte klasse of interface "on the fly" te implementeren.
- Net als lokale klassen, hebben ze toegang tot lokale variabelen die final of effectief final zijn van het externe blok.
-
Voorbeeldstructuur:
class OuterClass {
private int outerField;
private static int staticOuterField;
// Statische geneste klasse
static class StaticNestedClass {
void accessOuter() {
// Kan toegang krijgen tot de statische leden van de externe klasse
int value = staticOuterField;
// Kan niet toegang krijgen tot niet-statische leden
// int value2 = outerField; // Compileerfout
}
}
// Lid-klasse (binnenklasse)
class MemberInnerClass {
void accessOuter() {
// Kan toegang krijgen tot alle leden van de externe klasse
int value1 = outerField;
int value2 = staticOuterField;
}
}
void methodWithLocalAndAnonymous() {
final int localVar = 10; // final of effectief final
// Lokale klasse
class LocalClass {
void accessOuter() {
// Kan toegang krijgen tot leden van de externe klasse en lokale final/effectief final variabelen
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
}
}
LocalClass localObj = new LocalClass();
localObj.accessOuter();
// Anonieme klasse (implementatie van Runnable)
Runnable anonymousRunnable = new Runnable() {
@Override
public void run() {
// Kan toegang krijgen tot leden van de externe klasse en lokale final/effectief final variabelen
int value1 = outerField;
int value2 = staticOuterField;
int localValue = localVar;
System.out.println("Uitvoeren met lokale variabele: " + localValue);
}
};
anonymousRunnable.run();
}
}