9

Javaではインターフェイスをインスタンス化できないことを読みました(ドキュメントの「インターフェイス」を参照)。実行可能とは、定義上、あるクラスによって実装されるべきインターフェースです。しかし、私のAndroidアプリケーションの1つからの次のコードでは、空のコンストラクター-Runnable()...(コンストラクターかどうかはわかりません)が使用され、インスタンスが作成されていることがわかります-getStatus。

final Runnable getStatus = new Runnable()
{
    public void run()
    {
        TextView uat = (TextView) findViewById(R.id.useAndThrow);
        uat.setText(MyThread.getStatus());
        return;
    }
};

私が知るようになったもの:

  1. これはおそらく匿名クラスの例です。
  2. インスタンスは実際にはインターフェースではありません。

しかし、私は点をつなぐことができません。上記のコードがmyActivityクラス内にあると仮定すると、何がインスタンス化され、この匿名クラスはどのようになりますか?

少し詳細があれば素晴らしいでしょう。

4

4 に答える 4

7

これを「匿名クラス」と呼びます。それに関するいくつかのメモ:

  1. 名前を指定しなかったため、名前が作成されます。実際の名前を確認するには、コンソールに書き込むか、バイトコードを読み取るだけです。

  2. 外部クラスのスコープで作成された場合、匿名クラスは、内部クラスと同様に、そのフィールドへの参照を持ちます。一般に、作成された場所と同じスコープを持ちます。

  3. 単純な実装だけが必要な場合、これは非常に一般的なことです。コードが多ければ多いほど、それを別のファイルに入れることを検討する必要があります(できないからではなく、順序のために)。

  4. Runnable だけが一般的なインターフェイスではありません。Android では、OnClickListener、OnTouchListener などを使用します。

  5. 匿名クラスは、宣言された場所と同じスコープを持っているため、参照があることを意味します。メモリ リークが発生する可能性があるため、匿名クラスを長時間保持しないようにしてください (たとえば、静的参照内)。このサンプルが示すように、Android では非常に重要です(ドローアブルについて説明していますが、匿名クラスはコンテキストへの参照を持つこともできます)。

  6. 匿名クラスの欠点のいくつかは、コンストラクターがないことと、複数のインターフェイスを実装できないことです。使い方は非常に限られていますが、非常に使いやすい (そして読みやすい) ため、非常に人気があります。

于 2012-06-15T14:17:17.960 に答える
2

「匿名インナークラス」を使用して、これに関する詳細については、Google を参照してください。この「Java の内部クラス、内なる謎」というブログ投稿では、さまざまな種類の内部クラスについて非常によく説明しています。「3.12. 匿名クラス」も参照してください。

于 2012-06-15T14:11:42.250 に答える
1

インスタンス化されているのは、 の無名サブクラスですRunnable。型自体に名前がないため、匿名と呼ばれます。このサブクラスrun()では、インターフェースで指定されたメソッドを実装していRunnableます。

の型はgetStatusですがRunnable、 によって参照されているオブジェクトは、実際には明示的な名前付き型を持たないgetStatusの実装です。Runnable

于 2012-06-15T14:04:54.577 に答える
0

コードは、Runnable インターフェースを実装するクラスのインスタンスを作成しています。クラスには名前がありません。

于 2012-06-15T14:19:26.080 に答える