2014-03-07 3 views
12

나는 내부 클래스 섹션에서 오라클의 자바 튜토리얼을 읽고 있습니다. 자바에서이 키워드

내가 튜토리얼에서 이해하지 않는 일부 코드가 this link

를 참조하십시오.

누군가 제발 내게 아래의 DataStructure 클래스의 아래 코드는 어떻게 설명 할 수 있습니까?

DataStructureIterator iterator = this.new EvenIterator(); 

는 외부 클래스는 DataStructureIterator iteratorthis.new EvenIterator() 전에 아래와 같이해야하지 : 나는 잠시 동안 검색 한하지만 난 어떤 대답을 발견하지 않았습니다

DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator(); 

.

+1

@ Ɍ.Ɉ : 나는 그것을 아직 구입할 수 있을지 모르겠다. 예, 그것은 '이'를 사용하고 있지만, 틀에 얽매이지 않는 방식으로 사용하고 있습니다. 나는 이걸로 당신이 할 수 있다는 것을 깨닫지 못했습니다. – Makoto

+0

해당 행을 실행하는 코드는 어디에 있습니까? 'this'는 내부 클래스 인스턴스 생성에 필요한 둘러싼 인스턴스입니다. –

+8

와우, 인터넷을 검색하는 데 얼마나 걸렸습니까? 먼저 플로피에 다운로드 했습니까? –

답변

6

선언문 DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator();은 유효하지만 그 방법의 컨텍스트에서는 중복됩니다. 당신은 (외부 클래스의 내부 클래스와 같은 이름을 가진) RunnableEvenIterator 내부 클래스라는 이름의 한 익명의 클래스를 볼 수 있듯이

는 내부 클래스

public void printEven() { 
    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      //Makes EvenIterator point to DataStructure's implementation 
      DataStructureIterator itr = DataStructure.this.new EvenIterator(); 
     } 

     class EvenIterator implements DataStructureIterator { 

      @Override 
      public boolean hasNext() { 
       return false; 
      } 

      @Override 
      public Integer next() { 
       return null; 
      } 

      @Override 
      public void remove() { 
      } 

     } 
    }); 
} 

충돌 거기에이 시나리오를 생각해 보자. 그러니 그냥

DataStructureIterator itr = this.new EvenIterator(); //OR DataStructureIterator itr = new EvenIterator(); 

RunnableEvenIterator을 참조합니다 기록. DataStructureEvenIterator를 가리려면, 당신은 내가 EvenIterator현재 인스턴스DataStructure, Runnable

1
public class DataStructure { 
    /** omitted */ 

    public void printEven() { 
     //#1 
     DataStructureIterator iterator = this.new EvenIterator(); 
     /** Omitted */ 
    } 

    //#2 
    private class EvenIterator implements DataStructureIterator { 
     /** Omitted */ 
    } 
} 
아닌 현재 인스턴스에 만들려 말한다

DataStructureIterator itr = DataStructure.this.new EvenIterator(); 

를 작성 할 수 있습니다

그래서 이것이 베어 본 문제입니다.

우리가 무엇을 볼 수 있습니다 :

  1. 클래스가 아닌 정적 메서드 printEven있다 DataStructure. 이 클래스의 this 키워드는 이고 항상은이 클래스의 현재 인스턴스/개체를 나타냅니다 : DataStructure.

  2. 개인 클래스입니다. 즉,이 클래스는 외부에서 볼 수 없습니다. 정적이 아니므로이 클래스 멤버 (일명 내부 클래스)를 인스턴스화 할 수 있도록 외부 클래스의 인스턴스가 필요합니다.

따라서 우리는 EvenIterator의 인스턴스를 만들고 싶습니다. 외부 클래스의 인스턴스, b. 내부 클래스의 생성자를 호출하십시오. DataStructure에서 DataStructure.this을하는

DataStructureIterator iterator = this.new EvenIterator(); 
            |  `---- Call to constructor 
            `-------------- instance of outer class 

중복입니다.우리는 우리가 DataStructure의 범위에 있다는 것을 알고 있기 때문에 단지 this을 할 것입니다. 그러나 내부 클래스 EvenIterator에 있고 명시 적으로 외부 클래스의 인스턴스에 액세스하려는 경우 내부 클래스 thisEvenIterator의 인스턴스를 의미하므로 DataStructure.this을 수행해야합니다.

1

키워드 this은 실제로 구체적인 예제에서 내부 클래스가 아닌 외부 클래스에 쓰여집니다. 따라서 어떤 식 으로든 모호하지 않습니다. DataStructure 인스턴스 만 참조 할 수 있습니다. 그러므로이 경우 DataStructure.this으로 자격을 얻는 것은 불필요합니다 (그러나 합법적 인). 내부 클래스에서 this을 사용하고 DataStructure 인스턴스를 참조하려는 경우 DataStructure.this을 작성해야합니다. Java Language Specification 15.8.3에 따르면

-

이 유형은 키워드이 발생하는 내 클래스 C입니다.

public class Test { 
    public void method1(){ 
     this. //this in here refer to "Test" class 
    } 

    public class InnerTest { 
     public void method2(){ 
      this. //this in here refer to "InnerTest" class 
     } 
    } 
} 

지금이 예에서는 "이 키워드"한 번 봐 걸릴 :

2

"이 키워드는"그래서 객체 클래스의 범위를 참조

public class Test { 
    public void method1(){ 

     InnerTest innerTest = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it ! 
     //OR 
     TestInterface innerTest2 = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it ! 
    } 

    public class InnerTest implements TestInterface{ 
     public void method2(){ 
      Test.this.method1(); //within the scope of "Test" class call the method method1 
     } 
    } 
} 

걸릴 메모를 그 이 키워드를 사용하여 클래스의 생성자를 연결할 수도 있습니다. 이 예를 살펴 :

public class Test { 

    public Test() { 
     this(0); 
    } 

    public Test(int r) { 
     // Do Something Here 
    } 
} 

결론 : 사용 클래스의 범위에 대한 포인터와 같은

"이"키워드 행위 "이"특정 클래스를 가리킬 수 있습니다 네가 원하는대로해라.

"this"키워드를 체인 클래스 생성자에도 사용할 수 있습니다!

관련 문제