在HashMap
类中,有一个内部类KeySet
,其实例由HashMap
的实例方法keySet()
返回。这个内部类包含以下方法。
public void clear() {
HashMap.this.clear();
}
我理解“this
”
上述使用“this
”的风格似乎很有趣,
鉴于以上两点,应该可以对任何动态创建的实例对象进行静态引用,但这是不可能的,因为在运行时可能存在无限数量的实例,并且没有任何语言结构来指定类及其实例。
我肯定错过了一些东西,有人可以帮助我更好地理解这一点。
答案 0 :(得分:18)
当创建非静态内部类时,它会获得对其封闭类实例的引用。为了引用该实例,使用了一种特殊语法:关键字this
的前缀是封闭类的名称。如果在没有类名前缀的情况下使用,this
关键字指的是内部类本身的实例。
基本上,调用clear
类的HashMap
方法。请注意,由于内部类的方法也称为clear
,因此没有HashMap.this
的调用将被定向到内部类中的clear()
,从而导致无限递归。
RogerLindsjö在下面的评论中正确地说明了技术上这个成语被称为限定了这个构造。 (JLS 15.8.4)
答案 1 :(得分:3)
HashMap.this.clear();
调用HashMap
的当前实例,你提到它来自InnerClass的调用,这就是它引用Outter类的方式。