2014-01-09 2 views
6

아래 예제를 고려하십시오 내부 클래스의 정적 변수 상속에 제한이없는 경우 내부 클래스의 정적 멤버 변수를 선언하도록 제한하는 이유?자바의 내부 클래스에서 정적 멤버 변수를 선언하도록 제한되는 이유는 무엇입니까?

public class Outer { 

    public class Inner { 

     public static String notAllowed; 
     /* Above line give following compilation error 
     The field notAllowed cannot be declared static in a non-static inner type, unless initialized with a constant expression 
     */ 

    } 

} 

하지만 지금 내 내부 클래스가 정적 변수를 포함하는 다른 클래스를 확장하면 정상적으로 작동합니다. 코드 아래 고려 :

public class Outer { 

    public class Inner extends InnerBase { 
     /* Since it extends InnerBase so we can access Outer.Inner.allowed */ 
     public Inner(){ 
      Outer.Inner.allowed = null; // Valid statement 
     } 
    } 

} 

public class InnerBase { 

    public static String allowed; 

} 

그래서 상속을 통해 달성 로 내부 클래스에서 정적 변수를 제한하는 이유는 무엇인가? 나는 아주 기본적인 것을 놓치고 있습니까?

+0

'Inner' 클래스 정의가 정적 자체가 아니기 때문에? –

+2

http://stackoverflow.com/questions/1953530/why-does-java-prohibit-static-fields-in-inner-classes의 복제본 –

+0

두 번째 예에서 '정적' 필드의 값을 지정하면됩니다. –

답변

1

정적 필드에 액세스하려면 Outer 클래스의 인스턴스가 필요하므로 정적이 아닌 Inner 클래스의 인스턴스를 만들어야합니다.

static 필드가 인스턴스에 바인딩되지 않아서 컴파일 오류가 발생합니다.

JLS 8.1.3 지정

내부 클래스는 정적 또는 이니셜 부재 인터페이스, 또는 오류가 발생 컴파일 시간을 선언 할 수있다.

내부 클래스는 상수가 인 변수 또는 컴파일 타임 오류가 발생하지 않는 한 정적 멤버를 선언 할 수 없습니다. 오라클 사이트에서

+0

Downvoter, exlplain하는 마음? –

1

: 인스턴스 메소드와 변수로서

1) 내부 클래스 포위 클래스의 인스턴스와 관련된 해당 객체의 메소드와 필드에 직접 액세스를 갖는다.

2) 내부 클래스는 인스턴스와 연결되어 있으므로 정적 멤버 자체를 정의 할 수 없습니다.

내가 이런 식으로 이해 :

내부 클래스가 자신의 정적 필드, 정적 필드가있는 경우 클래스를 인스턴스화하기 전에 초기화 할 수있다;

그러나 내부 클래스는 outterclass의 인스턴스에만 존재하므로 인스턴스화하기 전에 정적 멤버를 초기화 한 다음 모순으로 초기화 할 수 없습니다.

+0

+1 나는 너의 이해를 더 좋아했다. :) –

관련 문제