re匿名内部类的多个实例

时间:2011-01-27 18:00:07

标签: java anonymous-inner-class

这与我对此主题中提供的问题的回答有关:Are Inner Classes lightweight?

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

2 个答案:

答案 0 :(得分:17)

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

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万个对象。

答案 1 :(得分:4)

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

有证据表明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