java - metodo - ¿Por qué este Flotante es nulo cuando se ejecuta el bloque estático?
metodo estatico java ejemplo (1)
El siguiente código, cuando se ejecuta, imprime nitesh null
lugar del nitesh 130
esperado nitesh 130
. ¿Por qué no se inicializa n
antes de ejecutar el bloque estático?
class test
{
static
{
System.out.println(test.str+" "+test.n);
}
final static String str="nitesh";
final static Float n=130f;
public static void main(String []args)
{
}
}
str
es una constante de tiempo de compilación - n
no lo es, porque es de tipo Float
. Si lo cambia a final static float n = 130f
, verá el valor en el bloque de inicialización estática.
Por lo tanto, actualmente, en el bloque de inicializador estático, el valor de str
está en realidad en línea, su código es equivalente a:
System.out.println("nitesh "+test.n);
De la sección 15.28 de JLS (expresiones constantes) :
Una expresión constante es una expresión que denota un valor de tipo primitivo o una cadena que no se completa bruscamente y se compone utilizando solo lo siguiente: [...]
Float
no es un tipo primitivo.
Además, incluso sin la alineación, la variable constante str
se inicializa antes de que se ejecute cualquiera de los bloques de inicializador estático. De la sección 12.4.2 del JLS (detalles de inicialización de clase):
- ...
- Luego, inicialice los campos estáticos de C, que son variables constantes (§4.12.4, §8.3.2, §9.3.1).
- ...
- A continuación, ejecute los inicializadores de variable de clase y los inicializadores estáticos de la clase, o los inicializadores de campo de la interfaz, en orden textual, como si fueran un solo bloque.