实现 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 不需要添加自己的覆盖以满足编译器的要求(尽管它可能确实有用)。
令我困惑的是,为什么实现 运行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 不需要添加自己的覆盖以满足编译器的要求(尽管它可能确实有用)。