2012-09-25 12 views
9

Während des Codierens habe ich ein seltsames Verhalten des Java-Compilers festgestellt.Java Compiler error puzzler: "innere Klassen können keine statischen Deklarationen haben" - mit Ausnahme von einfachen Typen

Beim Kompilieren der Klasse (Quelle unten) gibt der Compiler einen Fehler ("inner classes cannot have static declarations") für die Klassenvariable NULL aus. Dies ist wie erwartet!

Es wird jedoch kein Fehler für die Klassenvariable ZERO generiert. Das verstehe ich nicht!

Warum dieser Unterschied, der statische Deklarationen einfacher Typen, aber keine Objekte zulässt, in inneren Klassen zuzulassen scheint.

(Javac -Version: 1.6.0_24)

public class Outer { 
    public static final Runnable HELLO = new Runnable() { 
     // No compiler error 
     public static final int ZERO = 0; 

     // Causes compiler error: "inner classes cannot have static declarations" 
     public static final Object NULL = null; 

     @Override 
     public void run() { 
      System.out.println("Hello " + ZERO + NULL); 
     } 
    }; 
} 
+0

Ich denke, es ist, weil die priomitive Variable wird als eine Konstante und kompiliert * inline * behandelt, während die "Objekt" -Referenz wird nicht. Ich erinnere mich, dass ich in diesem YouTube-Video etwas darüber gesehen habe, wie der Compiler Konstanten mit "Null" -Referenz behandelt: http://www.youtube.com/watch?v=V1vQf4qyMXg&t=68m1s – Magicode

+0

Ob es sich um eine Nullreferenz oder ein "neues Objekt" handelt() "Referenz macht keinen Unterschied, beide verursachen einen Compilerfehler. – Morten

Antwort

14

Das Problem ist, dass innere Klassen keinen statischen initialiser Block aufweisen können, die erforderlich ist, nicht-triviale Konstanten und nicht-Konstanten zu initialisieren.

+1

+1; Man könnte argumentieren, dass die Fehlermeldung nicht sehr explizit ist. Die erste Erklärung ist auch "statisch". – maba

+0

Ich weiß auch nicht, warum eine innere Klasse keinen statischen Initialisierungsblock haben kann. : | –

+0

Wenn innere Klassen keinen statischen Initialisierungsblock haben können, warum können Sie eine statische einfache Klassenvariable initialisieren? Welcher Teil der Java-Sprachspezifikation erlaubt einen, aber nicht den anderen. Ich denke eigentlich, dass das eigentliche Problem ist, dass kein Compilerfehler für die einfache Klassenvariable (statisches Feld) generiert wird. – Morten

Verwandte Themen