Lokale variabelen — worden gedeclareerd en bestaan alleen in de methode- of bloklichaam, worden niet automatisch geïnitialiseerd. Het gebruik van een niet-geïnitialiseerde lokale variabele leidt tot een compileerfout.
Instantievariabelen (velden, niet static) — behoren tot elk object afzonderlijk, worden geïnitialiseerd bij het aanmaken van een objectinstantie.
Statische variabelen (static fields) — gemeenschappelijk voor alle instanties van de klasse, bestaan in één exemplaar voor de hele klasse. Wijzigingen in één object zijn zichtbaar in alle andere objecten van die klasse.
public class Example { private int instanceVar; // instantievartsen private static int staticVar; // statische variabele public void foo() { int localVar = 0; // lokale variabele } }
Kunnen statische variabelen privé zijn en hoe zijn ze zichtbaar tussen verschillende exemplaren van de klasse?
Antwoord: Ja, statische variabelen kunnen privé zijn. Wijzigingen worden weerspiegeld voor alle instanties van de klasse, omdat ze tot de klasse behoren en niet tot het object.
public class MyClass { private static int counter = 0; public MyClass() { counter++; } public static int getCounter() { return counter; } }
Het aanmaken van meerdere instanties van MyClass verhoogt dezelfde teller.
Verhaal
In een enterprise-applicatie plaatste de ontwikkelaar per ongeluk de gebruikersstatus in een static veld. Dit leidde ertoe dat gebruikers elkaars gegevens "zagen" in een multi-user omgeving.
Verhaal
Bij het schrijven van een multi-threaded applicatie werd een instantievaarlijke gebruikt binnen een static methode zonder juiste synchronisatie. Dit veroorzaakte race-omstandigheden en onverwachte resultaten.
Verhaal
De ontwikkelaar besloot een lokale variabele te gebruiken in plaats van een klasveld om een tussenresultaat op te slaan. De variabele werd vernietigd na het verlaten van de methode, en het programma retourneerde altijd null, wat niet onmiddellijk tijdens de testfase werd opgemerkt.