3

次のように Interface の新しいインスタンスを宣言するとどうなりますか。

OnClickListener oc = new OnClickListener(){
    @Override
    public void onClick(View v){
         //Something
    }
};

メソッドはどこにonClick保存されますか? ある種のクラスストレージにある必要がありますか?これは、この構文が名前のないクラスを作成し、それに OnClickListener インターフェイスを暗黙的に実装するということですか? もしそうなら、なぜ異なるOnClickListenerオブジェクトを互いに割り当てることができるのでしょうか? 確かに、それらは「暗黙的に」異なるクラス タイプであるため、この 2 つの異なるクラスの割り当ては不可能です。

誰か説明してくれませんか?

4

3 に答える 3

4

これは匿名クラスと呼ばれます。

コードが FileFoo.javaにあり、それをコンパイルすると、最初の匿名クラスに対してFoo.classとが得られます。Foo$1.classFoo$2.classより多くの匿名クラスについても同様です)。

于 2012-11-10T00:27:24.287 に答える
2
OnClickListener oc = new OnClickListener(){
    @Override
    public void onClick(View v){
         //Something
    }
};

Javaの無名クラスです。OnClickListener実装する匿名クラス (クラス名を持たない)を作成しています。したがって、インターフェイスonClickListener内で定義されているメソッドOnClick()がここに実装されています。

于 2012-11-10T00:28:08.017 に答える
1

ここで起こっていることは、OnClickListener インターフェイスを実装する Java で「内部匿名クラス」を作成していることです。これにより、oc 参照変数が、インスタンス化の結果として生成されたオブジェクトを参照することになります (onClick メソッドの実装はここにあります)。

このタイプの割り当ては完全に有効です。oc 参照変数には、OnClickListener の実装の別のインスタンスを割り当てることができます。これらは両方とも同じタイプ (同じインターフェイスを実装する) であるためです。その場合、元の「匿名内部クラス」が適格になります。 「ゼロ」の参照があるため、ガベージコレクション。

乾杯; ハス。

于 2012-11-10T00:41:00.753 に答える