2016-12-07 3 views
3

저는 java를 처음 사용하고 있습니다. 현재 정적 변수에 대한 기사를 읽었습니다. 학습 내용을 구현하려고 할 때 정적 변수에 관한 문제가 발생했습니다. 다음은 첫 번째 코드 샘플입니다.Java에서 정적이 아닌 클래스의 정적 변수 선언하기

public class Human { 
    // in Human.java 
    public static int population = 0; 
    public static void main(String[] argv) { 
     System.out.println(population); 
    } 
} 

이 코드는 잘 작동하고, 결과는 0 하지만 다음 코드, 나는 그것을 컴파일 할 수 없습니다.

public class Human { 
    // in Human.java 
    public class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human().new Charlie().number); 
    } 
} 

오류가 발생 일정한 표현

I이 상황 혼동이다으로 초기화하지 않는 필드 번호가 아닌 정적 내부 유형의 정적 선언 될 수 없다. 첫 번째 코드 샘플의 경우 Human 클래스는 정적이 아니며 그 안에 정적 변수를 선언 할 수있었습니다. 두 번째 코드 샘플에서 어떻게 동일한 작업을 수행 할 수 없습니까?

도움을 주시면 감사하겠습니다. 감사. :)

답변

4

public static final int number = 0;으로 시도하십시오. Java가 함수 로컬 내부 클래스 내에서 최종 정적 필드를 정의 할 수 없기 때문입니다. 최상위 레벨 클래스와 정적 중첩 클래스만이 비 정적 정적 필드를 가질 수 있습니다. JLS section 8.1.3에서

: 그들은 일정한 변수 (§4.12.4), 또는 컴파일 타임 오류가 발생하지 않는 한

내부 클래스, 정적 멤버를 선언하지 않을 수 있습니다.

내부 클래스는 정적하고

public class Human { 
    // in Human.java 
    public static class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human.Charlie().number); 
    } 
} 
+0

다른 방법은 찰리 클래스는 정적 만드는 것입니다 그것을 액세스 할 수있는 다른 방법입니다. 언급할만한 가치가있을 수도 있습니다. – Aelop

+0

. Java에 이러한 제한이있는 이유가 있습니까? 이것은 Java VM가 외부 클래스와 다른 내부 클래스를 처리한다는 것을 의미합니까? – FunnyFunkyBuggy

+0

@Aelop Right .. 방금 내 대답을 업데이트했습니다. – iMBMT