2012-09-25 20 views
9

Durante la codificación, he encontrado un extraño comportamiento del compilador Java.Error del compilador de Java: "las clases internas no pueden tener declaraciones estáticas", excepto para los tipos simples

Al compilar la clase (fuente a continuación), el compilador emite un error ("inner classes cannot have static declarations") en la variable de clase NULL. ¡Esto es lo esperado!

Sin embargo, no se genera ningún error en la variable de clase ZERO. ¡Esto no lo entiendo!

Por qué esta diferencia, que parece permitir declaraciones estáticas de tipos simples, pero no de objetos, en clases internas.

(-version javac: 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

Creo que es porque la variable priomitiva se tratará como una constante y compilada * en línea *, mientras que la referencia 'Objeto' no lo hará. Recuerdo haber visto algo sobre cómo el compilador trata las constantes con referencia 'null' en este video de YouTube: http://www.youtube.com/watch?v=V1vQf4qyMXg&t=68m1s – Magicode

+0

Si se trata de una referencia nula o un" nuevo objeto() "referencia no hace diferencia, ambos causan un error de compilación. – Morten

Respuesta

14

El problema es que las clases internas no pueden tener un bloque inicializador estático que se requiere para inicializar constantes no triviales y no constantes.

+1

+1; Se podría argumentar que el mensaje de error no es muy explícito. La primera declaración también es 'estática'. – maba

+0

También no sé por qué una clase interna no puede tener un bloque de inicializador estático. : | –

+0

Si las clases internas no pueden tener un bloque de inicializador estático, ¿por qué puede inicializar una variable de clase de tipo simple estática? Qué parte de la Especificación del lenguaje Java permite una pero no la otra. De hecho, creo que el problema real es que no se genera ningún error de compilación para la variable de clase de tipo simple (campo estático). – Morten

Cuestiones relacionadas