有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (6) 个答案

  1. # 1 楼答案

    您可以为同步锁实例化Object

    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
      }
    }
    
  2. # 2 楼答案

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

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

  3. # 3 楼答案

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

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

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

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

    是的,API本可以提供一个Placeholder类,该类在不添加任何内容的情况下扩展Object,用作上述用途的占位符。但是——如果你扩展了Object,但什么都不添加,那么除了允许Object是抽象的之外,类中还有什么价值呢?从数学上,理论上,也许一个人可以找到一个值,但从实用的角度来看,它会增加什么价值呢

    在编程中,有时需要一个对象,一些对象,任何不为空的具体对象,可以通过==和/或.equals()进行比较,但不需要该对象的任何其他特性。它的存在只是作为一个唯一的标识符,否则就完全不起任何作用^{cdho}完全满足了这个角色

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

  4. # 4 楼答案

    一个Object是有用的,即使它没有任何特定的状态或行为

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

    public class Example {
        private final Object o = new Object();
    
        public void doSomething() {
            synchronized (o) {
                // do possibly dangerous stuff
            }
        }
    }
    

    虽然这个类的实现有点简单(这里不清楚为什么显式对象很有用,您可以只声明方法synchronized),但在一些情况下,这是非常有用的

  5. # 5 楼答案

    Object怎么会比null更具攻击性呢

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

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

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

  6. # 6 楼答案

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

    Object lock = new Object();
    
    ....
    
    
    synchronized(lock)
    {
    }