2009-09-09 7 views
1
class A implements Runnable 
class B extends A 

В этих условиях BЯВЛЯЕТСЯRunnable.Java Многопоточность и наследование

Правомерно написать:

class B extends A implements Runnable 

Если это действительно, будет метод run в B переопределение, что из A? Какие могут быть возможные сценарии?
Я ээ запуталась ...

+1

Этот вопрос не о многопоточности. В экземплярах 'Runnable' нет * * для запуска в отдельных потоках. –

ответ

1
class B extends A implements Runnable 

действует синтаксис Java, но не делает ничего. Расширяя A, B является Runnable.

Когда метод запуска вызывается на объект A, вызывается метод запуска A. При запуске вызывается на объект B, метод побегать будет называться, если B переопределяет метод запустить в

Рассмотрим следующий пример:

class A implements Runnable 
{ 
    public void run() 
    { 
      System.out.println("A's run method"); 
    } 
} 

class B extends A implements Runnable 
{ 
    public void run() 
    { 
      System.out.println("B's run method"); 
    } 
} 

class Test 
{ 
    public static void main(String args[]) 
    { 
     A obj1 = new A(); 
     A obj2 = new B(); 
     B obj3 = new B(); 
     Runnable obj4 = new A(); 
     Runnable obj5 = new B(); 

     obj1.run(); // prints "A's run method" 
     obj2.run(); // prints "B's run method" 
     obj3.run(); // prints "B's run method" 
     obj4.run(); // prints "A's run method" 
     obj5.run(); // prints "B's run method" 

    } 
} 
+0

Что делать, если я делаю следующее: Thread t1 = new Thread (new A()); Thread t2 = new Thread (новый B()); t1.start(); t2.start(); –

+1

@Kevin: Точно то же самое. Многопоточность не имеет к этому никакого отношения. – Jesper

+1

То же самое. В потоке из t1 будет напечатан «метод запуска A», поток из t2 будет печатать «метод запуска B». – Bombe

0

Ну, за счет расширения А, вы уже приступили к осуществлению Runnable, так что вам просто нужно переопределить метод run() и все будет хорошо в Мордор.

Если вы этого не сделаете, суперклассы run() вступят в силу.

2

Действительно, поскольку интерфейсы определяют только метод. B.run будет переопределять значение A, как если бы B не реализовал Runnable напрямую или если A не реализовал Runnable, но имел общедоступный метод void run().

5

С «implements Runnable» не вносит какой-либо исполняемый код в класс, но в основном только обещание осуществить необходимые методы, повторяя «implements Runnable» на классе, который уже расширяет другой класс, который реализует Runnable не делает ничего эффективно.

Существует очень небольшое различие, которое можно увидеть при использовании отражения, но кроме этого нет никакой разницы.

2

Его достаточно, чтобы написать

class B extends A 

класса А уже реализует Runnable так простирающийся делает этот работоспособной тоже. Для того, чтобы сделать что-то конкретное для класса B переназначения запуска() в классе B.