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

时间:2013-10-01 11:28:43

标签: java object inheritance design-patterns

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

  

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

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

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

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

10 个答案:

答案 0 :(得分:35)

我想说的原因是为java中的所有对象提供了一个通用API来支持基本功能,如

  • 同步 - waitnotifynotifyAll
  • 垃圾回收 - finalize
  • 收集支持 - hashCodeequals
  • 对象克隆 - clone

每个对象

  • 有一个属于的类 - getClass
  • 可以将自己表示为字符串,因为我们是 人类可以阅读字符串 - toString

答案 1 :(得分:9)

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

答案 2 :(得分:7)

我认为Object最重要的用途不是提供像toString()这样的常用方法,而是提供一个包含所有引用类型的常用类型

C ++没有Object等价物,人们仍然很高兴。但由于Java没有指针和类似C ++的模板,因此需要Object来实现Collection等的实现。

另见关于参考和原始类型的讨论。

答案 3 :(得分:5)

我会说Design。每个Object应该支持的常用/强制方法,并将该类扩展为语言规范。

您可以在Official Docs找到原因。

如果我们说这是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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

隐式地,它意味着如果你没有扩展任何类,那么只有编译器会隐式扩展Object类。但是如果类已经扩展了其他类,那么编译器将不会扩展Object类。例如。 A级{ }

B级延伸A { }

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

A类扩展对象 { }

B级延伸A { }

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

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

答案 6 :(得分:2)

请参阅docs

  

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

Object类只定义所有对象必须具备的基本状态 - 比如将其与其他对象进行比较。

这是所有内容的类。它只是为所有派生对象提供了一种模板

答案 7 :(得分:2)

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

答案 8 :(得分:2)

Object类是java编程中最超级的类,它根据类型预定义了方法,可以使用那些方法。 &安培;你不再需要扩展对象类了。无处不在的地方

答案 9 :(得分:2)

引用首个Java第二版:

  

没有Java中所有内容的通用超类,就没有办法了   为Java的开发人员创建可以使用方法的类   拿你的自定义类型...他们写作时从未知道的类型   ArrayList类。

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