5

私は現在Javaのコースを受講していますが、紛らわしいコードに遭遇しました。

例:

Runnable runnable = new Runnable()
        {
            public void run()
            {
                //doStuff
            }
        };

このコードが何をしているのかよくわかりません。

runメソッドをクラスのインスタンスに関連付けるにはどうすればよいですか?

「Runnable」をグーグルで検索したところ、それがインターフェースであることがわかりました。中括弧の間にrunメソッドを宣言してインターフェイスを実装していますか?これは、Javaの任意のインターフェイスで実行できますか?

私はいくつかのリンク/説明を使用することができます。ありがとうございました!

4

4 に答える 4

8

これは、インターフェースを実装している匿名の内部クラスRunnableです。はい、この方法で任意のインターフェースを実装できますが、特定の場合に実装する、またはしない理由があります(再利用性の欠如は、「しない」列の大きなものです)。匿名クラスの詳細はこちらですが、基本的にはこれの便利な形式です。

// Define it
class Foo implements Runnable
{
    public void run()
    {
        // Do stuff
    }
}

// And then use it
Runnable runnable = new Foo();

...提供されるFooのは内部(または「ネストされた」)クラスです。ネストされたクラスの詳細については、こちらをご覧ください。

于 2010-11-28T22:23:51.863 に答える
2

はい、実行を宣言することでインターフェースを実装しています。はい、どのインターフェースでも実行できます。

これは通常、インターフェイスタイプの引数を期待するメソッドに実装を渡し、適切な宣言されたクラスがない場合に行われます。その場でインターフェースを実装するだけで、そのコードが実行されます。かなりきちんと。

于 2010-11-28T22:24:19.927 に答える
2

「Runnable」をグーグルで検索したところ、それがインターフェースであることがわかりました。中括弧の間にrunメソッドを宣言してインターフェイスを実装していますか?これは、Javaの任意のインターフェイスで実行できますか?

はい!

このコードは、Runnableを実装するオブジェクトをインスタンス化しています。実際にインターフェースを構築することはできないため、そうしようとするコードは、中括弧で囲まれたインターフェースのメソッドの実装を提供する必要があります。Runnableを実装するためにJavaがどのクラスを作成しているかは実際にはわかりません(これらは抽象的な用語です)。

次のことを行う場合:

Runnable runnable = new Runnable()
        {
            public void run()
            {
                System.out.println("I'm running");
            }
        };
runnable.run();

「I'mrunning」が出力として表示されます。

于 2010-11-28T22:28:08.557 に答える
0

状況によっては、このサンプルコードが役立ちます...。test runna = new test()

class test implements Runnable{
        test(){
            Thread t = new Thread(this);
            t.start();
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true){
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.print("asd");
            }
        }

    }
于 2010-12-25T14:55:38.270 に答える