Подтвердить что ты не робот

HashMap.this.clear() Что это значит, как это работает

В классе HashMap существует внутренний класс KeySet, экземпляр которого возвращается методом экземпляра HashMap keySet(). Этот внутренний класс содержит следующий метод.

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

Я понимаю общую семантику "this"

  • Это ссылка на "текущий" объект.
  • Может использоваться внутри конструкторов или любых методов экземпляра, где он действует как ссылка на объект, который создается, или объект, методы которого вызывается.

Вышеупомянутый стиль использования "this" кажется интересным,

  • Он используется как статическая переменная класса.
  • Он все равно должен ссылаться на объект, метод которого вызывается. В этом логически это должен быть экземпляр HashMap.

Учитывая вышеприведенные два, должно быть возможно иметь статическую ссылку на любой динамически созданный экземплярный объект, но это невозможно, так как во время выполнения может быть бесконечное количество экземпляров, и для любых отношений языка между классами и его экземпляры.

Я определенно что-то пропустил, может кто-то поможет мне понять это лучше.

4b9b3361

Ответ 1

Когда создается нестатический внутренний класс, он получает ссылку на свой экземпляр класса-оболочки. Чтобы ссылаться на этот экземпляр, используется специальный синтаксис: ключевое слово this имеет префикс имени охватывающего класса. При использовании без префикса имени класса ключевое слово this относится к экземпляру самого внутреннего класса.

По существу, вызов выполняется с помощью метода clear класса HashMap. Обратите внимание: поскольку метод внутреннего класса также называется clear, вызов без HashMap.this был бы направлен на clear() внутри внутреннего класса, что вызвало бы бесконечную рекурсию.

Как правильно сказано Роджером Линдсьо в комментарии ниже Технически идиома известна как квалифицированная эта конструкция. (JLS 15.8.4)

Ответ 2

HashMap.this.clear(); вызывает текущий экземпляр HashMap, вы упомянули, что его вызов из InnerClass, так как он ссылается на класс Outter.