-1

以下のプログラムがわかりません。Runnableはインターフェイスであり、コンストラクターはどのインターフェイスにもありません。このプログラムでnew Runnable(){...}は、どのように機能していますか?

public class Threads {
    public static void main (String[] args) {
        new Thread(new Runnable() {
            public void run() {
                System.out.print("bar");
        }}).start();    
    }
}
4

4 に答える 4

2

まず、このプログラムが行っていることは、テキストをコンソールに出力する main メソッド内から新しいスレッドをインスタンス化することです。

現在、Thread クラスのコンストラクターは、R​​unnable インターフェースを実装するクラスを受け入れます。Thread コンストラクターに 2 つの方法でインスタンスを提供できます。Runnable を実装する具象クラスを使用するか、Anonymous Inner Class を提供できます。この場合、あなたは後者をやっています。

匿名内部クラスに関するOracleドキュメントによると。匿名クラスを使用すると、コードをより簡潔にすることができます。クラスの宣言とインスタンス化を同時に行うことができます。名前がないことを除けば、ローカル クラスに似ています。ローカル クラスを 1 回だけ使用する必要がある場合に使用します。

 new Thread(new Runnable() {
     public void run() {
         System.out.print("bar");
     }
 }).start();

したがって、これは、run メソッドをオーバーライドしてコンストラクター パラメーター内で定義することにより、コントラクトを満たす Runnable インターフェイスのクラスを渡すことと考えることができます。

于 2013-11-04T05:45:43.023 に答える
1

ここで匿名クラスのインスタンスを作成しています:

new Runnable() {

インターフェイスRunnableではありません

于 2013-11-04T05:06:34.507 に答える
1

new Thread()Runnable クラスが必要です。したがって、これを実現するために匿名の内部クラスを使用しています。以下は、同じことを行うより冗長な方法です。

public class Threads {
    public static void main (String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

class MyRunnable implements Runnable {
    public void run() {
        System.out.print("bar");
    }
}
于 2013-11-04T05:09:22.933 に答える
0

以下のコードは、 run()メソッドをオーバーライドすることにより、Runnable インターフェイスによって実装された Thread の匿名内部クラスをインスタンス化します。内部クラスの詳細については、このリンクを参照してください。

   new Thread(new Runnable() {
public void run() {
System.out.print("bar");
}}).start();
于 2013-11-04T05:08:02.337 に答える