1

我已经多次遇到此代码,我想知道它的含义或等效于:

A a = new A() {
  // declare some methods and whatever
};

以上是什么意思?它等同于什么(如果它等同于任何东西)?

4

4 回答 4

6

他们声明了一个匿名类。类A(可能)是接口或抽象类,必须具有实现的方法才能成为A. Java 允许您使用匿名类动态定义这些方法。

例如,只有一种方法可以实现 for ActionListener,即actionPerformed(ActionEvent). 很多时候,在匿名类中定义该方法更容易,如下所示:

ActionListener myListener = new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    // do other stuff for action performed
  }
}

根据OP的评论进行编辑

您当然可以为一个类创建一个类文件ActionListener并创建一个类的新实例,而不是创建一个匿名类。也就是说,假设您可以在单独的课程中完成您需要做的所有事情。很多时候定义了匿名类和内部类,以便您可以访问外部类的字段和方法。如果内部类“属于”外部类而不属于其他类,那么定义内部类或匿名类也是面向对象的许多倍。

于 2012-05-01T01:40:46.820 回答
4

它正在创建一个匿名内部类:a不是A自身的实例,而是新创建的子类的实例A,就好像你写了类似的东西

public class MadeUpName extends A {
    ...
}
A a = new MadeUpName();

但不必编造一个MadeUpName并且用更少的措辞。

于 2012-05-01T01:43:49.463 回答
2

这是一个匿名类。虽然我从未广泛使用过它们,但它们对于您只使用一次类或不想用不会被重用的东西“污染”您的顶级类层次结构的情况很方便.

您可以将它们放在一个类中(使用标准的public、private、protected关键字)或类方法(内部类)。

我找不到一个非常好的、简洁的文章/教程,但这没关系:

简而言之,来自 java 的匿名类

有关的:

于 2012-05-01T02:02:59.883 回答
1

这是扩展/实现类/接口 A 的匿名类的实例化。

于 2012-05-01T01:40:34.987 回答