classname.this.method的引用如何工作?

时间:2014-12-09 14:10:47

标签: java this

例如,我已经获得了此代码:

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}}如何指出当前的实例?

4 个答案:

答案 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)

基本上只是提示编译器/解释器在嵌套类/方法中使用外部类的引用。

您还可以将(NewProjectModalWindowthis的引用存储在(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