2012-07-29 8 views
9

¿Por qué este programa Java se compila:¿El error de compilación de Java depende de si el nombre de la variable estática está calificado?

public class xx { 
    public static final Object obj; 
    static { 
//  obj = null;  // this compiles 
     xx.obj = null;  // this doesn't 
    } 
} 

con este error:

$ javac xx.java 
xx.java:5: cannot assign a value to final variable obj 
     xx.obj = null;  // this doesn't 
     ^
1 error 
$ javac -version 
javac 1.6.0_33 

cuando, si reemplazo xx.obj = null con obj = null (como se alude en el comentario) que se compila.

Pensé que el xx. prefijo de nombre de clase era más o menos sintaxis ... ¿es esto un error en el compilador o en la especificación del lenguaje? :)

+0

Probablemente un error del compilador (que no ha mordido suficiente gente hasta ahora para atraer suficiente atención). ¿Alguien puede probar versiones JDK más antiguas y nuevas? Y también el compilador de Eclipse? – Thilo

+2

JDK 7 mismo error aquí. –

Respuesta

7

Cuando lo haces xx.obj, significa que la clase ya está inicializada. Por lo tanto, final obj no se puede inicializar de nuevo. Este es un error de tiempo de compilación. El compilador podría haber verificado que obj aún no se ha inicializado. Sería difícil verificar eso, pero en teoría es posible. Pero así no es como funciona el compilador de Java.

+1

+1 Esto tiene más sentido que mi respuesta. Noté que puede acceder a la referencia de clase dentro del inicializador estático, por ejemplo, para métodos estáticos o variables estáticas no finales. –

+2

Eso no tiene sentido para mí. Este código es parte de un inicializador estático, por lo que la inicialización de la clase está en progreso cuando se ejecuta el código; java está diseñado para manejar adecuadamente (lo que de otro modo sería) la inicialización de clase recursiva. – Archie

+0

@Archie - por favor revisa mi edición. – fastcodejava

Cuestiones relacionadas