Geschiedenis van de vraag:
Vanaf het begin introduceerde Java het concept van statische leden van een klasse, die zich onderscheiden van instantieleden – dergelijke variabelen worden op klassenniveau opgeslagen, niet op objectniveau. Dit stelt ons in staat om gegevens te delen tussen alle instanties van de klasse of om constanten en service-structuren te gebruiken.
Probleem:
De belangrijkste taak van statische velden is het bieden van gegevens voor alle objecten van de klasse of de implementatie van een enkele toegangspunt. Maar verkeerd gebruik van static kan leiden tot moeilijk te traceren fouten die verband houden met de globale toestand, data races en problemen bij het testen.
Oplossing:
Statische velden worden gedeclareerd met behulp van het sleutelwoord static:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
Bij elke aanmaak van een instantie wordt de teller verhoogd, en de waarde is toegankelijk via Counter.globalCount, onafhankelijk van het object.
Belangrijkste kenmerken:
Kan men naar een statisch veld verwijzen via een object in plaats van via de klassenaam?
Ja, de syntaxis staat verwijzing naar een statisch veld via een object toe, maar dit leidt tot onleesbare en soms verwarrende code. Het is beter om altijd naar de klassenaam te verwijzen.
Counter c = new Counter(); System.out.println(c.globalCount); // Werkt, maar wordt niet aanbevolen
Kunnen statische velden privé zijn?
Ja, het toegangsniveau is niet beperkt. Privé statische velden worden vaak gebruikt in combinatie met publieke statische methoden (bijvoorbeeld voor Singleton):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Wat gebeurt er als men probeert een statisch veld te initialiseren met een waarde die afhankelijk is van een niet-statisch veld?
Zo'n code zal niet compileren omdat niet-statische velden na statische velden worden geïnitialiseerd. Een statisch veld kan niet direct naar een niet-statisch veld verwijzen.
In grote applicaties wordt een statisch veld gebruikt voor het opslaan van gecachete gegevens die specifiek zijn voor de gebruiker.
Voordelen:
Nadelen:
Gebruik van public static final String voor het opslaan van constanten (bijvoorbeeld foutcodes of standaardparameters).
Voordelen:
Nadelen: