2013-06-08 9 views
17

HashMapクラスには内部クラスKeySetがあり、そのインスタンスはHashMapのインスタンスメソッドkeySet()によって返されます。この内部クラスには、次のメソッドが含まれています。HashMap.this.clear()これはどういう意味ですか?

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

私はそれは、 "現在の" オブジェクトへの参照である "this"

  1. の一般的な意味を理解しています。
  2. コンストラクタまたはインスタンス化されたオブジェクトまたはメソッドが呼び出されているオブジェクトへの参照として機能する任意のインスタンスメソッド内で使用できます。 「this」を使用して上記のスタイルが面白いようだ

  1. それは、クラスのその静的変数かのように使用されています。
  2. まだメソッドが呼び出されているオブジェクトを参照する必要があります。これは論理的にはHashMapインスタンスでなければなりません。

動的に作成されたインスタンスオブジェクトを静的に参照することは可能ですが、実行時に無数のインスタンスが存在する可能性があり、これを指定する言語構造がないため不可能ですクラスとそのインスタンスとの関係

私は間違いなく何かを見逃しています。

答えて

18

非静的な内部クラスが作成されると、その内部のクラスインスタンスへの参照が取得されます。そのインスタンスを参照するために、特殊な構文が使用されます。キーワードthisには、囲むクラスの名前の接頭辞が付きます。クラス名接頭辞なしで使用される場合、thisキーワードは内部クラス自体のインスタンスを参照します。

HashMapクラスのclearメソッドが本質的に呼び出されます。内部クラスのメソッドもclearと呼ばれているので、HashMap.thisのない呼び出しは内部クラスの内部のclear()に送られ、無限再帰を引き起こすことに注意してください。

以下のコメントでRogerLindsjöによって正しく述べられています。技術的には、イディオムはと呼ばれ、この構造と呼ばれています。 (JLS 15.8.4)

+0

ありがとうございます。参考にしてください。 – sandeepkunkunuru

+0

スーパー調査と優れた説明! –

+1

@kunkunurここでシャドウイングのセクションを参照してください。http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html – Nick

3

HashMap.this.clear();は現在のインスタンスをHashMapと呼びますが、その呼び出しはInnerClassから呼び出されているので、Outterクラスの参照方法がわかります。

関連する問題