Java中的对象文字?

时间:2010-03-08 22:17:36

标签: java

我正在学习用于Web开发的GWT,并遇到了一段我无法理解的代码。

helloBtn.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        Window.alert("Hello!");
    }
});

如果有人能向我解释它的作用会很棒。

谢谢,约翰

4 个答案:

答案 0 :(得分:11)

这是anonymous inner class

在这种情况下,代码声明一个实现ClickHandler接口的未命名类。运行时,将创建该类的实例并将其传递给addClickHandler

答案 1 :(得分:3)

我认为您遇到麻烦的部分是匿名课程。这里发生的是你在helloBtn对象上调用addClickHandler方法并向它传递一个匿名类实例。

addClickHandler方法将ClickHandler的实例作为参数。以下代码创建了实现ClickHandler接口的匿名类。

new ClickHandler() {
public void onClick(ClickEvent event) {
    Window.alert("Hello!");
}

您可以通过首先定义类来重写代码。

public class MyClickHandler implements ClickHandler {
  public void onClick(ClickEvent event) {
    Window.alert("Hello!");
  }
}

然后创建类的实例并将其传递给addClickHandler方法。

ClickHandler myClickHandler = new MyClickHandler();
helloBtn.addClickHandler(myClickHandler);

答案 2 :(得分:0)

这是一个anonymous class - 顾名思义,一个没有名字的类可以“动态”定义。在您的示例代码中,它用于实现接口ClickHandler - 这是Java有点冗长的回调习惯用法。可以使用相同的语法来扩展类。

答案 3 :(得分:0)

在不使用匿名内部类的情况下重写代码的另一种方法如下:

ClickHandler myClickHandler = new ClickHandler() {
    public void onClick(ClickEvent event) {
        Window.alert("Hello!");
    }
}

创建一个ClickHandler对象,然后可以在需要的地方传递它:

helloBtn.addClickHandler(myClickHandler);

如果您想为多个项目使用相同的ClickHandler,这种风格会很有用,所以它看起来像这样:

helloBtn1.addClickHandler(myClickHandler);
helloBtn2.addClickHandler(myClickHandler);
helloBtn3.addClickHandler(myClickHandler);