0

出力は次のとおりです。RunnableAThreadB
どうやって来るのかわかりませんか?(クラスBのrunメソッドで何が起こるか)

class A implements Runnable{
    public void run(){
        System.out.println("RunnableA");
    }
}
class B extends Thread{
    B(Runnable r){
        super(r);
    }
    public void run(){
        super.run();
        System.out.println("ThreadB");
    }
}
class Demo{
    public static void main (String []args){
        A a=new A();
        Thread t=new B(a);
        t.run();
    }
}
4

5 に答える 5

3

呼び出すsuper.run()B#run実行され、コンストラクターに渡されたインスタンスのThread#run次のメソッドが実行されます。runRunnable

于 2012-01-16T08:20:06.133 に答える
2

サブクラスがBあり、そのメソッドをオーバーライドしているためですrun()

B最初にのメソッドを呼び出します。

そして、B'srun()でスーパーコールを見つけるので、最初にsuper' s run()(提供された' sを実行しRunnableますrun())を呼び出し、次にB'sを実行します。run()

于 2012-01-16T08:20:37.063 に答える
2

Thread.run与えrunた実装のメソッドを呼び出すだけです。Runnableただし、を呼び出すThread.runのではなく、を呼び出す必要がありますThread.start

于 2012-01-16T08:21:50.610 に答える
1

Threadクラスのrunメソッドの実装を注意深く参照してください。

  public void run() {
    if (target != null) {
        target.run();
    }
    }

したがって、Threadのrunメソッドを呼び出すと、渡されたRunnableの実行が呼び出されます。この場合、Threadtの作成中にAのインスタンスを渡しました。したがって、super.run()を呼び出すと、Threadクラスのrunメソッドが呼び出され、次にA(実行可能またはターゲット)のrunメソッドが呼び出されます。

于 2012-01-16T08:34:42.653 に答える
0

クラスBのオブジェクトを作成し、それにaを渡すと、クラスbのコンストラクターが呼び出されました。Bのコンストラクターには何が含まれていますか?super(r); これにより、rがスーパーコールに設定されます。現在メインでは、t.run()と言うと、super(r)と言ってsuperをバインドしたオブジェクトのrunメソッドを呼び出すクラスBのオーバーライドされたメソッドを呼び出します。したがって、aのrunメソッドが最初に呼び出されます。次に、「ThreadB」が出力されます。

于 2014-03-06T17:38:55.253 に答える