实现 Runnable 接口的线程的子类

subclass of thread implementing Runnable interface

令我困惑的是,为什么实现 运行nable 接口的子class 线程不强制我重写 运行 方法。基本上,当我创建实现 Runnable 的简单 class 时,它会强制我覆盖 运行 方法。但是当我将普通 class 设为线程的子 class 时,它不再强迫我覆盖 class。这背后的逻辑是什么?

这是因为Thread本身实现了运行()。

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

默认情况下它什么都不做。如果我们扩展一个线程,我们会实现这个方法,以便它做一些有用的事情

当一个非抽象的class声明它实现了一个接口,这意味着class必须有接口定义的每个方法的具体实现,但是那些实现方法不必在 class 中显式,它们可以从超级 class 继承。在这个具体的例子中 java.lang.Thread 有它自己的 public void run(),subclasses 继承,所以实现 Runnable 的 Thread 的 subclass 不需要添加自己的覆盖以满足编译器的要求(尽管它可能确实有用)。