8

如果这是一个非常简单的问题,我是 Java 新手,所以请耐心等待,但我对这个包含 {code} 的方法调用感到好奇 - 请参阅下面的代码以获取方法 addSelectionListener 中的示例。这样做的目的是什么?我一直在查看文档以寻求解释,但似乎找不到这种做法的名称,不要介意任何有用的信息。

    setStatusLine.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {

            String message = "I would like to say hello to you.";
            if (pressed) {
                message = "Thank you for using me";
            }
            setStatusLine(message);
            pressed = !pressed;
        }
    });

感谢您提供的任何帮助或见解

4

5 回答 5

7

这是一个匿名类或匿名内部类。如果你用谷歌搜索,你会找到一些教程/示例。Sun也有一些文档

于 2010-04-21T09:13:42.007 回答
4

正如其他贡献者已经说过的:这是一个匿名类

您可以在名为 McClass.java 的新文件中创建一个名为 MyClass 的新类,如下所示:

class MyClass extends SelectionAdapter {

  public void widgetSelected(SelectionEvent e) {
    <your code that's being executed whenever the widget is being selected>
  }

}

然后你可以像这样改变第一行:

setStatusLine.addSelectionListener(new MyClass());

看?现在你有了一个只有一个函数的“显式”类。通常这是太多的开销,并且会使您的设计混乱。

这有帮助吗?

于 2010-04-21T09:25:14.403 回答
3

addSelectionListener 方法接收一个 SelectionListener 实例。它没有收到“代码”。令人困惑的是使用新的<类/接口名称>(){...}。此构造用于匿名内部类。事实上,上面的代码所做的是扩展 SelectionAdapter 类,覆盖它的 widgetSelected 方法,创建新类的实例并将其传递给 addSelectionListener()。

匿名内部类的使用在侦听器中很常见,我们在其中创建一个新类,用于一个特定的地方。因此我们不给它一个名字,我们更喜欢直接在使用它的上下文中实现它。

于 2010-04-21T09:21:56.253 回答
2

实际上没有方法调用......这段代码在setStatusLine组件上设置了一个选择监听器。

此代码的等效项可能是

public class X implements SelectionListener{

    //In the constructor or an other method.
    setStatusLine.addSelectionListener(this);

    public void widgetSelected(SelectionEvent e) {

        String message = "I would like to say hello to you.";
        if (pressed) {
            message = "Thank you for using me";
        }
        setStatusLine(message);
        pressed = !pressed;
    }

}
于 2010-04-21T09:18:05.137 回答
0

我花了一些时间来理解 Anonymous Inner 类。要记住的基本事项是:

它们就像参数一样,除了传入一个实现接口/扩展类的类(是的,它们也与接口一起使用),而不是传入一个基元或对象,具体取决于方法参数。它们是匿名的,因此在方法从堆栈中弹出后立即“消失”。}); 对于匿名的内部类来说是一个死的赠品。它们经常在用户界面中弹出用于侦听器事件。它们可以在您的代码中节省混乱,但也会使其更难阅读。

如需全面处罚,请阅读 JLS:http: //java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

如果您有兴趣了解这些事情的细节,阅读 SCJP 的书并参加考试是很好的,或者您可以学习 JLS。它不会教您如何编码,但会帮助您了解 Java 以及许多其他 OO 语言的工作原理。

于 2010-04-21T12:36:21.847 回答