• ベストアンサー

A a = new A(){}; の構文の意味が分からない。

下記サイトのコードを読んでいて、 ResponseListener listener = new ResponseListener() { //略 }; という書き方があったのですが、どういう意味になるのでしょうか? インスタンスの作り方は単に A a = new A(); だと思うのですが…。 http://www.snmp4j.org/doc/org/snmp4j/Snmp.html

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

無名クラスと呼ばれるものよ。 私も良くやるわ。 ちなみに A a = new A(); はできないわよ。 Aはインターフェースだからね。 上記の場合、正式に実装するなら、 ResponseListenerをimplementsした MyResponseListener(仮名)を別途作成し、 それを ResponseListener listener = new MyResponseListener(); とする必要があるわ。 でも、このMyResponseListenerは 今ここでしか使わない、他からまったく参照する必要のない 超ローカルなクラスなのよ。 このメソッドが終了すればGCにかけてもいいわけ。 そんな場合、わざわざクラスを1つ作る必要なくて その場でちょちょいとやってしまうことができるのよ。 それが無名クラスっていう実装方法よ。 http://www.javaroad.jp/java_class15.htm FileFilterやCompare、Runnableなんかで 他のクラスで再利用しないときは良くやるわ。

netw2009
質問者

お礼

そうなのですね。 お二方、ありがとうございます。

その他の回答 (1)

noname#94983
noname#94983
回答No.1

これは一般に「無名クラス」とか「匿名クラス」と呼ばれるもの。インスタンス生成時に、その後にある{}内のコードを自身に組み込んだ形でオブジェクトが生成される。例えば、 A a = new A(){void a(){……} }; こんな具合になっていたら、生成されたaインスタンスには、この{}にあるメソッドaが組み込み済みとなっている。 本来のクラスAのインスタンスとは異なるインスタンスが生成されるわけで、ということはこのaインスタンスは、クラスAのインスタンスではなくなってしまう(正確には、クラスAを継承した、何らかのクラスのインスタンスということになる)。が、そうしたクラスは定義されておらず、この場で名前のないクラスのインスタンスが作られた、としかいいようがない。で、無名クラスとか匿名クラスといわれるわけ。

関連するQ&A