Java语法:新的后面的{}语句

时间:2014-04-16 14:38:00

标签: java syntax

这是什么意思?

addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                String location = GUI.Custom.QuickDialogs.selectFile(false);
                try
                {
                    PrintWriter pw = new PrintWriter(new File(location));
                    String text = textArea.getText();
                    pw.println(text);
                    pw.flush();
                    pw.close();
                }
                catch(Exception ex)
                {
                    textArea.append("Could not save this debug output");
                }
            }
        });

新的ActionListener(){} {}发生了什么?在对象?类中声明一个方法?是ActionListener内部类?

6 个答案:

答案 0 :(得分:7)

new ActionListener()后面的花括号内的声明是anonymous class的定义{@ 1}}。

在您的情况下,匿名类提供单个方法ActionListener的实现。此功能允许您减少代码的大小,并使声明更接近于您需要仅在代码中的单个位置使用的类的情况下使用它们。

答案 1 :(得分:1)

这称为匿名类。通常,它会创建 ActionListener 接口的新实现并重载 actionPerformed 方法。

相当于

class MyActionListener implements ActionListener {

    public void actionPerformed(ActionEvent e)
    {
        String location = GUI.Custom.QuickDialogs.selectFile(false);
        ...
    }
}

addActionListener(new MyActionListener())

可在http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

找到更多信息

答案 2 :(得分:0)

使用此声明,您将使用添加的新方法ActionListener创建新的actionPerformed对象。

这等于创建扩展ActionListener的新类,如:

class MyActionListener extends ActionListener {

    public void actionPerformed(ActionEvent e) {
        // ...
    }

}

addActionListener(new MyActionListener());

答案 3 :(得分:0)

看看:

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

这个语法是匿名类,它基本上是派生类,它覆盖了这个功能,但由于它只在这个地方使用,所以可能不需要命名它。

它们几乎与lambda语句一样被创建,如果只在一个代码位置使用某些东西,为什么你真的费心去命名它,使类或命名空间更大,污染它。

答案 4 :(得分:0)

这是一个匿名内部类,一种用于简化编写单用类(通常是接口实现)的语法糖形式。

您可以阅读有关他们的更多信息here

答案 5 :(得分:0)

"匿名内部阶级"是设置听众之类的常用习惯用语。但是,在Java 8中,由于ActionListener只有一个方法,现在可以使用lambda表达式来做同样的事情。编译器会发现您正在提供actionPerformed的实现。

addActionListener((ActionEvent e) -> {
            String location = GUI.Custom.QuickDialogs.selectFile(false);
            try
            {
                PrintWriter pw = new PrintWriter(new File(location));
                String text = textArea.getText();
                pw.println(text);
                pw.flush();
                pw.close();
            }
            catch(Exception ex)
            {
                textArea.append("Could not save this debug output");
            }
        });

第一行可能只是

addActionListener(e -> {

因为编译器会发现e必须是ActionEvent;但是,人类读者可能会发现更难以发现它,这取决于他们对AWT的熟悉程度。