Подтвердить что ты не робот

Почему каждый объект в Java неявно расширяет класс java.lang.Object?

Я программировал в Java довольно долгое время, но когда я попытался объяснить, что класс java.lang.Object для друга, я не мог придумать больше, чем простой однострочный:

Все объекты в Java расширяют java.lang.Object неявно

Я не был уверен, почему он должен это делать.

Итак, я посмотрел исходный код на GrepCode, надеясь, что я найду некоторые подсказки. Теперь я знаю, что такое java.lang.Object и что он делает, я хочу знать, есть ли какая-то конкретная причина, почему он был спроектирован таким образом.

Мой вопрос все еще преобладает: зачем каждый объект расширяется java.lang.Object?

4b9b3361

Ответ 1

Я бы сказал, что причина состоит в том, чтобы иметь общий API для всех объектов в java для поддержки основных функций, таких как

  • синхронизация - wait, notify, notifyAll
  • сбор мусора - finalize
  • поддержка коллекции - hashCode, equals
  • клонирование объектов - clone

И каждый объект

  • имеет класс, к которому принадлежит - getClass
  • может представлять себя как строку, потому что мы люди и могут читать строки - toString

Ответ 2

Так разработан язык. Каждый объект наследуется от базового класса Object. Это означает, что для каждого объекта он гарантированно будет определенными способами, такими как toString(), equals(), hashCode() и т.д.

Ответ 3

Я думаю, что наиболее важным использованием Object является не предоставление общих методов, таких как toString(), а предоставление общего типа , который будет содержать все ссылочные типы.

У С++ нет эквивалента Object, и люди по-прежнему счастливы. Но так как Java не имеет указателей и шаблонов, подобных С++, Object требуется для реализации реализаций Collection s и т.д.

См. также обсуждения дискуссионных и примитивных типов.

Ответ 4

Я бы сказал 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.

Методы уведомления, 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.

Ответ 5

Это делается так, что большинство основных функций, таких как toString() и т.д., будут автоматически унаследованы, и к вашему следующему вопросу это NOT множественная наследоваемость - это многоуровневое наследование... В множественном наследовании один класс выводится из 2 или более базовых классов, тогда как в многоуровневых, как вы сказали, у него есть базовый класс, который сам является производным от класса Object

Ответ 6

Каждый класс неявно расширяет класс Object, чтобы они предоставляли базовые функции, которые в соответствии с рекомендациями Java, которые должен иметь каждый класс. Например, clone(), equals(), hashCode(), toString() и т.д.

Неявным образом это означает, что если вы не расширяете какой-либо класс, тогда только компилятор будет неявно расширять класс Object. Но если класс уже расширяет другой класс, тогда компилятор не будет расширять класс Object. Напр. Класс A { }

Класс B расширяет A { }

Здесь компилятор неявно добавляет extends класс Object в объявление класса A.

Класс A расширяет объект { }

Класс B расширяет A { }

Поскольку класс A расширяет класс Object, он будет обеспечивать базовые функциональные возможности класса Object, такие как equals(), toString() и т.д. И так как класс B расширяет класс A, который неявно расширяет объект класса, поэтому класс B также предоставляет все эти функции.

Таким образом, следуя этому подходу, каждый объект класса (переменные) соответствует функциям, которые должен иметь каждый объект Java, не обращаясь к множественному наследованию (класс, охватывающий более одного класса), который Java не позволяет. Этот подход следует за многоуровневым наследованием.

Ответ 7

Смотрите docs:

Класс Object в пакете java.lang находится в верхней части окна дерево иерархии классов. Каждый класс является потомком, прямым или косвенным, класса Object. Каждый класс, который вы используете или записываете, наследует методы экземпляра объекта. Вам не нужно использовать какой-либо из этих методов, но, если вы решите это сделать, вам может потребоваться переопределить их кодом что характерно для вашего класса.

Класс Object просто определяет базовое состояние, которое должны иметь объекты all - как сравнение его с другими объектами.

Это родительский класс всего. Он просто предоставляет шаблон для всех производных объектов.

Ответ 8

Это решение для Java. Он использует концепцию наследования и повторного использования. Это гарантирует, что все классы имеют некоторые базовые методы, такие как wait(), toString() и т.д.

Ответ 9

Класс объекта - это самый суперкласс java-программирования, он имеет предопределенные методы в соответствии с типами, вы можете использовать эти методы. и вам больше не нужно расширять класс объектов и где-то там неявно там

Ответ 10

Quoting Head первая Java 2nd edition:

Без общего суперкласса для всего в Java, не было бы способа для разработчиков Java для создания классов с методами, которые могли бы возьмите свои пользовательские типы... типы, о которых они никогда не знали, когда писали класс ArrayList.

Что по существу объясняет необходимость общего предопределенного типа класса в Java, который может использоваться для реализации различных функций, предоставляемых языком.