僅當您的代碼被編譯時,類@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