Java初始化

Java初始化,java,Java,我已经多次遇到此代码,我想知道它的含义或等效于: A a = new A() { // declare some methods and whatever }; 以上是什么意思?它等价于什么(如果它等价于任何东西)?这是扩展/实现类/接口A的匿名类的实例化。这是扩展/实现类/接口A的匿名类的实例化。他们正在声明。类A可能是接口或抽象类,必须实现方法才能成为A的子类。Java允许您使用匿名类动态定义这些方法 例如,对于ActionListener,只有一种方法可以实现,即actionPerf

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

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

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

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

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

他们正在声明。类
A
可能是接口或抽象类,必须实现方法才能成为
A
的子类。Java允许您使用匿名类动态定义这些方法

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

他们正在宣布一项新的计划。类
A
可能是接口或抽象类,必须实现方法才能成为
A
的子类。Java允许您使用匿名类动态定义这些方法

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

它正在生成一个匿名的内部类:
a
不是
a
本身的一个实例,而是
a
新生成的子类的一个实例,就好像您编写了

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

但是不必编造一个
MadeUpName
,也不用太多赘言。

它是一个匿名的内部类:
a
不是
a
本身的一个实例,而是
a
的一个新生成的子类的一个实例,就好像你写了这样的东西一样

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

但是不必编造一个
MadeUpName
,而且不用太多赘言。

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

您可以将它们放在类内(使用标准的公共、私有、受保护的关键字)或类方法内(内部类)

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

相关的:


    • 这是一个匿名类。虽然我从未广泛使用过它们,但它们对于只使用一次类,或者不想用不会看到太多重用的东西“污染”顶级类层次结构的情况非常方便

      您可以将它们放在类内(使用标准的公共、私有、受保护的关键字)或类方法内(内部类)

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

      相关的:


      它也可以是一个具体的类,您希望为其提供一些附加功能,或者希望使用双括号初始化
      newhashmap(){{put(“one”,“val1”);put(“two”,“val2”);put(“three”,“val3”);}
      @ratchetfreak当然,使用双括号初始化的开销通常不值得提供简洁的语法。@ratchetfreak加上它真正有价值的实例(例如初始化集合),编译器会抱怨版本UUID。@Tim Pote,为什么不能将匿名类分离到另一个.java文件中并在其中声明,然后在原始文件中使用其实例?这不是更清楚吗?它也可以是一个具体的类,您希望为其提供一些附加功能,或者希望使用双括号初始化
      newhashmap(){{put(“one”,“val1”);put(“two”,“val2”);put(“three”,“val3”);}
      @ratchetfreak当然,使用双括号初始化的开销通常不值得提供简洁的语法。@ratchetfreak加上它真正有价值的实例(例如初始化集合),编译器会抱怨版本UUID。@Tim Pote,为什么不能将匿名类分离到另一个.java文件中并在其中声明,然后在原始文件中使用其实例?这不是更清楚吗?