为什么实现可运行接口的线程的子类不会强制我覆盖run方法,这让我感到困惑。基本上,当我创建实现Runnable的简单类时,它会强制我覆盖run方法。但是当我将普通类作为线程的子类时,它并没有强迫我重写该类。这背后的逻辑是什么?
答案 0 :(得分:2)
这是因为Thread本身实现了run()。
@Override
public void run() {
if (target != null) {
target.run();
}
}
默认情况下它不执行任何操作。如果我们扩展一个Thread,我们实现这个方法,以便它做一些有用的事情
答案 1 :(得分:2)
当非抽象类声明它实现了一个接口时,这意味着该类必须具有接口定义的每个方法的具体实现,但这些实现方法不必在类中显式,它们可以从超类继承。在此特定示例中,public void run()
具有自己的Runnable
,其子类继承,因此实现$_REQUEST
的Thread的子类不需要添加自己的覆盖来满足编译器(尽管它可能确实有用)。