---
title: 'Lokale Klassen und effektiv finale Variablen'
url: 'https://www.tutego.de/blog/javainsel/2015/02/lokale-klassen-und-effektiv-finale-variablen'
markdown: 'https://www.tutego.de/blog/javainsel/2015/02/lokale-klassen-und-effektiv-finale-variablen.md'
date: '2015-02-03'
description: 'Im folgenden Beispiel deklariert die main(…)-Methode eine innere Klasse Snowden mit einem Konstruktor, der auf die finale Variable PRISM zugreift: public class NSA { public static void main( String[] args ) { final int PRISM = 1; int tempora = 2; tempora++; // (*) class Snowden { Snowden() { …'
taxonomy:
  category:
    - Insel
---

# Lokale Klassen und effektiv finale Variablen

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://www.tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://www.tutego.de/blog/javainsel/)

## Lokale Klassen und effektiv finale Variablen

03.02.2015 · [Christian Ullenboom](https://www.tutego.de/blog/javainsel/author/admin/)

Im folgenden Beispiel deklariert die `main(…)`-Methode eine innere Klasse `Snowden` mit einem Konstruktor, der auf die finale Variable PRISM zugreift:

```java
public class NSA {

public static void main( String[] args ) {

final int PRISM = 1;

int tempora = 2;

tempora++; // (*)

class Snowden {

Snowden() {

System.out.println( PRISM );

// System.out.println( tempora ); // Auskommentiert ein Compilerfehler

}

}

new Snowden();

}

}
```

Die Deklaration der inneren Klasse `Snowden` wird hier wie eine Anweisung eingesetzt. Ein Sichtbarkeitsmodifizierer ist bei inneren lokalen Klassen ungültig, und die Klasse darf keine Klassenmethoden und allgemeinen statischen Variablen deklarieren (finale Konstanten schon).

Jede lokale Klasse kann auf Methoden der äußeren Klasse zugreifen und zusätzlich auf die lokalen Variablen und Parameter, die final sind. Das ist die Variable PRISM auf jeden Fall, tempora ist nicht final (tempora++ ist ein Schreibzugriff), und daher führt eine Konsolenausgabe mit `println(tempora)` auch zu einem Compilerfehler – Eclipse meldet: „Local variable tempora defined in an enclosing scope must be final or effectively final”. Der letzte Teil der Fehlermeldung gibt einen Hinweis auf eine kleine Änderung seit Java 8, dass Variablen nicht zwingend mit dem Modifizierer final ausgezeichnet werden müssen, um final zu sein. Gibt es keinen Schreibzugriff auf Variablen, sind sie effektiv final. Im Beispiel kann das einfach getestet werden: Wird die Zeile (\*) mit tempora++; auskommentiert, so ist tempora effektiv final und `Snowden` kann auf tempora zugreifen.

Liegt die innere Klasse in einer statischen Methode, kann sie keine Objektmethoden der äußeren Klasse aufrufen.

Kategorien: [Insel](https://www.tutego.de/blog/javainsel/category/insel/)

[← Alle Beiträge](https://www.tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Offtopic: Neue ECMAScript 6 Features](https://www.tutego.de/blog/javainsel/2015/02/offtopic-neue-ecmascript-6-features.md)
- Next: [null coalescing operator in Java nachbilden](https://www.tutego.de/blog/javainsel/2015/02/null-coalescing-operator-in-java-nachbilden.md)
