re一个匿名内部类的多个实例

这与我在这个post中提供的问题的答案有关: Inner Classes是轻量级的吗?

我记得从我的阅读中可以看出,如果你只能从一个匿名的内部类创建一个对象,那么,如果你想创建一个ActionListener类并想要从这个类中创建多个对象(不使用reflection),不使用匿名的内部类,而是使用私有的内部类或类的立场,但人们告诉我,我错了。 有人可以帮我澄清一下吗? 请查看链接,因为它包含更多详细信息,但如果有任何不清楚,请询问!

您可以创建任意数量的匿名类对象,您可以在代码中的一个位置创建它们(除非您复制代码)

 ExecutorService service = ... for(int i=0;i<1000*1000;i++) { final int finalI = i; service.submit(new Runnable() { public void run() { System.out.println("Task "+finalI+" run."); } }); } 

此代码将创建同一类的100万个对象。

我不清楚。 也许如果我们梳理规范,我们会发现内部类应该被视为与普通类相同的证据。 但是在精神上,内部依赖于外部实例 ,该类不存在于实例之外。 这与“普通”类不同,后者的存在基本上是永久性的。 两个外部实例的两个内部类当然在某种程度上相互关联,由相同的源代码创建,但这并不意味着它们必须相同或甚至相等。

有证据表明Java设计者就是这样想的,即精神内部的一个类存在于外部实例的范围内。 例如,好奇的语法outerInstance.new InnerClass() 。 例如,没有静态变量,没有内部类的静态初始化器。 在类卸载[1]的讨论中,我们看到参数并不真正适用于内部类,可以想象内部类可以被卸载! 可以想象,VM为每个新的外部实例创建一个新的内部类。

实际情况并非如此,内部类确实被视为与普通类相同。 但从概念上讲,我总是会以不同的方式来思考它们,例如私有类。

[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

更新:根据[2]

如果两个引用类型具有相同的二进制名称,则它们是相同的运行时类型

和[3]

匿名类的二进制名称(第15.9.5节)由其直接封闭类型的二进制名称组成,后跟$,后跟非空数字序列。

因此,一个匿名类具有一个二进制名称,因此只有一个运行时类型。 规范保证我们匿名类的不同实例具有identitcal类。

[2] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.4

[3] http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#44909