2012-07-20 2 views
3

열거 형으로 응석을 발견했습니다. 다음은 Kathy Siera의 책입니다.Enums 생성자 정적 초기화 자

public class WeatherTest { 

    static Weather w; 

    public static void main(String[] args) { 
     System.out.print(w.RAINY.count + " " + w.Sunny.count + " "); 
    } 
} 

enum Weather { 

    RAINY, Sunny; 
    int count = 0; 

    Weather() { 
     System.out.print("c "); 
     count++; 
    } 
} 

출력은 c1입니다. 1. 이해합니다. 이제 카운트 필드가 정적이라면 어떻게 될까? 출력은 c 2 2가 될까요? 그것에 기초하여 count 변수를 static으로 수정했습니다. 하지만 내가 본 것은 다음과 같습니다. 컴파일 시간 오류 : 이니셜 라이저에서 정적 필드에 대한 참조가 잘못되었습니다.

그물에서 검색 나는 이것이 일종의 루프 홀이라는 것을 알았고 정적 필드를 변경할 수있는 정적 메서드를 허용했습니다. 좋아 .. 그래서 지금은 내 일을 할 수있는 정적 메소드 증분을 사용 놀랍게도

 class WeatherTest { 

    static Weather w; 

    public static void main(String[] args) { 
     System.out.print(w.RAINY.count + " " + w.Sunny.count + " "); 
    } 
} 

enum Weather { 

    RAINY, Sunny; 

    Weather() { 
     System.out.print("c "); 
     incr(); 
    } 
    static int count = 0; 

    static void incr() { 
     count++; 
    } 
} 

, 나는 출력을 얻을 : 0 0 C c를! 누군가 나 자신을 쏘기 전에이 행동을 설명해 주실 수 있습니까?

+0

당신의 들여 쓰기 및 중괄호를 해결하시기 바랍니다으로 그 값을 참조하십시오. – ardent

+0

매우 응회하는 질문! 모든 자바 프로그래머, 자신을 방어하십시오 :) – Kameron

+0

ardentsonata : 확실한 – user1500024

답변

5

열거 형 값은 영광스러운 정적 필드로 간주 될 수 있습니다 (이 열은 표식 아래에 있음). 이처럼 Weather은 일반 자바 클래스라면

그래서, 그것은했을 뭔가 :

class Weather { 
    public final static Weather RAINY = new Weather(); 
    public final static Weather Sunny = new Weather(); 

    static int count = 0; 

    Weather() { 
    System.out.print("c "); 
    incr(); 
    } 

    static void incr() 
    { 
     count++; 
    } 
} 

당신은 count AFTER 열거 값을 모두 선언 된 것을 볼 수 있습니다, 그것을 의미도 입니다 두 값이 모두 만들어지면이 초기화됩니다. 또한 초기화되지 않은 정적 변수를 만나면 각 함수 호출은 기본값 (의 경우 0)으로 초기화 된 것으로 간주합니다.

제대로 초기화 된 countincr를 호출하지 않습니다 때문에

, 당신은 여전히 ​​ 0

+0

두 번째 호출에서이 코드를 실행하는 동안 실행 순서에 동의하지만 한 부분이 혼란 스럽습니다. , count를 '2'로 표시하는 incr() 메소드. 당신의 이론에 따르면, 0으로 간주되어야합니다. 그렇지 않습니까? – kosa

+0

나는 부분적으로 명확하다; Weather() 생성자에서 incr()이 발생할 때 어떤 일이 발생하는지 더 자세히 설명해 주시겠습니까? 아직 초기화되지 않은 값을 증가시키기 때문에 어떤 종류의 컴파일러 오류 또는 예외가 발생하지 않는 이유는 무엇입니까? – user1500024

+0

@thinksteep. 'incr'에 대한 첫 번째 호출에서'count'는 초기화되지 않기 때문에 메모리 위치는'0'의 기본값으로 할당됩니다. 그런 다음 생성자에 의해 2 번 증가되고 REAL 초기화가 '0'으로 발생합니다. –