2012-03-30 3 views
0
public class StaticTest { 

    private static StaticTest stObj=new StaticTest(); 
    private static int VAR1=10; 
    private static final int VAR2=20; 

    public StaticTest() { 

     System.out.println("Var1 : "+VAR1); 
     System.out.println("Var2 : "+VAR2); 
    } 

    public static void main(String[] args) { 
     System.out.println("VAR1 after constrution : "+StaticTest.VAR1); 
    } 

} 

출력 :자바 차이

VAR1 : 0 변수 2를 대입 할 때 변수 : constrution 후 20 VAR1 10

이유 VAR1 및 VAR2이 다른 행동?

+1

VAR2는 상수 값이지만 VAR1은 단순한 정적 변수입니다. 즉, stObj가 초기화 된 후 VAR1이 초기화됩니다. 그래서 VAR1은 첫 번째 호출시 0 [기본값 int 초기화 값]이고 두 번째 호출 후에는 10입니다. – dexametason

답변

0

VAR2는, 클래스가 초기화되었습니다 하나를 변경할 수 없습니다.

여기서 문제는 완전히 초기화되기 전에 변수를 참조한다는 것입니다.

private static StaticTest stObj=new StaticTest(); 
private static int VAR1=10; 
private static final int VAR2=20; 

다른 정적 멤버가 초기화되기 전에 클래스 자체를로드 할 때 클래스 인스턴스를 만듭니다.

Java Language Specifications for more details (Chapter 12)을 확인하십시오.

(일반적으로 자체 건설 중에 클래스의 인스턴스를 생성하는 문제가 발생할 것입니다 : 당신이 피해야한다.)의 값이 모든에 "구운"되도록

+0

그러나 아무도 변수를 변경하지 않고 있습니까? – amicngh

+0

적어도 코드에 포함되어 있지 않습니다. –

+1

변수 'VAR'은 '0'으로 설정되기 전에 처음에는'0 '입니다. –

0

VAR1VAR2 변경할 수 없습니다.

이 시도 : 클래스의 인스턴스는 나중에 VAR을 변경할 수있는 반면

private static int VAR1=10; 
private static final int VAR2=20; 

public static void main(String[] args) { 
    VAR1 = 25; 
    VAR2 = 35; // You'll find a compilation error here. 
} 
3

VAR2은 컴파일 시간 상수 전화 사이트. 따라서 이 초기화되기 전에을 기대하기 전에 사용하는 것이 중요하지 않습니다. 컴파일러와 관련하여 이 아닌 정수로 변경하면입니다.

private static final int VAR2 = "xyz".length(); 

당신은 (출력 기준) VAR1와 동일한 동작을 볼 수 있습니다.

상수 식에 대한 자세한 내용은 section 15.28 of the JLS을 참조하십시오.

+0

그래서 컴파일 타임에 VAR2가 상수라고 가정합니다. – amicngh

+0

@amicngh : 그것은 가정의 문제가 아닙니다. JLS를 따르는 문제입니다.변수는 정적이고 최종 변수이며 기본 유형이며 초기화 식은 컴파일 타임 상수 식입니다. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 –

+0

@JonSkeet을 참조하십시오.하지만이 질문에 더 많은 것이 있다고 생각합니다. 초기화 순서 관련). – Bruno

5

정적 필드는 선언 순서대로 하나씩 초기화됩니다. 특별한 경우에 먼저 StaticTest stObj을 초기화하십시오. 이것은 VAR1 초기화 전에 실행됩니다. 따라서 VAR1은 인쇄시 기본값을가집니다.

그러나 VAR2은 컴파일 타임 상수이므로 컴파일러는 초기화를 최적화하고 먼저 초기화됩니다. 그런 식으로 변수 중 하나는 생성자를 호출 할 때 초기화되고 다른 하나는 초기화되지 않습니다.