为什么Java中的每个对象都隐式扩展Java.lang.object类?

为什么Java中的每个对象都隐式扩展Java.lang.object类?,java,object,inheritance,design-patterns,Java,Object,Inheritance,Design Patterns,我已经用Java编程很长一段时间了,但是当我试图向朋友解释什么是Java.lang.Object类时,我只能想出一个简单的一行: Java中的所有对象都隐式扩展Java.lang.Object 我不太清楚它为什么要这样做 所以,我查看了上面的源代码,希望能找到一些线索。现在我知道了什么是java.lang.Object,它是做什么的,我想知道是否有任何具体的原因来解释为什么它是这样设计的 我的问题仍然存在:为什么每个对象都要扩展java.lang.object?我想说的是Design。每个对象都

我已经用Java编程很长一段时间了,但是当我试图向朋友解释什么是
Java.lang.Object
类时,我只能想出一个简单的一行:

Java中的所有对象都隐式扩展
Java.lang.Object

我不太清楚它为什么要这样做

所以,我查看了上面的源代码,希望能找到一些线索。现在我知道了什么是
java.lang.Object
,它是做什么的,我想知道是否有任何具体的原因来解释为什么它是这样设计的


我的问题仍然存在:为什么每个对象都要扩展
java.lang.object

我想说的是
Design
。每个
对象
都应该支持的通用/强制方法,并将该类作为语言规范进行扩展

你可以在这里找到原因

如果我们说这是一个
对象
,那么它们必须具有由
API
定义/决定的通用方法

想象一下你自己为每个类使用以下方法。

protected Object clone() throws CloneNotSupportedException
      Creates and returns a copy of this object.


public boolean equals(Object obj)
      Indicates whether some other object is "equal to" this one.


protected void finalize() throws Throwable
      Called by the garbage collector on an object when garbage
      collection determines that there are no more references to the object


public final Class getClass()
      Returns the runtime class of an object.


public int hashCode()
      Returns a hash code value for the object.


public String toString()
      Returns a string representation of the object.
Object的notify、notifyAll和wait方法都在同步程序中独立运行的线程的活动中发挥作用:

public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos) 
因此,为了减少痛苦,创建了一个通用和标准的
API

请参见:

java.lang包中的对象类位于 类层次结构树。每个阶级都是直接或间接的后代, 对象类的。您使用或编写的每个类都继承 对象的实例方法。您不需要使用这些方法中的任何一种, 但是,如果您选择这样做,您可能需要用代码覆盖它们 这是你们班特有的

Object
类只是定义了所有对象必须具有的基本状态,就像将其与其他对象进行比较一样


它是所有事物的父类。它只是为所有派生对象提供一种模板。

这就是语言的设计方式。每个对象都将从基类
对象
继承。这意味着保证每个对象都有特定的方法,比如
toString()
equals()
hashCode()
,等等。

这是一个java设计决策。它提出了继承和重用的概念。这确保了所有类都有一些基本方法,如
wait()
toString()
等。

我想说的原因是,java中的所有对象都有一个公共API来支持基本功能,如

  • 同步-
    等待
    通知
    通知所有人
  • 垃圾收集-
    完成
  • 收集支持-
    hashCode
    等于
  • 对象克隆-
    克隆
每一个物体

  • 拥有它所属的类-
    getClass
  • 可以将自身表示为字符串,因为我们是 人类可以读取字符串-
    toString

    • 对象类是java编程中最超级的类,它根据类型有预定义的方法,您可以使用这些方法您不再需要扩展对象类&无论它隐式存在于何处

      这样做是因为大多数基本函数(如toString()等)将自动继承,而对于您的下一个问题,这不是多重继承,而是多级继承。。。
      在多重继承中,单个类派生自2个或多个基类,而在多级继承中,正如您所说,它有一个基类本身派生自对象类

      我认为
      对象
      最重要的用途不是提供像
      toString()这样的常用方法
      但要提供一个通用的类型,该类型将保存所有引用类型

      C++没有等价的
      对象,人们仍然很高兴。但由于Java没有指针和类似C++的模板,
      Object
      是实现
      Collection
      s等的必要条件


      另请参阅关于引用和基元类型的讨论。

      每个类都隐式扩展对象类,以便它们提供基本特性,根据Java建议,每个类都应该具有这些特性。例如clone()、equals()、hashCode()、toString()等

      隐式的意思是,若你们并没有扩展任何类,那个么只有编译器会隐式地扩展对象类。但若类已经扩展了其他类,那个么编译器就不会扩展对象类。例如。 甲级{ }

      B类扩展了A类{ }

      在这里,编译器将在类A声明中隐式添加扩展对象类

      A类扩展对象{ }

      B类扩展了A类{ }

      由于类A扩展了对象类,所以它将提供对象类的基本功能,如equals()、toString()等。由于类B扩展了隐式扩展类Object的类A,所以类B也提供了所有这些功能


      因此,通过遵循这种方法,每个类对象(变量)都符合每个Java对象应该具有的特性,而不需要Java不允许的多重继承(一个扩展多个类的类)。这种方法遵循多级继承。

      引用Head first Java第二版:

      在Java中,如果没有一个通用的超类,那么就没有办法了 对于Java开发人员来说,使用可以 以您的自定义类型。。。他们写作时从不知道的类型 ArrayList类


      这从本质上解释了Java中对通用预定义类类型的需求,该类类型可用于实现该语言提供的不同功能。

      这样您就可以放心地在任何对象上调用对象方法