トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Javaの文法:内部クラスと無名クラス

 概要

  • 内部クラスも無名クラスもバージョン1.1から導入された言語仕様であり、クラス内に別のクラスを記述することができる。
  • これらを用いることでJavaのGUIアプリケーションでよく使われるデリゲーション(委譲)モデルに基づくイベント処理をより簡便に記述することが可能となるため、Swingアプリケーションを作成するさいには、このような記述法をきちんと理解しておく必要がある。

 内部クラス

  • Java言語のバージョン1.1よりあるクラスの定義のブロック内にクラスを定義することが可能となった。内部クラスはその外部(親)クラスのメソッドやフィールドにアクセスすることができる
    • 親クラスのフィールドのアクセス修飾子がprvateであっても内部クラスからはアクセスすることが可能。

内部クラスの例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sample;

public class InnerClass {
    private String innerMember = "外部クラスの文字列";
    public InnerClass() {
        InInnerClass inInnerClass = new InInnerClass();
        inInnerClass.innerMethod();
    }
    //クラス内に内部クラスを定義
    private class InInnerClass {
        private String inInnerMember ="内部クラスの文字列";
        void innerMethod() {
            System.out.println("内部クラスからは外部クラスのprivate変数にアクセスできます。innerMember:"+innerMember);
            System.out.println("もちろん内部クラスからは内部クラスのprivate変数にアクセスできます。inInnerMember:"+inInnerMember);
        }
    }
    public static void main(String[] args) {
        new InnerClass();
    }
}

  • メソッド内に内部クラスを記述することもできるが、あまり使用頻度は高くないため、ここでは省略。

 無名クラス

  • 匿名クラスとも言われる
  • 一時的に使用される、(抽象)クラスを継承したり、インターフェースを実装した内部クラスについては無名クラスとして名前を省略することができる
  • 記述方法
    • 新たにインスタンス化するクラスにそのままメソッドを加えたような形式になる
new <継承するインターフェースあるいは抽象クラス名> () {
	<修飾子> <戻り値の型> <実装するメソッド名> (<引数>)
}
  • 記述方法の最初にnewがついていることでも示されているが、無名クラスはその時点でインスタンス化される

無名クラスの例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package sample.object;

public class AnonymousClass {
    class InnerClass {    //ここはclass InnerClass extends Objectと同じ意味
        @Override
        public String toString() {
            return "内部クラスのtoString()が実行されました";
        }
    }
    //デフォルトコンストラクタ
    public AnonymousClass() {
        //内部クラス
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.toString());
        //メソッド内の内部クラス
        class InnerClassInMethod {
            @Override
            public String toString() {
                return "メソッド内の内部クラスのtoString()が実行されました";
            }
        }
        System.out.println((new InnerClassInMethod()).toString());
        //匿名クラス
        System.out.println((new Object(){
            @Override
            public String toString() {
                return "匿名クラスのtoString()が実行されました";
            }
        }).toString());
    }
    public static void main(String[] args) {
        new AnonymousClass();
    }
}
AnonymousClass.java InnerClass.java

最終更新時間:2008年06月06日 17時04分35秒