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

问题描述 投票:34回答:10

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

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

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

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

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

java object inheritance design-patterns
10个回答
36
投票

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

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

每个对象

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

2
投票

引用首个Java第2版:

如果Java中的所有内容都没有通用的超类,那么Java的开发人员就无法使用可以获取自定义类型的方法来创建类......这些类型在编写ArrayList类时从未知道。

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


9
投票

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


8
投票

我认为Object最重要的用途不是提供像toString()这样的常用方法,而是提供一种能够容纳所有引用类型的通用方法。

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

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


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
投票

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


3
投票

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

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

B级延伸A {}

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

A类扩展Object {}

B级延伸A {}

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

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


2
投票

docs

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

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

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


2
投票

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


2
投票

Object类是java编程中最超级的类,它根据类型预定义了方法,可以使用那些方法。并且您不再需要扩展对象类以及它隐含的任何位置

© www.soinside.com 2019 - 2024. All rights reserved.