17

クラスには、インスタンス メソッドによってインスタンスが返されるHashMap内部クラスがあります。この内部クラスには、次のメソッドが含まれています。KeySetHashMapkeySet()

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

this「 」の一般的なセマンティクスを理解しています

  1. 「現在の」オブジェクトへの参照です。
  2. 構築中のオブジェクトまたはメソッドが呼び出されているオブジェクトへの参照として機能するコンストラクタまたは任意のインスタンス メソッド内で使用できます。

上記の " this" の使用スタイルは面白そうですが、

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

上記の 2 つを考えると、動的に作成されたインスタンス オブジェクトへの静的参照を持つことができるはずですが、実行時に無限の数のインスタンスが存在する可能性があり、クラスとそのインスタンス。

私は間違いなく何かが欠けています。誰かがこれをよりよく理解するのを手伝ってくれますか?

4

2 に答える 2

20

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

基本的に、呼び出しはクラスのclearメソッドに対して行われます。内部クラスのメソッドも呼び出されるため、呼び出さないと内部クラスの内部に向けられ、無限再帰が発生HashMapすることに注意してください。clearHashMap.thisclear()

以下のコメントでRoger Lindsjöが正しく述べているように、技術的には、このイディオムは修飾されたこの構造として知られています。(JLS 15.8.4)

于 2013-06-08T12:40:31.763 に答える
3

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

于 2013-06-08T12:40:14.657 に答える