一尘不染

为什么Thread不是抽象类,而start()不是final?

java

为什么将Thread类实现为常规类而不是将 抽象run()方法实现为 抽象 类。

会不会带来任何问题?或以这种方式有什么用吗?

而且,该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?


阅读 709

收藏
2020-12-03

共1个答案

一尘不染

为什么将Thread类实现为常规类,而不是将run()方法抽象为抽象类。

这个问题实际上归结为这样一个事实,即您应该始终偏向于继承而不是继承。

如果将该Thread类声明为abstract,该语言将必须提供另一个从它扩展的类,程序员可以使用它创建一个Thread。那么你的问题是,为什么这个类是extendsThread没有abstract。如果该语言没有提供extendsfrom的其他类Thread,则程序员将不得不创建自己的class,该类extend来自Threadand重写该run()方法。

如果不是,为什么该方法未在Thread类中声明为final?

我能给出的唯一可能的解释是,start当将类引入JDK时,该语言的开发人员看到了一些重写的​​用例。我使用的Java的第一个版本是1.5,而我个人没有遇到用例,在该用例中我发现需要重写start。正如JB
Nizet在回答中所说

如果今天从头开始重新设计Java,那么很有可能设计会有所不同

2020-12-03