当前位置: 首页 > 面试题库 >

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

傅毅然
2023-03-14
问题内容

为什么将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?


问题答案:

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

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

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

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

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

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



 类似资料:
  • 对许多人来说,这可能是一个简单的问题,但让我困惑。我从凯西·塞拉那里挑选了一个例子,展示了抽象类的实用性,但我无法理解抽象类的整体重要性。 例如,我们有一个带有抽象方法的抽象类, 我的问题是——为什么我们首先需要抽象类来为每种汽车类型定制方法?为什么不在这些汽车子类型中的任何一个中使用这两种方法,比如宝马和其他两个——大众和奥迪——可以简单地覆盖这些方法?

  • 问题内容: 为什么Object类是Java中em的基类,而不是抽象类? 我已经有很长时间了,这个问题纯粹是出于好奇,仅此而已。我的代码或任何人的代码都没有中断,因为它不是抽象的,但是我想知道为什么他们将其具体化了? 为什么有人要这个Object类的“实例”(而不是引用的存在)?一种情况是糟糕的同步代码,该代码使用对象的实例进行锁定(至少我曾经以这种方式使用过一次……我的错)。 对象类的“实例”是否

  • 问题内容: 对于许多人来说,这可能是一个简单的问题,但令我感到困惑。我从Kathy Sierra挑选了一个示例,该示例显示了抽象类的效用,但我无法理解抽象类的总体重要性。 示例 我们有一个带有抽象方法- &的抽象类。这些方法在 BMW , Volkswagen 和 Audi的 子类中实现。 我的问题是- 为什么我们首先需要有抽象类来为每种汽车类型自定义方法?为什么在宝马的任何一种子类型中都没有这两

  • 问题内容: 我们的代码库中有几个空的抽象类。我觉得很丑。但是除了这个非常愚蠢的原因(丑陋)之外,我是否应该将其重构(例如,插入空接口)? 否则,代码将很健壮并经过良好测试。因此,如果仅出于“审美”原因,我将通过并保留空的抽象类。 你怎么看? 编辑: 1)“空抽象类”的意思是: 2)“空”的原因:休眠。我根本不掌握这个持久性框架。我只知道不能将接口映射到表,并且由于这个技术原因,类比接口更受欢迎。

  • 问题内容: 我想知道何时应该使用接口。 让我们考虑以下内容: 和: 我可以轻松实现它们,它们具有相同的功能…但是我也可以向车辆类中添加一些变量,这些变量可能应该在车辆中使用(maxSpeed,carType …) 使用接口的原因是什么? 谢谢! 编辑: 我在另一个线程中找到了关于它的漂亮链接:http : //www.thecoldsun.com/en/content/01-2009/abstra

  • 问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),