39

我用 Java 编程已经有一段时间了,但是当我试图向java.lang.Object朋友解释什么是类时,我想不出比简单的一句话更多的东西:

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

我不太确定为什么它应该这样做。

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

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

4

11 回答 11

43

我会说原因是Java中的所有对象都有一个通用API来支持基本功能,比如

  • 同步- wait, notify, notifyAll
  • 垃圾收集-finalize
  • 收藏支持- hashCode,equals
  • 对象克隆-clone

而每一个物体

  • 有一个属于它的类-getClass
  • 可以将自己表示为字符串,因为我们是人类并且可以读取字符串 -toString
于 2013-10-01T11:40:21.933 回答
9

我认为最重要的用途Object不是提供通用方法,toString()而是提供一个可以容纳所有引用类型的通用类型

C++ 没有Object等价物,人们仍然很高兴。但是由于 Java 没有指针和类似 C++ 的模板,Object因此需要使Collections 等的实现成为可能。

另请参阅有关引用和原始类型的讨论。

于 2013-10-07T23:37:30.310 回答
9

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

于 2013-10-01T11:34:42.087 回答
5

每个类都隐式地扩展了 Object 类,以便它们提供根据 Java 推荐每个类都应具有的基本功能。如clone()、equals()、hashCode()、toString()等。

隐含地,这意味着如果您不扩展任何类,则只有编译器会隐式扩展 Object 类。但是如果类已经扩展了其他类,则编译器将不会扩展 Object 类。例如。A类{ }

B 类扩展 A{ }

这里编译器将在 A 类声明中隐式添加 extends Object 类。

A 类扩展对象{ }

B 类扩展 A{ }

由于 A 类扩展了 Object 类,因此它将提供 Object 类的基本功能,例如 equals()、toString() 等。由于 B 类扩展了 A 类,A 类隐含地扩展了 Object 类,所以 B 类也提供了所有这些特性。

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

于 2014-01-24T10:36:45.410 回答
5

我会说Design。每个人都应该支持的通用/强制性方法在Object那里编写并将该类扩展为语言规范。

您可以在官方文档中找到原因。

如果我们说这是一个Object,它们必须具有由 定义/决定的通用方法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

于 2013-10-01T11:33:46.247 回答
4

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

于 2013-10-01T12:46:51.767 回答
3

引用 Head first Java 2nd edition:

如果没有 Java 中所有内容的通用超类,Java 开发人员就无法创建具有可以采用您的自定义类型的方法的类……他们在编写 ArrayList 类时从未知道的类型。

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

于 2016-09-05T14:09:40.140 回答
2

对象类是java编程的最超类,它有根据类型预定义的方法,你可以使用这些方法。&您不再需要扩展对象类&任何它隐式存在的地方

于 2013-10-01T12:06:19.057 回答
2

请参阅文档

java.lang 包中的 Object 类位于类层次结构树的顶部。每个类都是 Object 类的直接或间接后代。您使用或编写的每个类都继承了 Object 的实例方法。您不需要使用任何这些方法,但是,如果您选择这样做,您可能需要使用特定于您的类的代码来覆盖它们。

该类Object简单地定义了所有对象必须具有的基本状态 - 就像将其与其他对象进行比较一样。

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

于 2013-10-01T11:34:31.283 回答
2

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

于 2013-10-01T11:36:10.670 回答
0

Java 中的每个类都是 Object 类的后代(直接或间接)。Object 类定义了所有对象必须具有的基本状态和行为,例如将自己与另一个对象进行比较、转换为字符串、等待条件变量、通知其他对象条件变量已更改的能力,并返回对象的类。

于 2021-09-11T10:05:35.927 回答