Java geneste static classes begrijpen: gebruik, verschillen en voorbeelden
Java geneste statische klasse
Ontdek hoe Java's geneste statische klassen werken, hoe ze verschillen van inner classes, en wanneer je ze gebruikt met praktische codevoorbeelden.
In Java kan een klasse binnen een andere klasse gedefinieerd worden. Deze heten geneste klassen en komen in twee vormen:
- Non-static geneste klassen (inner classes)
- Statische geneste klassen
Terwijl inner classes behandeld werden in onze vorige tutorial, richt dit artikel zich op statische geneste klassen.
Java geneste statische klasse
Om een geneste klasse als statisch te declareren, voeg je simpelweg het static sleutelwoord toe:
class Dier { static class Zoogdier { // statische en non-static leden van Zoogdier } // leden van Dier }
Let op: Alleen geneste klassen kunnen statisch gedeclareerd worden; top-level klassen kunnen niet.
Als elke klasse kan een statische geneste klasse zowel statische als instantie-leden bevatten.
Omdat het een statisch lid is van zijn outer klasse, kun je een statische geneste klasse benaderen zonder een instantie van de outer klasse te creëren.
Voorbeeld: Statische geneste klasse
class Dier { // inner class class Reptiel { public void toonInfo() { System.out.println("Ik ben een reptiel."); } } // statische geneste klasse static class Zoogdier { public void toonInfo() { System.out.println("Ik ben een zoogdier."); } } } class Main { public static void main(String[] args) { // creeer outer klasse instantie Dier dier = new Dier(); // creeer instantie van non-static inner class Dier.Reptiel reptiel = dier.new Reptiel(); reptiel.toonInfo(); // creeer instantie van statische geneste klasse Dier.Zoogdier zoogdier = new Dier.Zoogdier(); zoogdier.toonInfo(); } }
Uitvoer
Ik ben een reptiel. Ik ben een zoogdier.
In de code hierboven is Zoogdier een statische geneste klasse terwijl Reptiel een inner class is.
Let op de verschillende instantiatie-syntax:
- Non-static inner class:
Dier.Reptiel reptiel = dier.new Reptiel(); - Statische geneste klasse:
Dier.Zoogdier zoogdier = new Dier.Zoogdier();
Leden van de outer klasse benaderen
Omdat een statische geneste klasse geassocieerd is met zijn outer klasse, kan het alleen statische leden van de outer klasse benaderen. Pogingen om instantie-leden te refereren resulteren in een compilatiefout.
Voorbeeld: Poging een non-static methode aan te roepen
class Dier { static class Zoogdier { public void toonInfo() { System.out.println("Ik ben een zoogdier."); } } class Reptiel { public void toonInfo() { System.out.println("Ik ben een reptiel."); } } public void eet() { System.out.println("Ik eet voedsel."); } } class Main { public static void main(String[] args) { Dier dier = new Dier(); Dier.Reptiel reptiel = dier.new Reptiel(); reptiel.toonInfo(); Dier.Zoogdier zoogdier = new Dier.Zoogdier(); zoogdier.toonInfo(); zoogdier.eet(); // ❌ Compileerfout } }
Uitvoer
Main.java:28: error: cannot find symbol zoogdier.eet(); ^ symbol: method eet() location: variable zoogdier of type Zoogdier 1 error compiler exit status 1
De fout treedt op omdat zoogdier een instantie is van een statische geneste klasse en de non-static eet() methode van Dier niet kan aanroepen.
Statische top-level klasse?
Java verbiedt statische top-level klassen. Alleen geneste klassen kunnen statisch gedeclareerd worden. De volgende code demonstreert de compilerfout:
static class Dier { public static void toonInfo() { System.out.println("Ik ben een dier"); } } class Main { public static void main(String[] args) { Dier.toonInfo(); } }
Uitvoer
Main.java:1: error: modifier static not allowed here static class Dier { ^ 1 error compiler exit status 1
Dit bevestigt dat alleen geneste klassen statisch kunnen zijn.
Java
- C# Static Keyword: Static Variabelen, Methodes en Classes Beheersen
- C# Geneste Classes: Definitie, Gebruik en Inheritance
- Java's final-sleutelwoord begrijpen: variabelen, methoden en klassen
- Java instanceof operator: een uitgebreide gids
- Java geneste en inner classes meesteren: typen, voorbeelden en best practices
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Singleton patroon uitgelegd: hoe veilig te implementeren en gebruiken
- Java Reflectie meesteren: klassen, methoden en velden inspecteren tijdens runtime
- Java ObjectOutputStream: Serialisatie, methoden en praktische voorbeelden
- Java Generics: Herbruikbare, type-veilige code bouwen
- Java-bestandsbewerkingen onder de knie krijgen met java.io – Aanmaken, lezen, schrijven en verwijderen