twilight1730の資料室(wiki別館)

Java雑記002(内部クラスを含むjavaファイルのコンパイルについて)

最終更新:

twilight1730

- view
管理者のみ編集可


内部クラスを持つクラスをコンパイルする際にちょっとだけ気になる点があったため調べてみました。



1.内部クラスを持つクラス(Main.java)

まず次の簡単な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.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();

シンボル: クラス Main$Inner
場所: クラス Main
エラー1個

先にMain$Innerクラスをコンパイルしても、コードの順序を変えても、同様のエラーが出ます。つまり、インナークラスがある場合、名前のかぶるクラス名$内部クラス名のクラスは同時にコンパイルできないようです。
記事メニュー
ウィキ募集バナー