Wo werden eigentlich Klassenvariablen initialisiert? Im Konstruktor ergibt dies keinen Sinn, da für Klassenvariablen keine Objekte angelegt werden müssen. Dafür gibt es den static{}-Block. Dieser wird immer dann ausgeführt, wenn der Klassenlader eine Klasse in die Laufzeitumgebung geladen hat. Für eine statische Initialisierung wird also wieder der Compiler etwas einfügen:
Was wir schreiben | Was der Compiler generiert |
class Beer { static String isFreeFor = „Homer“; } |
class Beer { static String isFreeFor; static { isFreeFor = „Homer“; } } |
Klassenintialisierer sind nicht ganz ungefährlich, denn wenn der Code eine Ausnahme auslöst, dann gibt es einen harten lang.ExceptionInInitializerError. Leser können das testen, in dem geändert wird:
static String isFreeFor = „Homer“.substring( -1 );
und dann aus dem Hauptprogramm aufrufen:
out.println( Beer.isFreeFor );
Klassenintialisierer sind nicht ganz ungefährtlich, denn wenn der Code eine Ausnahme
das „t“ bei ungefährtlich passt nicht an dieser Stelle
Danke!