سؤال

الإخراج هو:RunnableA ThreadB
لا أفهم كيف يأتي؟؟(ماذا يحدث في طريقة التشغيل في الفئة ب)

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();
    }
}
هل كانت مفيدة؟

المحلول

انظر بعناية إلى تنفيذ طريقة التشغيل لفئة Thread على النحو التالي: Genacodicetagpre

لذا فإن استدعاء طريقة التشغيل لـ Thread يستدعي تشغيل Runnable الذي تم تمريره ، في حالتك ، تكون قد اجتزت مثيل A أثناء إنشاء Thread t.لذا فإن استدعاء super.run () يستدعي طريقة التشغيل لفئة Thread والتي بدورها تستدعي طريقة التشغيل لـ A (التي يمكن تشغيلها أو الهدف).

نصائح أخرى

كما تتصل super.run() في B#run سيتم تنفيذه Thread#run التالى run طريقة المثيل Runnable سيتم تنفيذ الذي قمت بتمريره إلى المنشئ.

Thread.run ببساطة يدعو run طريقة Runnable التنفيذ الذي قدمته.ولكن لا يجب عليك الاتصال أبدًا Thread.run, ، بدلاً من ذلك اتصل Thread.start.

لأن لديك فئة فرعية B وتجاوز طريقته run().

سوف يتصل Bطريقة أولا.

و في Brun() تجد المكالمة الفائقة فتتصل superrun() (والتي سوف تنفذ المقدمة Runnablerun()) أولا ثم تنفيذ Brun()

عندما أنشأت كائنًا من الفئة B ومررت a إليه ، تم استدعاء مُنشئ الفئة b. ماذا يوجد في مُنشئ الفئة B؟ سوبر (ص) ؛ هذا يحدد r ليكون الدعوة الفائقة. الآن بشكل رئيسي عندما تقول t.run () ، فإنها تسمي الطريقة المتجاوزة للفئة B والتي تستدعي طريقة التشغيل للكائن الذي قمت بربطه بـ super بقول super (r) ، لذا فإن طريقة التشغيل لـ a تسمى أولاً وثم تتم طباعة "ThreadB".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top