2011-04-01 110 views
3
rb.addActionListener(new ActionEvent(ae) { 
    public void actionPerformed(ActionEvent ae) { 
    nowCall(ae); 
    } 
}); 

另一种方式声明匿名内部类

Thread th=new Thread(Runnable r) { 
    public void run() { 
    // do something 
    } 
}; 

// notice the ending of above 2 snippets 

,我真搞看到这些two.It似乎还有声明匿名内部类没有确切的模式。

请解释匿名内部类的语法。

+0

类是匿名或内部的。你有匿名类的例子。内部类是具有名称的非静态嵌套类。 – 2011-04-01 10:32:58

+2

@Peter Oracle不同意你的看法。请参见[本地和匿名内部类](http://download.oracle.com/javase/tutorial/java/javaOO/innerclasses.html) – 2011-04-04 18:25:23

回答

2

第一种情况是将它作为参数传递给方法,而第二种情况是将其存储在局部变量中。

所以你不能真正比较两个例子对彼此。

+1

您不能直接“覆盖”一种方法。两者都是匿名的内部类,实际上他们的声明没有任何区别。 – biziclop 2011-04-01 10:09:59

+0

都是匿名的。没有区别。 – Nishant 2011-04-01 10:11:09

+0

确定它是一个匿名类。你能告诉Thread的这个特定子类的名字吗? – aioobe 2011-04-01 10:11:16

0
  1. Instanciating new anonymous class and the object to addActionListener method。

  2. Instanciating新的匿名类和对象分配到局部变量th

0

他们都是相同的。你把匿名类的声明之后,分号前: new ActionEvent(ae){class details, methods etc};

在这两种情况下

Thread(Runnable r){ public void run() { // do something }};

创建类的新实例,在第一个例子您将其用作方法的参数,并在第二次将其分配给变量。

0

区别在于您可以将接口实现为匿名内部类或扩展类。在你的例子中,两者都在扩展类

8

第二个是无效的,据我所见和测试。

什么会是比较常见的是创建一个新的Runnable实现:

Thread th=new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // This implements Runnable.run 
    } 
}); 

现在你可以只是覆盖正常线程的run方法:

Thread th=new Thread() { 
    @Override 
    public void run() { 
    // This overrides Thread.run 
    } 
}; 

...但我个人更倾向于在创建线程时单独指定Runnable

现在您在最后注意到的差异仅仅是表达式是否被用作参数(例如对于addActionListener方法或Thread(Runnable)构造函数,或者它是否直接分配给变量。认为整个new TypeName() { ... }作为一个单一的表达方式,它只是之间的区别:

Thread th = expression; 

Thread th = new Runnable(expression); 
+0

@ Jon Skeet 在你的第一个snippet runnable接口中是否实现了运行? – saplingPro 2011-04-01 10:45:58

+0

@Meprogrammer:是的,这是Runnable中唯一的方法。 – 2011-04-01 10:47:55

+0

@ Jon Skeet在所有构造函数[here](http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html)中,线程的哪个构造函数在您的第一个例。? – saplingPro 2011-04-01 11:02:56

3

[...] 通知上述2段的结束

在您的第一个示例中,尾随)仅仅是终止

rb.addActionListener(

(即你的两个例子有不同的结局,因为一个是分配

Thread th = ...;

和其他的右手边是一个参数传递给方法调用

...addActionListener(...);

创建一个匿名类的语法很简单:

new SomeClassOrInterface() { 
    // implementation goes here 
} 

正如你可以看到是您的两个例子的格局。


Anonymous Classes (Java in a Nutshell)

3.12.3。匿名类的新语法

我们已经看到了定义和实例化匿名类的语法示例。我们可以更正式表达语法为:

new class-name ([ argument-list ]) { class-body } 

或:

new interface-name() { class-body } 

此外,你必须在你的第二个例子一个错字。它应该读取new Thread() { ...new Thread(r) { ...(尽管在后一种情况下,重写的方法不会被调用)。