第二十三章 
 〜クラス編〜
 無名クラス
無名クラスというのを一言で言うとクラス名が無いクラスです。(そのまんまですね
説明はちょっとしにくいので、具体的にどんな感じかと言うですと、
オブジェクトを作成するときに、クラスを宣言するって感じです。

書式:
 new コンストラクタ(){
   フィールド(インスタンス変数)
      :
    メソッド(インスタンスメソッド)
      :
   };

上の書式のような形になってるです。
そして具体的には、戻り値などで利用したりするです。

アクセス修飾子 作成するクラス名 メソッド名(){
  return new コンストラクタ(){
    フィールド(インスタンス変数)
       :
     メソッド(インスタンスメソッド)
       :
  };
}

実際にこれを使うと何がおこるかというですと、
継承無しでポリもーフィズムを実現させることができるです。

そのサンプルプログラムを見てみるです。内容はRei20_1をベースにしてみたです。
Rei23_1
 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:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
public class Rei23_1{
    public static void main(String[] args){
        Animal[] animals = {
            SelectAnimal.Carnivorous(), SelectAnimal.Herbivorous() };
        
        for(int i=0; i<animals.length; i++){
            animals[i].eat();
        }
    
        for(int i=0; i<animals.length; i++){
            String element = animals[i].getType();
            int ryou = animals[i].getRyou();

            System.out.println(element + "が食べた量" + ryou);
        }
    }
}

abstract class Animal{
    protected int ryou;

    public int getRyou(){
        return ryou;
    }

    public abstract void eat();
    public abstract String getType();
}

class SelectAnimal{
    //肉食動物////////////////////////
    public static Animal Carnivorous(){
        return new Animal(){
            public void eat(){
                System.out.println("肉を食べる");
                ryou = 1000;
            }

            public String getType(){
                return "肉食動物";
            }
       };
    }

    //草食動物////////////////////////
    public static Animal Herbivorous(){
        return new Animal(){
            public void eat(){
                System.out.println("草を食べる");
                ryou = 300;
            }

            public String getType(){
                return "草食動物";
            }

        };
    }
}

SelectAnimalクラスでどの動物かを選択するような形になってるです。選択すると
同時に、そのクラスの処理を定義しているです。

SelectAnimalクラスを作らずに、直接main()メソッド内の配列でnew 動物()を使う
サンプルも見てみるです〜
Rei23_1
 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:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
public class Rei23_2{
    public static void main(String[] args){
        Animal[] animals = {
            //肉食動物////////////////////////
            new Animal(){
                public void eat(){
                    System.out.println("肉を食べる");
                    ryou = 1000;
                }

                public String getType(){
                    return "肉食動物";
                }
            },
            
            //草食動物////////////////////////
            new Animal(){
                public void eat(){
                    System.out.println("草を食べる");
                    ryou = 300;
                }

                public String getType(){
                    return "草食動物";
                }
            }
        };
        
        for(int i=0; i<animals.length; i++){
            animals[i].eat();
        }
    
        for(int i=0; i<animals.length; i++){
            String element = animals[i].getType();
            int ryou = animals[i].getRyou();

            System.out.println(element + "が食べた量" + ryou);
        }
    }
}

abstract class Animal{
    protected int ryou;

    public int getRyou(){
        return ryou;
    }

    public abstract void eat();
    public abstract String getType();
}

このプログラムだとどんな動物かは分からないですが、宣言されてる内容からそれ
ぞれ、肉食、草食と判断することができるです。ただ、無名クラスは宣言しすぎると
見た目がきたなく、分かりづらくなってしまう欠点もあるです。

TOPに戻る  
Java講座に戻る