$1のクラスファイルが作成された!?
javaファイルをコンパイルしたら
(javaのファイル名)$1.class
というクラスファイルが作成されてしまった!
例えば
- javatest.java
をコンパイルをしたら
- javatest.class
- javatest$1.class
という2つのクラスが作成された
結論
タイトルにもあるように
javaソースコードの中に
無名クラス
が宣言されているはずです。
(※匿名クラスとも呼びます)
そのため、
コンパイルすると
(javaのファイル名)$1.class
というクラスファイルが作成されます。
すなわち
$1のクラスファイルはゴミではなく
プログラムの一部です
$という表記について
って疑問もあると思います
これは
内部クラス
を表します
内部クラスとは
クラスの中に定義されているクラス
のことを言います。
内部クラスがあった場合
(javaファイル名)$(内部クラス名).class
というように作成されます。
内部クラスの例
例えば
javatest.java
の中に
innertest
という内部クラスの定義があった場合、
コンパイルすると
- javatest.class
- javatest$innertest.class
という2つのクラスが作成されます
無名クラスは内部クラスの1種
無名クラスは
内部クラスの中の1種類に過ぎません。
内部クラスには3種類あり
- メンバークラス
- ローカルクラス
- 無名クラス
の3種類が存在します。
無名クラスは文字通り
「名前がないクラス」
です。
javaのコンパイルの仕様として
名前が無い場合は「1」を付与するようになってます。
そのため
クラス名に
1
と名前が振られ
$1.class
というファイルが作成されたわけです。
$は内部クラスを表す
$1は無名クラスを表す
中級者への道
最初の疑問は
という素朴な疑問でしたが、
少し思考を先に進めると
- コンパイルにおける$の意味は?
- $1の意味は?
になりました。
更に深堀すれば
- 匿名クラス/無名クラスとは?
- 内部クラスとは?
となり、
更に更に深堀すると
- 内部クラスってどんなものがあるの?
- 内部クラスはどういう時に使うの?
と調べていけば、これだけで
Javaに詳しい人
に1歩近づきます
最初は超初心者みたいな疑問ですが
掘り下げていくと
中・上級者への道が開けていきます
(更にいえば次にコーディングするときに内部クラスを使用してコーディングするとなお良し!)
参考
内部クラスって何?
匿名クラスって何?
と知りたい人は以下を参考にしてください。
【Java】インナークラス(内部クラス)って何?概要から使い方まで解説