仅当您的代码被编译时,类@Inner
才被创建,因为@EJP评论。查看编译输出时可以轻松验证这一点。
我创建了一个名为Outer.java
的.java文件,并对其进行简单编译。结果是两个.class文件。
你可以看到,创建了一个名为Outer.class
一个类文件,但也被称为Outer$1Inner.class
类文件,这简直是你的本地类编译器。在这里,Java使用$1
来标记内部的匿名类。
添加main
方法,并呼吁new Outer().test();
你可以看到输出确实是10日线,这意味着10个实例Inner
创建。您可以轻松地通过添加hashCode()
某处输出像这样
System.out.println("display: outer_x = " + outer_x + " --> " + hashCode());
这给下面的输出验证这一点:
display: outer_x = 100 --> 1704856573
display: outer_x = 100 --> 705927765
display: outer_x = 100 --> 366712642
display: outer_x = 100 --> 1829164700
display: outer_x = 100 --> 2018699554
display: outer_x = 100 --> 1311053135
display: outer_x = 100 --> 118352462
display: outer_x = 100 --> 1550089733
display: outer_x = 100 --> 865113938
display: outer_x = 100 --> 1442407170
不同的散列码的意思是不同的实例。
现在发生这种情况的原因是,编译器在收集类时并不关心像for
这样的控制流语句。它看到内部类并编译一次。另一方面,输出发生在运行时间并遵循控制流程语句。
创建了10个对象,您可以检查调试时创建的对象的哈希码。 – suiwenfeng
[Java:对象的散列函数]的可能重复(http://stackoverflow.com/questions/7422998/java-hash-function-for-objects) – suiwenfeng
内核类在编译时创建一次。 – EJP