無名クラス、匿名クラス

例えば、以下のようなインタフェースが定義されていたとします。このインタフェースには2つの抽象メソッドが定義されています。抽象メソッドですので、定義されているのは名前だけで、実際の内容は実装するクラスで書く必要があります。

interface Callback {   void onSuccess();
  void onFailure()
}

つづいて、このインタフェースを実装するクラスを作成します。必ずCallbackインタフェースで定義されているメソッドを定義しなければなりません。

class TestImpl implements Callback{
  void onSuccess(){

//ここに何かかく

  }
 void onFailure(){

//ここに何かかく

  }
}

そして、実際に利用するときには、下記のように書くことになります。

このようにクラスのインスタンスを生成することで、onSuccess等のメソッドを呼び出すことができます。

Callback test = new TestImpl();//あるいは右のような書き方でもよい TestImpl test = new TestImpl();
test.onSuccess();

上記のクラスを宣言する手間を省けるのが無名クラスです。以下のように省略することができます。

Callback test = new Callback{
  void onSuccess(){

//ここに何かかく

  }
 void onFailure(){

//ここに何かかく

  }
}

何が省略されているかわかりますか?インタフェースクラスは、直接newすることはできませんが、このようにnewしながら中身を定義することで、newされるものはCallbackインタフェースを実装した何か?(つまり無名のクラス)になります。だから、インタフェースで受け取ることができます。