2012-08-08 9 views
8

Aquí hice un programa cuando imprime el constant en mainstatic bloque no se ejecuta .. pero cuando imprimo stat que ejecuta existe ninguna importancia a static final en Java ..? explique¿Por qué el código en el bloque estático no se ejecuta?

package com.test.doubt;` 

class Doubt { 

    public static final int constant = 123; 
    public static int stat = 123; 

    static { 
    System.out.println("Static Block"); 
    } 
} 

public class MyProgram { 

    public static void main(String[] args) { 
    System.out.println(Doubt.constant); 
    } 
} 

Respuesta

10

El static final int se compilará directamente en su código como su valor. Es decir, la JVM ve y se está ejecutando:

System.out.println(123); 

y no está tocando su clase bien llamada Doubt en absoluto (esto es un argumento para no especificando las constantes de esta manera, por cierto. Si cambia ese valor, debe volver a compilar cada haciendo referencia a la clase)

+0

Gracias ... :) Ahora tengo claro ... – jenuine

20

El código no se está inicializando la clase Doubt, precisamente porque Doubt.constant es una constante. Su valor se calienta en MyProgram en tiempo de compilación; incluso puede eliminar Doubt.class después de la compilación y su programa aún se ejecutará.

Run

javap -c com.test.doubt.MyProgram 

a echar un vistazo a exactamente lo que su código es el siguiente después de la compilación.

Ver section 15.28 of the JLS para lo que constituye una expresión constante. Por ejemplo, esto seguiría siendo una constante:

public static final String FOO = "Foo"; 

y así sería todo de estos:

public static final String FOO = "Foo"; 
public static final String BAR = "Bar"; 
public static final String FOOBAR = FOO + BAR; 

... pero esto no sería

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1); 
+0

+1 En otras palabras, el compilador 'javac' optimizó la necesidad de la clase' Doubt'. –

+3

@Thilo: No, * sucede * también para String, siempre que sea una constante en tiempo de compilación. Vea la sección 15.28 del JLS para más detalles. –

+0

'paquete com.test.doubt; clase Duda { \t public static final int constant = 123; \t public static int stat = 123; \t estática { \t \t System.out.println ("Bloque estático"); \t}} public class {MiPrograma \t public void main (String [] args) {estáticas // \t \t System.out.println (Doubt.constant); \t \t System.out.println (Doubt.stat); \t \t \t \t \t}} 'pero este código imprime el bloque estático, por lo tanto, me confundo – jenuine

Cuestiones relacionadas