Java 实现可运行接口的线程的子类

Java 实现可运行接口的线程的子类,java,multithreading,oop,interface,runnable,Java,Multithreading,Oop,Interface,Runnable,这让我很困惑,为什么实现可运行接口的线程子类不强迫我重写run方法。基本上,当我创建实现Runnable的简单类时,它会强制我重写run方法。但当我将普通类作为thread的子类时,它不再强迫我重写该类。这背后的逻辑是什么?这是因为线程本身实现了run() 默认情况下,它什么也不做。如果我们扩展一个线程,我们实现这个方法,这样当一个非抽象类声明它实现了一个接口时,它会做一些有用的事情,这意味着该类必须有接口定义的每个方法的具体实现,但这些实现方法不必在类中显式,它们可以从超类继承。在这个特定的示

这让我很困惑,为什么实现可运行接口的线程子类不强迫我重写run方法。基本上,当我创建实现Runnable的简单类时,它会强制我重写run方法。但当我将普通类作为thread的子类时,它不再强迫我重写该类。这背后的逻辑是什么?

这是因为线程本身实现了run()


默认情况下,它什么也不做。如果我们扩展一个线程,我们实现这个方法,这样当一个非抽象类声明它实现了一个接口时,它会做一些有用的事情,这意味着该类必须有接口定义的每个方法的具体实现,但这些实现方法不必在类中显式,它们可以从超类继承。在这个特定的示例中,
java.lang.Thread
有自己的
public void run()
,子类继承它,因此实现
Runnable
的线程子类不需要添加自己的重写来满足编译器的要求(尽管它可能确实有用)。

这基本上意味着,我已经通过扩展线程类覆盖了它,对吗?它不仅在默认情况下显示。您可以扩展线程,但不能。这并不意味着您已经重写了run(),这是否意味着如果我有一个超类,它的方法与接口的方法具有相同的名称,我将在我的简单类中实现该方法,编译器不会警告我?@ReubenJaMesAveñoGruta稍高于相同的名称,超类方法必须与接口兼容,因此相同的名称、相同顺序的相同参数类型和相同的返回类型(或子类型-例如,如果接口方法返回
对象
,则使用返回
字符串的方法来实现它是有效的)。
@Override
public void run() {
    if (target != null) {
        target.run();
    }
}