2012-08-08 12 views
8

Hier habe ich ein Programm, wenn ich die constant druckt in mainstatic Block nicht ausführt .. aber wenn ich stat drucken, die jede Bedeutung static final in Java ist es führt ..? bitte erklärenWarum Code im statischen Block nicht ausgeführt wird?

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); 
    } 
} 

Antwort

10

Die static final int wird direkt in Ihren Code als Wert kompiliert. Das heißt, sieht die JVM und ausführt:

System.out.println(123); 

und du bist nicht dein treffend bezeichneten Doubt Klasse überhaupt zu berühren (dies ist ein Argument für nicht Konstanten in dieser Art und Weise spezifizieren, btw. Wenn Sie diesen Wert ändern, müssen Sie jede referenzierende Klasse neu kompilieren)

+0

Danke .. :) Jetzt habe ich klar .. – jenuine

20

Ihr Code wird die Doubt Klasse nicht initialisiert, gerade weil Doubt.constantist eine Konstante ist. Sein Wert wird in MyProgram zur Kompilierzeit gebacken - Sie konnten sogar Doubt.class nach Kompilation löschen und Ihr Programm würde noch laufen.

Run

javap -c com.test.doubt.MyProgram 

genau einen Blick zu haben, was Ihr Code wie nach der Kompilierung aussieht.

Siehe section 15.28 of the JLS für das, was einen konstanten Ausdruck ausmacht. Zum Beispiel wäre dies immer noch eine Konstante:

public static final String FOO = "Foo"; 

und so würde alle davon:

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

... aber das wäre nicht

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

+1 Mit anderen Worten, der 'javac' Compiler optimierte die Notwendigkeit der' Doubt' Klasse. –

+3

@Thilo: Nein, es * passiert * auch für String, solange es eine Kompilierzeitkonstante ist. Siehe Abschnitt 15.28 der JLS für Details. –

+0

'Paket com.test.doubt; Klasse Zweifel { \t public static final int konstant = 123; \t öffentliche statische int stat = 123; \t statisch { \t \t System.out.println ("Statischer Block"); \t} } public class MyProgram { \t public static void main (String [] args) { // \t \t System.out.println (Doubt.constant); \t \t System.out.println (Zweifel.stat); \t \t \t \t \t} } 'aber dieser Code druckt den statischen Block, damit ich verwirrt – jenuine

Verwandte Themen