为什么将Thread类实现为常规类而不是将 抽象run()方法实现为 抽象 类。
Thread
run()
会不会带来任何问题?或以这种方式有什么用吗?
而且,该Thread.start()方法应该是一种非常特定的方法, 其功能不能由任何其他类实现 (如果我没记错的话)。因此,我想该final关键字比其他任何方法都更适合此操作。
Thread.start()
final
但是我可以重写此方法并根据需要使用它,
public class Test extends Thread { public static void main (String... args) { Thread test = new Test(); test.start(); } @Override public void run() { System.out.println("New thread started..."); } @Override public void start() { System.out.println("Did anyone tell you I will spawn a new thread??"); } }
它显然只印了,
有人告诉你我会产生一个新线程吗?
除了使工程师取代您感到困惑之外,还有什么其他用途?
如果没有,为什么该方法未在Thread类中声明为final?
为什么将Thread类实现为常规类,而不是将run()方法抽象为抽象类。
这个问题实际上归结为这样一个事实,即您应该始终偏向于继承而不是继承。
如果将该Thread类声明为abstract,该语言将必须提供另一个从它扩展的类,程序员可以使用它创建一个Thread。那么你的问题是,为什么这个类是extends从Thread没有abstract。如果该语言没有提供extendsfrom的其他类Thread,则程序员将不得不创建自己的class,该类extend来自Threadand重写该run()方法。
abstract
extends
extend
如果不是,为什么该方法未在Thread类中声明为final?
我能给出的唯一可能的解释是,start当将类引入JDK时,该语言的开发人员看到了一些重写的用例。我使用的Java的第一个版本是1.5,而我个人没有遇到用例,在该用例中我发现需要重写start。正如JB Nizet在回答中所说
start
如果今天从头开始重新设计Java,那么很有可能设计会有所不同