2010-04-21 91 views
8

我对Java如此忍受我,如果这是一个可笑的简单问题,但我很好奇它有这个方法调用{}代码正在采取的 - 请参见下面的代码在方法addSelectionListener一个例子。这样做的目的是什么?我一直在寻找解释的文件,但似乎无法找到这种做法被称为不要介意任何有用的信息。这个Java构造是做什么的?

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

匿名类再次罢工!不能真的责怪人们不能找到一些他们不知道的名字的参考... – 2010-04-21 09:14:38

+5

“我新来的java如此裸露在我身边......” - 我敢打赌,你说所有的guys :-) – 2010-04-21 09:15:14

+0

当我开始学习Java以及:)时,我挣扎于这些:) – Skurmedel 2010-04-21 09:17:59

回答

7

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

+0

谢谢你们的帮助,非常感谢。 – BandyOrc 2010-04-21 09:24:25

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; 
    } 

} 
3

方法addSelectionListener接收SelectionListener中实例。它不会收到“代码”。令人困惑的是使用新的<类/接口名称>(){...}。这种结构用于anonymous inner classes。实际上什么上面的代码没有被延伸的SelectionAdapter类,覆盖其widgetSelected方法,创造了新的类的一个实例,并将其传递给addSelectionListener()。

匿名内部类的使用与侦听器很常见,我们在这里创建一个新类,以用于某个特定的地方。因此我们不给它起一个名字,我们希望直接在使用它的上下文中实现它。

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(新MyClass的());

请参阅?现在你只有一个“显式”类,只有一个函数。通常这会造成太多的开销,并且会让你的设计混乱。

这是否帮助?

0

我花了一些时间来了解匿名内部类。基本的事情要记住的是:

它们就像参数,除了传递一个基本类或对象,你传递一个类实现一个接口/扩展一个类(是的,他们也工作与接口)取决于方法参数。 它们是匿名的,所以在方法弹出堆栈后立即“消失”。 });对于一个匿名的内心阶层来说,这是一场死亡的弃权。 它们经常在用户界面中为侦听器事件弹出 它们可以节省代码中的混乱,但也会使其难以阅读。

对于全处罚读JLS:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

如果您有兴趣了解这些事情的细节问题,读取SCJP书和做考试是好还是可以学习JLS。它不会学习如何编写代码,但它可以帮助您了解Java以及其他许多OO语言如何工作。