Java构造有什么作用?

时间:2010-04-21 09:08:37

标签: java anonymous-class

我是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;
        }
    });

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

5 个答案:

答案 0 :(得分:7)

这是Anonymous Class或匿名内部类。如果你谷歌,你会发现一些tutorials /例子。太阳has some docs也是。

答案 1 :(得分: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());

请参阅?现在你有一个只有一个函数的“显式”类。通常这会产生过多的开销,并且会使您的设计变得混乱。

这有帮助吗?

答案 2 :(得分:3)

方法addSelectionListener接收SelectionListener实例。它没有收到“代码”。令人困惑的是使用新的&lt; class / interface name&gt;(){...}。此构造用于 anonymous inner classes 。实际上,上面的代码是扩展SelectionAdapter类,覆盖其widgetSelected方法,创建新类的实例并将其传递给addSelectionListener()。

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

答案 3 :(得分: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;
    }

}

答案 4 :(得分:0)

我花了一些时间来理解匿名内部课程。要记住的基本事项是:

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

对于完全惩罚,请阅读JLS:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

如果您有兴趣了解这些事情的细节,阅读SCJP书并参加考试是好的,或者您可以学习JLS。它不会学习如何编写代码,但它将帮助您了解Java以及在某种程度上许多其他OO语言的工作方式。