私にはわかりません。仕様をくまなく調べると、内部クラスを通常のクラスと同じように扱うべきであるという証拠が見つかるかもしれません。ただし、精神的には、内部クラスは外部インスタンスに依存し、クラスはインスタンスを超えて存在しません。これは、存在が基本的に永続的な「通常の」クラスとは異なります。もちろん、2 つの外部インスタンスの 2 つの内部クラスは、同じソース コードで作成されているため、ある程度相互に関連していますが、それはそれらが同一または同等である必要があるという意味ではありません。
Java 設計者がこのように意図した証拠があり、内部クラスの精神は外部インスタンスのスコープ内に存在します。たとえば、奇妙な構文outerInstance.new InnerClass()
. たとえば、静的変数はなく、内部クラスの静的初期化子もありません。クラスのアンロード [1] の議論では、この議論は実際には内部クラスには当てはまらないことがわかります。内部クラスはアンロードできると考えられます! VM が新しい外部インスタンスごとに新しい内部クラスを作成することが考えられます。
実際にはそうではなく、内部クラスは通常のクラスと同じように扱われます。しかし、概念的には、インスタンス プライベート クラスとして常に別の方法で考えます。
[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7
更新: [2] によると
2 つの参照型は、... 同じバイナリ名を持っている場合、同じランタイム型です
[3]
匿名クラス (§15.9.5) のバイナリ名は、すぐ外側の型のバイナリ名、$、空でない一連の数字で構成されます。
したがって、1 つの匿名クラスには 1 つのバイナリ名があるため、実行時の型は 1 つだけです。仕様は、匿名クラスの異なるインスタンスが同一のクラスを持つことを保証します。
[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