2

私はJavaを初めて使用します。との関係を理解するのに問題がanonymous class instanceありinterfaceます。このWebサイトの例を参照してください。

// anonymous instance as a variable
Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        //codes
    }
};

Thread t1 = new Thread(r, "anonymous 1");

// anonymous instance as a parameter
Thread t2 = new Thread (new Runnable()
{
    @Override
    public void run()
    {
        //codes
    }
}, "anonymous 2");

このSOの質問(http://stackoverflow.com/questions/11069056/why-java-interface-can-be-instantiated-in-these-codes)の回答に基づいて、匿名クラスの基本的な理解があります。

しかし、私はこれが何であるかを理解していません:

Runnable r = new Runnable(){...};

右側では、匿名クラスのインスタンスを作成したので、それはobject of a classです。左側では、Interface変数です。

匿名クラスのインスタンスをインターフェイス変数に割り当てることができるのはなぜですか?

このウェブサイトを参照してください:

Thread(Runnable target, String name)

Threadは、最初の引数がインターフェイス変数であることを期待しているようです。

4

2 に答える 2

4

このコード...

Runnable r = new Runnable(){...};

クラスRunnableはインターフェースであるため、そのインスタンスを直接作成することはできません。ただし、{...}セクションのコードに注意してください。これは、ローカライズされた方法でインターフェイスのメソッドを実装しています。

基本的に何が起こっているのかというと、インターフェースのインスタンスを作成しているということです。これは、rが定義されているメソッドでのみ表示および使用できます。このセクションのすべてのメソッドを実装したので、クラスは有効であり、他のオブジェクト{...}と同じように使用できます。Runnable

このコード...

Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        //codes
    }
};

事実上、次のことを行うのと同じです...

public class MyRunnable implements Runnable {
    public void run()
    {
        //codes
    }
};

// This goes in your class where you want to create the Runnable object
Runnable r = new MyRunnable();

どちらのコードもrRunnableインスタンスである変数を作成します。最初の解決策は、インスタンスを作成するための省略形であり、他の場所で再利用する必要がないものに役立ちます。2番目のソリューションは、インターフェイスを実装するための別個のクラスを作成し、ローカルスコープの外部で再利用できます。

変数に割り当てられたオブジェクトがインターフェイスを実装している場合は、インターフェイスタイプで変数を格納できます。したがって、コードでは...

Runnable r = new Runnable(){...};

rそれがインターフェースを実装していると言っていRunnableます。前に説明したように、のビット{...}はインターフェイスが実装されている場所なので、すべて正常に機能します。

于 2012-06-17T06:35:34.530 に答える
0

オブジェクト クラスがそのインターフェイスを実装している場合にのみ、オブジェクトをインターフェイスに割り当てることができます。この場合、Runnableインターフェイスを実装する匿名クラスのオブジェクトを作成し、それを正しい割り当てにしています。

また、Threadクラスには引数のないコンストラクターがあります。これが、コードがコンパイルされる理由です。

于 2012-06-17T06:40:40.513 に答える