17

HashMap类中有一个内部类KeySet,其实例由HashMap的实例方法返回keySet()。这个内部类包含以下方法。

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

我理解“ this”的一般语义

  1. 它是对“当前”对象的引用。
  2. 可以在构造函数或任何实例方法中使用,其中它充当对正在构造的对象或正在调用其方法的对象的引用。

上面使用 " this" 的风格看起来很有趣,

  1. 它被用作一个类的静态变量。
  2. 它仍然应该引用一个正在调用其方法的对象。从逻辑上讲,它应该是一个 HashMap 实例。

鉴于上述两个,应该可以对任何动态创建的实例对象进行静态引用,但这是不可能的,因为在运行时可能有无限数量的实例,并且没有任何语言结构来指定类与其之间的这种关系实例。

我肯定错过了一些东西,有人可以帮助我更好地理解这一点。

4

2 回答 2

20

创建非静态内部类时,它会获取对其封闭类实例的引用。为了引用该实例,使用了一种特殊的语法:关键字this以封闭类的名称作为前缀。当不使用类名前缀时,this关键字指的是内部类本身的实例。

本质上,调用是对类的clear方法进行的HashMap。请注意,由于内部类的方法也被调用clear,因此调用HashMap.this将被定向到clear()内部类内部,从而导致无限递归。

正如 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 回答