2012-08-08 4 views
8

여기서 을 인쇄 할 때 main 블록이 실행되지 않습니다 ... 그러나 stat을 인쇄하면 java에 static final이 중요합니다. 에 코드를 정확하게 때문에 Doubt.constant 상수의 Doubt 클래스를 초기화되지정적 블록의 코드가 실행되지 않는 이유는 무엇입니까?

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

답변

10

static final int은 값으로 코드에 직접 컴파일됩니다.

System.out.println(123); 

을 당신은이 BTW, 이런 식으로 상수를 지정 하지에 대한 인수입니다 (모든 귀하의 적절 명 Doubt 클래스를 접촉하지 않는 : 즉, JVM은보고 실행, 말을하는 것입니다. 그 값을 변경하면 마다 참조 클래스를 다시 컴파일해야합니다.

+0

감사합니다 :) 이제 나는 분명해 .. – jenuine

20

설명해주십시오. 그 값은 컴파일시에 MyProgram으로 구워집니다. 컴파일 후에도 Doubt.class을 삭제해도 프로그램은 계속 실행됩니다.

실행

javap -c com.test.doubt.MyProgram 

정확히 어떤 코드를 컴파일 후 모양을 살펴해야합니다.

상수 표현의 구성 요소는 section 15.28 of the JLS을 참조하십시오.

public static final String FOO = "Foo"; 

을 그렇게 이 모든은 다음과 같습니다 : 예를 들어,이 여전히 일정한 것

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

...하지만이되지 않을 것

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

+1 즉,'javac' 컴파일러는'Doubt' 클래스에 대한 필요성을 최적화했습니다. –

+3

@Thilo : 아니요. 컴파일 타임 상수 인 동안 String에서도 마찬가지입니다. 자세한 것은, JLS의 15.28 절을 참조 해주세요. –

+0

'package com.test.doubt; 클래스 의심 { \t public static final int constant = 123; \t 공용 static int stat = 123; \t 정적 { \t \t System.out.println ("정적 블록"); \t}} 공용 클래스 MyProgram { \t 공공 정적 무효 메인 (문자열 []에 args) {// \t \t에서 System.out.println (Doubt.constant); \t \t System.out.println (Doubt.stat); \t \t \t \t \t} } '하지만이 코드는 정적 블록을 인쇄는, 그래서 난 그냥 그것을 시도하고 AFAIK이 컴파일시 알려진 상수에 대한 발생 – jenuine

관련 문제