2015-01-07 5 views
2

JLS 15.9.2은 포함하는 인스턴스를 결정하는 방법을 알려줍니다. C를 인스턴스화 할 클래스로 만들고 i를 인스턴스로 만듭니다.정적 컨텍스트에서 로컬 클래스 인스턴스 생성 식

[...]

는 C가있는 경우 : C는 내부 클래스 인 경우 다음과 같이

, 그럼 결정 (§8.1.3)를 직접 둘러싸 인스턴스를 가질 수있다 다음 로컬 클래스 :

  • C 정적 콘텍스트에서 발생하면, 그때에는 즉시 인스턴스를 둘러싸는 없다. 클래스 인스턴스 생성식이 정적 맥락에서 발생하는 경우

  • 그렇지 않으면, 다음 컴파일 타임 오류가 발생합니다.

  • 그렇지 않으면, O는 C.를 직접 둘러싸는 클래스가 O는 전적으로 클래스 인스턴스 생성식이 나타나는 클래스의 타입 선언 를 둘러싸는 n 번째입니다 같은 있다는 정수 n은하자가 될 수 있습니다.

제가 직접 둘러싸 인스턴스 이 어휘의 인스턴스를 둘러싸는 n 번째이다.

나는 굵은 글씨의 의미를 알지 못했습니다. 제가 컴파일 할 예정되지 않은 예제를 제공하자

class A{ 
    int a; 
    public static void main (String[] args) throws java.lang.Exception{ 
     class Foo{ 
      void bar(){ 
      } 
     } 
     Foo f = new Foo(); //Instance creation expression occured in the static context 
    } 
} 

DEMO

그 문제점은 무엇입니까? 두 번째 요점을 설명하는 실제 예제를 제공 할 수 없었습니까?

답변

1

가 나는 다음과 같은 경우를 의미 같아요 : 내부 클래스 B는 정적이 아니므로,

public class A { 

    public class B { /* ... */ } 

    public static void createB() { 
     new B(); // <<=== This should fail 
    } 
} 

표시된 라인은 실패 때문에 A의 인스턴스를 둘러싸는 것은 그런 둘러싸는 경우가 없다 엉이 필요, 방법 createB()은 정적이기 때문에.

업데이트 : 내 사례가 보여주는 것과 같은 일반적으로 내부 클래스에 관한 질문을 착각했습니다. 지역 수업의 맥락에서 나는 또한 문서를 해석 할 수 없다.

+0

그러나 B 클래스는 로컬 클래스가 아닙니다. 나는 표시된 선이 정확하게 지역 수업에 대해 이야기하고 있다고 생각했다. –

+0

흠, 네 말이 맞아. 내가 체크해 볼게. –

+0

OK, 포기합니다. 나는 또한 그 문장이 무엇을 의미하는지 모른다. 나는 더 깊이 파고 들어야 할 것이다. –

1

이러한 두 줄을 읽어야 할 사람 :

  • 을 C 그때 내가 어떤 즉시 인스턴스를 둘러싸는 없다, 정적 인 상황에서 발생합니다.

  • 그렇지 않으면 클래스 인스턴스 생성 표현식이 정적 컨텍스트에서 발생하면 컴파일 타임 오류가 발생합니다.정적 컨텍스트합니다 (main 방법)에 클래스 Foo 정의, 따라서 인스턴스 f에는 둘러싸는 인스턴스가 없습니다 -

귀하의 경우는 첫 번째 경우입니다. 그러나, 당신은 main 방법 이외의 클래스 Foo을 정의하고 main 방법에 Foo의 인스턴스를 만들려고 싶다면 당신은 정적 클래스로 Foo을 변경하지 않는 한

, 당신은 오류가 발생합니다.

class A 
{ 
    int a; 
    class Foo 
    { 
     void bar() 
     { 
     } 
    } 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Foo f = new Foo(); // this should fail 
    } 
} 
+0

하지만 Foo는 로컬 클래스가 아닙니다. 견적은 지역 수업에 대해 이야기합니다. –

+0

또한 http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1에 정의 된 다른 클래스 _의 _direct 내부 클래스에 대해서는 아무 것도 없습니다. –