例如,我已经获得了此代码:
public class NewProjectModalWindow extends Window
{
private void initComponents()
{
cancel = new Button("Cancel");
cancel.addClickListener(new Button.ClickListener()
{
@Override
public void buttonClick(ClickEvent event) {
NewProjectModalWindow.this.close();
}
});
}
}
this
在这种情况下如何运作?我的意思是 - 在匿名课程中我如何理解我想要close
this
NewProjectModalWindow
实例的NewProjectModalWindow.this
方法?
如何使用this
在内存中的一堆对象中找到我的对象?
{{1}}如何指出当前的实例?
答案 0 :(得分:2)
NewProjectModalWindow.this
引用匿名内部类的封闭实例,因此它引用创建Button.ClickListener
实例的同一实例。
以下是相关的JLS entry:
15.8.4。合格的
任何词汇封闭的实例(第8.1.3节)都可以被引用 显式限定关键字this。
设T为TypeName表示的类型。令n为整数,使得T 是类或词的第n个词汇封闭类型声明 出现限定条件的接口。
TypeName.this形式的表达式的值是n' 在词汇上包含这个例子。
表达式的类型是T.
如果表达式出现在类或中,则是编译时错误 接口,它不是类T或T本身的内部类。
答案 1 :(得分:1)
基本上只是提示编译器/解释器在嵌套类/方法中使用外部类的引用。
您还可以将(NewProjectModalWindow
)this
的引用存储在(final)变量中,并在嵌套的类/方法中使用它。
答案 2 :(得分:1)
这引用了实现,实现通常在定义类时或在实现的方法中位于顶部,在您的情况下是ActionListener。
当您使用面向对象语言时,您创建对象,但由于对象ActionListener是一个实现,因此您使用this
作为对象参考,在您的情况下,它是在一个实现方法中因此{{1将引用被调用的方法,即“ActionListener”
你可以使用this
,如下所示:
this
你也可能遇到public class MyClass implements ActionListener //implemented
public MyClass()
{
JButton btn = new JButton("Button");
btn.addActionListener(this); //refers to the class - which is implementing ActionListener
}
,这是指扩展类。
简单地说: 它是对包含它的方法或类的引用。
在这里阅读更多相关信息: How to use: this
答案 3 :(得分:0)
Java中非静态内部类的每个实例都引用了外部类的实例。在创建内部类的实例时提供此引用。您可以在创建内部类的实例时显式指定外部类实例:
outerClassInstance.new InnerClass(...)
当您处于此内部类的外部类的范围内时,并且在创建内部类的实例(即new InnerClass(...)
)时未显式指定外部类实例,this
隐式使用(或SomeOuterLevelClass.this
,如果直接外部类不是正确的类型,其中SomeOuterLevelClass
是最正确的类型的封闭类),就好像你写了this.new InnerClass(...)
一样。
现在,您的示例中的内容是匿名类。当在非静态范围内创建时,匿名类是非静态内部类,因此上面的内容适用(它具有对外部类的实例的引用),除了您不能显式指定实例创建匿名类的实例时的外部类;它被强制为this
。