twilight1730の資料室(wiki別館)
Java雑記002(内部クラスを含むjavaファイルのコンパイルについて)
最終更新:
twilight1730
-
view
内部クラスを持つクラスをコンパイルする際にちょっとだけ気になる点があったため調べてみました。
まず次の簡単なJavaソースを書きます
public class Main{
public Main(){
System.out.println("Main");
new Inner();
}
public static void main(String[] args){
new Main();
}
public class Inner{
public Inner(){
System.out.println("Main.Inner");
}
}
}
このコードをコンパイルして実行すると次の実行結果が得られます
C:\Java\Zakki02>java Main
Main
Inner
Main
Inner
問題は作成されるクラスファイルで、Main.classと&bolc(){Main$Inner.class}が作成されます。一方、Javaのキーワードは$を含むことを認めています。つまり、Main$Innerクラスも単独で作成が可能です。例えば次のコードは問題なく動きます。
Main.java
public class Main{
public Main(){
System.out.println("Main");
new Main$Inner();
}
public static void main(String[] args){
new Main();
}
}
Main$Inner.java
public class Main$Inner{
public Main$Inner(){
System.out.println("Inner");
}
}
これをMain$Inner⇒Mainの順番でコンパイルすれば、やはり先ほどと同じ実行結果が得られます。
では、MainクラスがInnerという名前の内部クラスを持っていて、且つMainInnerクラスが同パッケージ内に存在した場合、どうなるのでしょうか。次のコードをコンパイルしてみます
public class Main{
public Main(){
System.out.println("Main");
new Inner();
new Main$Inner();
}
public static void main(String[] args){
new Main();
}
public class Inner{
public Inner(){
System.out.println("Main.Inner");
}
}
}
Main$Inner.java
public class Main$Inner{
public Main$Inner(){
System.out.println("Main$Inner");
}
}
コンパイル結果は次のとおりです
Main.java:5: エラー: シンボルをみつけられません
new Main$Inner();
new Main$Inner();
シンボル: クラス Main$Inner
場所: クラス Main
エラー1個
場所: クラス Main
エラー1個
先にMain$Innerクラスをコンパイルしても、コードの順序を変えても、同様のエラーが出ます。つまり、インナークラスがある場合、名前のかぶるクラス名$内部クラス名のクラスは同時にコンパイルできないようです。