Java:Object 类未被声明为抽象的原因

2022-09-02 00:52:15

为什么没有将类声明为抽象类?java.lang.Object

当然,对于一个对象来说,它需要添加状态或行为,Object类是一个抽象,因此它应该被声明为抽象......他们为什么选择不这样做?


答案 1

即使 它没有任何特定于它的状态或行为,它也很有用。Object

一个例子是它用作用于同步的通用防护:

public class Example {
    private final Object o = new Object();

    public void doSomething() {
        synchronized (o) {
            // do possibly dangerous stuff
        }
    }
}

虽然这个类的实现有点简单(这里并不明显为什么有一个显式对象是有用的,你可以只声明方法),但在几种情况下,这确实很有用。synchronized


答案 2

Ande,我认为你正在以不必要的抽象程度来接近这个 - 双关语不是故意的。我认为这种(恕我直言)不必要的抽象水平是导致这里“问题”的原因。你也许是从数学理论方法中接近这一点的,我们中的许多人都是从“程序员试图解决问题”的方法来接近这一点的。我认为,这种方法上的差异导致了分歧。

当程序员考虑实用性以及如何实际实现某些东西时,很多时候你需要一些完全任意的对象,其实际实例是完全无关紧要的。它不能为空。我在对另一篇文章的评论中给出的示例是( == 或选择类型的实现),这通常是通过使用支持和使用键作为Set来完成的。您通常不能用作值,因此通常的做法是使用静态实例作为值,该值将被忽略并且永远不会使用。但是,需要一些非空占位符。*Set*HashConcurrent*MapMapnullMapObject

另一个常见用法是使用关键字,其中需要一同步,并且您希望确保同步项是完全私有的,以避免死锁,其中不同的类无意中在同一个锁上同步。一个非常常见的成语是分配 a 以在类中使用作为锁。公平地说,从Java 5和相关的补充开始,这个成语的适用性明显较差。synchronizedObjectprivate final Objectjava.util.concurrent.locks.Lock

从历史上看,在Java中,可实例化非常有用。你可以提出一个很好的观点,即通过对设计进行小的更改或对API进行小的更改,这将不再是必需的。你可能是对的。Object

是的,API可以提供一个无需添加任何内容即可扩展的类,用作上述目的的占位符。但是,如果你正在扩展,但没有添加任何东西,那么除了允许抽象之外,类中还有什么价值呢?从数学上讲,从理论上讲,也许人们可以找到一个值,但从实际的角度来看,它会为这样做增加什么价值?PlaceholderObjectObjectObject

在编程中,有时您需要一个对象,某个对象,任何不为空的具体对象,您可以通过和/或进行比较,但您只需要任何其他功能即可。它的存在只是为了作为一个唯一的标识符,否则绝对不做任何事情。 完美地满足了这个角色,并且(恕我直言)非常干净。==.equals()Object

我猜想这是没有宣布为抽象的部分原因:它不是直接有用的。Object