声明匿名内部类

时间:2011-04-01 10:04:52

标签: java

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

我真的很困惑看到这两个。似乎没有确切的模式来声明一个匿名的内部类。

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

6 个答案:

答案 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);

答案 1 :(得分: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) { ...(虽然在后一种情况下,不会调用被覆盖的方法)。

答案 2 :(得分:2)

不同之处在于,在第一种情况下,您将其作为参数传递给方法,而在第二种情况下,您将其存储在局部变量中。

因此,您无法将两个示例相互比较。

答案 3 :(得分:0)

  1. 实例化新的匿名类并将对象传递给addActionListener方法。

  2. 实例化新的匿名类并将对象分配给局部变量th

答案 4 :(得分:0)

他们都是一样的。您在声明之后,在分号之前放置匿名类: new ActionEvent(ae) {class details, methods etc} ;

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

在这两种情况下,您都会创建一个新的类实例,在第一个示例中,您将其用作方法的参数,在第二个示例中,您将其分配给变量。

答案 5 :(得分:0)

不同之处在于您可以将接口实现为匿名内部类或扩展类。在你的例子中,两者都在扩展一个类