2013-08-11 4 views
0

에서이 키워드를 사용하여 좀 소스 코드에서이 패턴을 가로 질러 온 다음추상적 인 상황

Foo.this.doSomething(); 

의 중요성 또는 그냥 일부화물 숭배 연습

public abstract class Foo { 

    void doSomething(){ 
     System.out.println("..."); 
    } 

    private class FooBar extends Foo{ 
     void doAnything(){ 
      Foo.this.doSomething(); 
     } 
    } 
} 

입니다 뭐죠?

답변

4

Foo.thisthis 두 개의 서로 다른 객체를 참조하십시오. FooBar 이후

Foo 내에 정의 된 내부 클래스이다 FooBar 모든 인스턴스와 연관된 Foo의 인스턴스를 갖는다.

  • this

    FooBar 인스턴스 자체를 말한다;
  • Foo.this은 바깥 쪽 Foo 인스턴스를 나타냅니다.

말했다

How can "this" of the outer class be accessed from an inner class?, 당신이 보여 예에서 Foo.this. 중복을 참조하십시오 (FooFooBar 모두이 방법은 doSomething()라고하지 않는 한) 생략 할 수있다.

2

이 예에서는 doSomething();을 직접 호출하는 것과 같습니다.

그러나 FooBar 클래스에서 동일한 메서드 void doSomething()을 선언 한 경우이 표기법을 사용하여 내부 클래스가 아닌 외부 클래스의 메서드를 호출 할 수 있습니다. 충분하지 않을 후자의 경우 this.doSomething()에서

이 아직 특별히 당신이 메소드를 호출하고자하는 클래스를 지정하는 이유 즉, FooBarthis 멤버 변수를 가리 킵니다.

2

Foo.this 외부 클래스 Foo의 객체 인스턴스를 참조합니다.이 객체 인스턴스는 항상 내부 클래스의 객체에 바인딩됩니다.

Foo가 인스턴스화되면 Foo와 FooBar가 항상 함께 인스턴스화 된 것으로 생각할 수 있습니다. 귀하의 경우에는

가 필요하지 않습니다,하지만 당신은 내부 Foo.Bar에서 그것을 필요로하는 방법에 푸 개체의 인스턴스를 전달해야하는 경우, 당신은 그것을 할 수 있습니다

// some method of some other class (OtherClass.java) 
void someFunction(Foo foo)... 

// ... 
private class FooBar extends Foo{ 
    void doAnything(){ 
     otherClass.someFunction(Foo.this); 
    } 
} 
1

Foo.this가 참조 외부 클래스 객체. 여기에서 this은 현재 클래스 객체를 참조합니다.
는 자바 docs에 따르면 .IT도

섀도 잉 라고
관련 문제