实现Runnable接口的Thread子类

4

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

2个回答

2
当一个非抽象类声明实现一个接口时,这意味着该类必须具有接口定义的每个方法的具体实现,但是这些实现方法不必在类中显式声明,它们可以从超类继承。在这个特定的例子中,java.lang.Thread 有它自己的 public void run() 方法,它被子类继承,因此实现 Runnable 接口的 Thread 子类不需要添加自己的重写以满足编译器(尽管它可能会添加以实际有用)。

这是否意味着,如果我有一个超类,其中包含一个与我将在我的简单类中实现的接口方法具有相同名称的方法,编译器不会警告我? - cattarantadoughan
1
@ReubenJaMesAveñoGruta 稍微比同名方法复杂一些,超类方法必须与接口兼容,因此必须具有相同的名称、相同顺序的相同参数类型和相同的返回类型(或子类型 - 如果接口方法返回 Object,则使用返回 String 的方法实现是有效的)。 - Ian Roberts

2
这是因为Thread本身实现了run()方法。
@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

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


这基本上意味着,我已经通过扩展Thread类来覆盖它了,对吧?它不仅是默认显示的。 - cattarantadoughan
你可以扩展Thread,但这并不意味着你已经重写了run()方法。 - Evgeniy Dorofeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接