4.13.5 | Lokale Klassen |
In jedem Block, z. B. in einer Methode oder einem Schleifenrumpf, können lokale Klassen definiert werden. Wie auch die lokalen Variablen sind die lokalen Klassen nur in dem Block sichtbar, in dem sie definiert sind. Dennoch darf es zu einer lokalen Klasse in den umschließenden Namensräumen keine andere Klasse mit demselben Namen geben.
Lokale Klassen weisen gegenüber den Elementklassen folgenden Unterschied auf:Gemeinsam ist den lokalen und den Elementklassen:
- Die Modifier public, protected und private sind bei lokalen Klassen nicht erlaubt.
Lokale Variablen oder Methodenparameter, die in einer lokalen Klasse verwendet, aber nicht dort vereinbart sind, müssen als final vereinbart sein. Der Grund hierfür ist die zuvor erläuterte interne Realisierung von inneren Klassen: Da alle inneren Klassen intern in Top-Level-Klassen umgewandelt werden, versieht der Compiler die lokale Klasse mit einem privaten Datenelement, das eine Kopie der entsprechenden lokalen Variable (bzw. Methodenparameter) ist. Um sicherzustellen, dass der Wert dieser Kopie immer mit dem Wert der »originalen« lokalen Variable übereinstimmt, muss die lokale Variable mit final als konstant vereinbart werden.
Im folgenden Beispiel wird die zweite Zuweisung vom Compiler zurückgewiesen, weil in der lokalen Klasse auf den Methodenparameter y zugegriffen wird, der nicht final ist.public void demo(final int x, int y) { class LocalClass { LocalClass() { // OK, weil x als final deklariert ist int sum = x; // Fehlermeldung! sum += y; } } }