今回は名前のないカクテルを。
名前が無いのに使えるの?と思うかもしれません。しかし、名前がなくても役に立つのです。
名前がなくとも役目を果たせるのはポリモーフィズムを利用するからなんですね。
Runnable runnable = new Runnable() {
/** Runnable#run()の実装 */
public void run() {
// ...
}
};
これが無名クラスと呼ばれるものです。内部クラスの一種で、newで型名の記述の後に { }で囲って実装を書きます。
具体的な型名には名前がないけれども、その型を継承した何かなんだよ、ということがわかります。
ポリモーフィズムで扱う限りはインターフェースとなる型だけを知っていればよく、実装が何型なのかは意識しないでいいんですね。
この記述に慣れるまでは「なんでinterfaceなのにnewできるの!?」と思うかもしれません。
知らずに遭遇するとわけのわからない構文ですね…。
なお、無名クラスはinterfaceでなくとも、具象型を対象に作ることもできます。
java.awt.Point p = new java.awt.Point(){
@Override
public String toString() {
return "hello java!";
}
};
この例ではjava.awt.PointクラスのtoString()をオーバーライドしています。
その場でちょっとだけオーバーライドしたい、abstractメソッドを実装したいときなどにこれらの記述法は便利です。
主にswingやawtのイベントリスナでよく使われます。
投稿日時 : 2007年8月2日 12:13