2011-12-09 26 views
3

如果我这样做,“这个”参考在施工期间转义?

final class FooButton extends JButton{ 
    FooButton(){ 
     super("Foo"); 
     addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       // do stuff 
      } 
     }); 
    } 
} 

我我让this参考隐含逃脱呢?

+0

你是什么意思? – adarshr

回答

5

是的,因为在匿名内部类,你可以这样访问:在FooButton对象之前

final class FooButton extends JButton { 
    Foo() { 
     super("Foo"); 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       FooButton button = FooButton.this; 
       // ... do something with the button 
      } 
     }); 
    } 
} 

匿名ActionListener的代码,原则上可以调用,使用FooButton完全初始化。

+0

“FooButton.this”类构造的正式名称是什么? – Geek

+1

@Geek,[限定此](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.4) – mre

1

是的,ActionListener的匿名内部类对this的引用。

1

是的。封闭类的this隐含在非静态匿名类中。

7

是的,这个引用转义给了监听者。由于这个监听器并不是一个真正的外部类,所以我没有看到任何问题。

在这里你可以看到,这个逃逸:

final class FooButton extends JButton{ 
    Foo(){ 
     super("Foo"); 
     addActionListener(new ActionListener(){ 
      private buttonText = FooButton.this.getText(); // empty string 

      @Override 
      public void actionPerformed(ActionEvent e){ 
       // do stuff 
      } 
     }); 
     this.setText("Hello"); 
    } 
}