Java:未声明为抽象的对象类的基本原理

Java:未声明为抽象的对象类的基本原理,java,object,specifications,Java,Object,Specifications,为什么java.lang.Object类没有声明为抽象类 当然,对于一个有用的对象来说,它需要添加状态或行为,对象类是一个抽象,因此它应该被声明为抽象的他们为什么选择不这样做?一个对象即使没有任何特定的状态或行为,也是有用的 一个例子是将其用作用于同步的通用保护: public class Example { private final Object o = new Object(); public void doSomething() { synchroniz

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


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

一个
对象即使没有任何特定的状态或行为,也是有用的

一个例子是将其用作用于同步的通用保护:

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

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

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

对象是否指定了扩展它的类必须实现的方法以使其有用?不,因此它不必是抽象的


抽象类的概念有一个定义良好的含义,但不适用于对象。

我不确定这是原因,但它允许(或允许,因为现在有更好的方法)将对象用作锁:

Object lock = new Object();

....


synchronized(lock)
{
}

您永远不知道何时可能要使用简单对象作为占位符。将其视为数字系统中有一个零(null不适用于此,因为null表示没有数据)。

您可以实例化
对象以获得同步锁:

Object lock = new Object();

void someMethod() {
  //safe stuff
  synchronized(lock) {
     //some code avoiding race condition
  }
}

void someOtherMethod() {
  //safe code
  synchronized(lock) {
    //some other stuff avoiding race condition
  }
}

对象如何比null更具攻击性

它是一个很好的位置标记(不管怎样,与null一样好)

另外,我认为如果没有一个抽象的方法来抽象一个对象,那将不是一个好的设计


我并不是说空值是自切片面包以来最好的东西——前几天我读了一篇“发明家”的文章,讨论了空值概念的成本/价值。。。(我甚至不认为null是可以发明的!我想某处的人可能会声称他发明了zero…)只是能够实例化对象并不比能够传递null更糟糕。

Ande,我认为你正在以一种不必要的抽象程度接近这一点——双关语不是有意的。我认为这个(IMHO)不必要的抽象层次是造成这里“问题”的原因。你可能是从数学理论的角度来看待这个问题,我们中的许多人是从“程序员试图解决问题”的角度来看待这个问题的。我认为这种方法上的差异导致了分歧

当程序员研究实用性和如何实际实现某个东西时,有时您需要一些完全任意的对象,而这些对象的实际实例是完全无关的。它不能为空。我在另一篇文章的评论中给出的示例是
*Set
*
=
散列
并发
或选择类型)的实现,这通常是通过使用backing
*Map
并使用
Map
键作为集来实现的。通常不能使用
null
作为
Map
值,因此通常使用静态
对象
实例作为值,该值将被忽略且永远不会使用。但是,需要一些非空占位符

另一个常见用法是使用
synchronized
关键字,其中需要使用一些
对象
进行同步,并且您希望确保同步项是完全私有的,以避免不同类在同一锁上无意同步时出现死锁。一个非常常见的习惯用法是分配一个
私有final对象
,在类中用作锁。公平地说,在Java5和
Java.util.concurrent.locks.Lock
以及相关的添加中,这个习惯用法的适用性要小得多

从历史上看,让
对象
可实例化在Java中非常有用。您可以很好地指出,对于设计中的小更改或API的小更改,这将不再是必要的。这一点你可能是对的

是的,API可以提供一个
占位符
类,该类扩展
对象
,而无需添加任何内容,以用作上述用途的占位符。但是--如果您正在扩展
对象
但不添加任何内容,那么类中除了允许
对象
抽象之外还有什么价值?从数学上,理论上,也许一个人可以找到一个价值,但从实用角度来说,它会为这一点增加什么价值呢

在编程中,有时您需要一个对象,一些对象,任何不为空的具体对象,一些可以通过
==
和/或
.equals()
进行比较的对象,但您不需要此对象的任何其他功能。它的存在只是作为一个唯一的标识符,否则就完全不起任何作用<代码>对象
完美地满足了这个角色,并且(IMHO)非常干净


我猜
对象
未声明为抽象的部分原因:如果它不被声明为抽象,则直接有用。

应该有理由将类抽象化。一种是防止客户机实例化类,并强制他们只使用子类(无论出于何种原因)。另一个是,如果您希望通过提供抽象方法将其用作接口,则必须实现哪些子类。也许Java的设计者没有看到这样的原因,所以
Java.lang.Object
仍然是具体的。

一如既往,番石榴来帮忙:用 这里的内容可用于从代码中删除“非null占位符”的null/对象实例

这里有完全不同的问题:

  • 他们为什么不把对象抽象化
  • 如果他们决定在将来的版本中将其抽象化,会带来多少灾难

我只想说明另一个原因,即我发现对象本身实例化非常有用。我有一堆我见过的东西