1
class Qus3 extends Thread implements Runnable {

    public static void main(String args[]) {
        Qus3 q3 = new Qus3();
        q3.start();
    }
}

このコードはエラーなしでコンパイルされますが、インターフェイスのすべてのメソッドを定義する必要はありません。そうでない場合は、クラスを抽象として宣言します。上記のコードでは、クラスは抽象として宣言されておらず、run()もクラスによって定義されていません。 Runnableインターフェースを実装しましたが、なぜコードはまだ正しいのですか?

4

3 に答える 3

2

スレッドはRunnableを実装します。APIから

public void run()

このスレッドが別のRunnablerunオブジェクトを使用して構築された場合、そのRunnableオブジェクトのrunメソッドが呼び出されます。それ以外の場合、このメソッドは何もせずに戻ります。

Threadのサブクラスは、このメソッドをオーバーライドする必要があります。

したがって、コンパイルエラーは発生しませんが、run何も実行されません。新しく開始されたスレッドは、空のrunメソッドを実行して終了します。

コードは正しいですが、スレッドの拡張を避け、別のRunnableを作成して、それを新しいスレッドに渡すことをお勧めします。そうすれば、スレッド以外のものを拡張できるだけでなく、誤ってスレッドメソッドをオーバーライドするリスクもありません。

于 2012-11-28T14:02:54.983 に答える
1

Threadはrunをオーバーライドします。Threadを拡張すると、runメソッドが実装されます。

于 2012-11-28T14:02:56.603 に答える
0

クラスはRunnableを実装しますが、Threadも拡張します。内部的にスレッドはRunnableも実装し、その実装を提供します。それが正常にコンパイルされる理由です。

削除するextends Threadと、コンパイルエラーが発生することがわかります。

于 2012-11-29T07:25:17.480 に答える