2013-06-08 21 views
17

W HashMap klasie istnieje wewnętrzna klasa KeySet którego wystąpienie jest zwracane przez HashMap „s przykład metody keySet(). Ta klasa wewnętrzna zawiera następującą metodę.HashMap.this.clear() co to znaczy, jak to działa

public void clear() { 
    HashMap.this.clear(); 
} 

Rozumiem ogólne semantyki "this"

  1. Jest to odniesienie do "bieżącego" obiektu.
  2. Może być stosowany w konstruktorach lub dowolnych metodach instancji, gdzie działa jako odniesienie do konstruowanego obiektu lub obiektu, którego metody są wywoływane.

Powyższy styl używając „this” wydaje się interesujący,

  1. To jest używany tak, jakby jego statycznej zmiennej klasy.
  2. Powinny one nadal odnosić się do obiektu, którego metoda jest wywoływana. W tym przypadku logicznie powinna to być instancja HashMap.

Biorąc powyższe pod uwagę dwa powinno być możliwe, aby mieć statyczny odniesienie do wszelkich dynamicznie utworzonej instancji obiektu, ale to nie jest możliwe, ponieważ nie może być nieskończona liczba wystąpień w czasie rzeczywistym i nie są dowolny język konstruuje określić ten relacja między klasą a jej instancjami.

Zdecydowanie brakuje czegoś, czy ktoś może mi pomóc lepiej to zrozumieć.

Odpowiedz

18

Po utworzeniu niestatycznej klasy wewnętrznej otrzymuje ona odwołanie do instancji klasy otaczającej. Aby odwołać się do tej instancji, używana jest specjalna składnia: słowo kluczowe this jest poprzedzone nazwą klasy zamykającej. W przypadku użycia bez prefiksu nazwy klasy słowo kluczowe odnosi się do instancji samej klasy wewnętrznej.

Zasadniczo wywołanie jest wykonywane dla metody clear klasy HashMap. Zauważ, że skoro metoda klasy wewnętrznej nazywa się również clear, wywołanie bez HashMap.this byłoby skierowane do klasy wewnętrznej, powodując nieskończoną rekursję.

Jak słusznie stwierdził Roger Lindsjö w komentarzu poniżej Technicznie idiom znany jest pod nazwą , który zakwalifikował ten konstrukt do postaci. (JLS 15.8.4)

+0

Dzięki, że ma sens, możesz podać jakieś odniesienie. – sandeepkunkunuru

+0

Super dochodzenie i doskonały opis! –

+1

@kunkunur Zobacz sekcję o Shadowing tutaj: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html – Nick

3

HashMap.this.clear(); zwraca bieżące wystąpienie HashMap, wspomniałeś, że jej wywołanie z InnerClass, tak to w jaki sposób jego przedstawieniu klasę outter.