2014-10-27 38 views
-1

因此,当查看lambda表达式并使用它们替换Java中的EventHandler的匿名内部类时,我遇到了一些让我停下来思考的匿名内部类。例如,写的东西,一个匿名内部类,通常实现的ActionListener当我们写在Java中使用接口的匿名内部类

myJButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     //DO SOMETHING 
    } 
}); 

我与这个混淆,是ActionListener的,所以我觉得这一定有必要做类似的接口...

myJButton.addActionListener(new myButtonListener implements ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     //DO SOMETHING 
    } 
}); 

但这甚至没有编译。我想我的原因,虽然这是很明显,如果不是我们使用私有内部类,我们使用

private MyButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //DO SOMETHING 
    } 
} 
myJButton.addActionListener(new MyButtonListener()); 

所以我的问题是:

1)为什么我们能够直接从创建一个匿名内部类一个接口,而不是必须通过实现接口的类来创建一个接口?

2)为什么我无法创建一个实现ActionListener的匿名内部类,而不是直接从它创建,如我在第二个代码片段中显示的那样?

在此先感谢您的回复!

+3

您认为_anonymous_在这里表示什么? – 2014-10-27 05:30:27

回答

0

1)我们为什么能够创造从 接口的匿名内部类直接,而不是创建一个通过类 实现接口?

2)为什么我无法创建一个匿名的内部类实现 ActionListener而不是直接从它,因为我在我的第二个代码 代码片段显示?

当您使用implements XXXX一类,你要定义一个类(内或非内),你将不得不给它一个名字,相信我们可以做到这一点,这是我们经常做。虽然匿名内部类没有名称,但它更像是一个表达。


我复制这个从http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

而且我认为这将有助于你理解匿名类是什么。

匿名类是一个表达式。他们就像本地班,除了他们没有名字

。匿名类表达式的语法就像构造函数的调用一样,除了在代码块中包含类定义之外。

考虑frenchGreeting对象的实例化:

HelloWorld frenchGreeting = new HelloWorld() { 
     String name = "tout le monde"; 
     public void greet() { 
      greetSomeone("tout le monde"); 
     } 
     public void greetSomeone(String someone) { 
      name = someone; 
      System.out.println("Salut " + name); 
     } 
    }; 

匿名类表达式由以下部分组成:

  • 的新的运营商

  • 到接口的名称实施或扩大课程。在这个例子中,匿名类正在实现接口HelloWorld。

  • 圆括号包含构造函数的参数,就像普通的类实例创建表达式一样。注意:当你实现一个接口时,没有构造函数,所以你使用一对空括号,就像这个例子。

  • 身体,这是一个类声明的主体。更具体地说,在主体中,方法声明是允许的,但声明不是。

因为匿名类定义是一个表达式,它必须是语句的一部分。在这个例子中,匿名类表达式是实例化frenchGreeting对象的语句的一部分。 (这解释了为什么在右大括号后面有一个分号。)