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

cod*_*Man 35 java inheritance design-patterns object

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

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

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

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

我的问题仍然存在:为什么每个对象都要延伸java.lang.Object

Ren*_*ink 36

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

  • 同步 - ,, waitnotifynotifyAll
  • 垃圾收集 -finalize
  • 收集支持 - hashCode,equals
  • 对象克隆 -clone

每个对象

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


Kon*_*kov 9

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


bil*_*.cn 8

我认为最重要的用途Object是不提供像常用的方法toString(),但提供了一个通用,将持有的所有引用类型.

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

另请参阅有关参考和基元类型的讨论.


Sur*_*tta 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.
Run Code Online (Sandbox Code Playgroud)

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) 
Run Code Online (Sandbox Code Playgroud)

所以减轻痛苦,创造了一个共同的标准API.


小智 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 类隐式扩展了类对象,因此 B 类也提供了所有这些功能。

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