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

2022-08-31 12:42:33

为什么该类是作为常规类实现的,而不是作为抽象方法的抽象类实现的。Threadrun()

它可能会带来任何问题吗?或者它以这种方式有任何用处吗?

此外,该方法应该是一个非常具体的方法,其功能不能由任何其他类实现(如果我没有错的话)。因此,我想关键字比任何其他方法都更适合此。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?


答案 1

你当然可以选择向自己开枪,但这并不意味着你必须这样做。

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

因为创建启动线程的推荐方法是不要子类 Thread。推荐的方法是定义 一个 ,并将其作为参数传递给 Thread 构造函数:Runnable

Runnable r = new Runnable() {
    @Override
    public void run() {
        ...
    }
};
Thread t = new Thread(r);
t.start();

因此,我想最终的关键词比任何其他方法都更适合这个。

是和否。你不能用你自己的实现来代替 start() 的实现,但是如果你愿意,你可以在 start() 中做其他事情:

@Override
public void start() {
    System.out.println("Did anyone tell you I will spawn a new thread??");
    super.start();
}

也就是说,如果Java今天从头开始重新设计,那么设计很有可能会有所不同。请记住,此类源自 Java 1.0,并且仍然向后兼容。


答案 2

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

这个问题实际上归结为这样一个事实,即您应该始终更喜欢组合而不是继承。

如果该类被声明为 ,则该语言必须提供另一个从它扩展的类,程序员可以使用该类来创建。然后,您的问题将是关于为什么来自的这个类不是.如果该语言没有提供另一个 from 的类,程序员将不得不创建他们自己的类 from 并重写该方法。ThreadabstractThreadextendsThreadabstractextendsThreadextendThreadrun()

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

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

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