2011-01-18 19 views
6

Traté de declarar una clase como se muestra abajono puede declarar static final String Public s = new String ("123") dentro de una clase interna

class Outer{ 
    private final class Inner{ 
     public static final String s1 = new String("123"); 
     public static final byte[] bytes = new byte[]{0x00, 0x01}; 

     public static final String s2 = "123"; 
     public static final byte byte1 = 0x02; 
    } 
} 

En el s1 el código de seguridad y bytes costumbre compilar pero s2 y byte1 compilar. Si pongo toda la declaración constante en la clase externa, funciona bien. Qué me estoy perdiendo. ¿Alguna ayuda?

+1

apuesto a que la línea s2 debería haber sido * public static static String s2 = "123"; * –

+0

@Cadrian, @Guido Lo sentimos, copiar pegar error, Actualizado la pregunta – Manoj

Respuesta

12

Lea Java Language Specification, 3rd ed, §8.1.3.

Una clase interna es una clase anidada que no está explícita o implícitamente declarada estática. Las clases internas no pueden declarar los inicializadores estáticos (§8.7) o interfaces de miembros.

Esto es por lo que no se puede declarar nuevapublic static final String s1 = new String("123");.

Las clases internas no pueden declarar miembros estáticos, a menos que sean campos en tiempo de compilación (§15.28).

Esto explica por qué se puede hacer public static final String s2 = "123";

Una clase anidada estática puede tener miembros estáticos.

+0

Uno nunca debe decir 'new String (" 123 ") ', de todos modos: es redundante, lento y una pérdida de memoria al declarar dos variables y solo usar una. Simplemente use la cadena literal: '" 123 "'. – CajunLuke

+0

¿Puede explicar * por qué * JLS tiene esta restricción? –

0

cf especificación del lenguaje Java, segunda edición, §8.1.2

Una clase interna es una clase anidada que no es explícita o implícitamente declaró estática. Las clases internas no pueden declarar inicializadores estáticos (§8.7) o interfaces de miembros

0

clases internas fueron diseñados para trabajar en el contexto de la clase externa, creo que las variables estáticas se romperían esta regla.

8.1.2 Inner Classes and Enclosing Instances

Una clase interna es una clase anidada que no es explícita o implícitamente declaró estática. Las clases internas no pueden declarar inicializadores estáticos (§8.7) o interfaces de miembros. Las clases internas pueden no declarar miembros estáticos, a menos que sean campos de tiempo de compilación (§15.28).

Cuestiones relacionadas