web-dev-qa-db-fra.com

Pourquoi chaque objet de Java étend implicitement la classe Java.lang.Object?

Je programme en Java depuis un certain temps, mais quand j'ai essayé d'expliquer ce qu'est un Java.lang.Object la classe est à un ami, je ne pouvais pas trouver plus qu'un simple one-liner:

Tous les objets dans Java extend Java.lang.Object implicitement

Je ne savais pas trop pourquoi il devait le faire.

J'ai donc regardé le code source sur GrepCode , en espérant pouvoir trouver des indices. Maintenant, je sais ce qu'un Java.lang.Object est et ce qu'il fait, je veux savoir s'il y avait une raison précise pour laquelle il a été conçu de cette façon.

Ma question est toujours d'actualité: pourquoi chaque objet devrait-il s'étendre Java.lang.Object?

36
codeMan

Je dirais que la raison est d'avoir une API commune pour tous les objets en Java pour supporter des fonctionnalités de base comme

  • synchronisation - wait, notify, notifyAll
  • garbage collection - finalize
  • prise en charge de la collecte - hashCode, equals
  • clonage d'objet - clone

Et chaque objet

  • a une classe à laquelle il appartient - getClass
  • peut se représenter comme une chaîne, car nous sommes des humains et pouvons lire des chaînes - toString
39
René Link

C'est ainsi que le langage est conçu. Chaque objet héritera de la classe de base Object. Cela signifie qu'il est garanti pour chaque objet qu'il y aura certaines méthodes, comme toString(), equals(), hashCode(), etc.

9

Je pense que l'utilisation la plus importante de Object n'est pas de fournir des méthodes communes comme toString() mais de fournir un type commun qui contiendrait tous les types de référence.

C++ n'a pas d'équivalent Object et les gens sont toujours contents. Mais puisque Java n'ont pas de pointeurs et de modèles de type C++, Object est requis pour rendre possible l'implémentation de Collections, etc.

Voir également les discussions sur les types de référence et les types primitifs.

8
billc.cn

Je dirais Design. Méthodes communes/obligatoires que chaque Object doit prendre en charge écrites là-bas et étendre cette classe en tant que spécification de langage.

Vous trouverez les raisons ici dans Documents officiels .

Si nous disons que c'est un Object, ils doivent avoir les méthodes communes, qui sont définies/décidées par API.

Imaginez les méthodes ci-dessous pour chaque classe par vous-même.

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.

Les méthodes notify, notifyAll et wait d'Object jouent toutes un rôle dans la synchronisation des activités des threads exécutés indépendamment dans un programme:

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) 

Donc, pour réduire la douleur, créé un API commun et standard.

5
Suresh Atta

Ceci est fait de sorte que la plupart des fonctions de base comme toString () etc. seraient automatiquement héritées et à votre prochaine question c'est NE PAS héritage multiple, il est multiniveau héritage ... Dans héritage multiple une classe unique est dérivée de 2 classes de base ou plus, alors qu'en multiniveau comme vous l'avez dit, elle a une classe de base qui est elle-même dérivée de la classe Object

4
Nawed Shaikh

Chaque classe étend la classe Object implicitement afin de fournir des fonctionnalités de base qui, selon Java recommandation que chaque classe devrait avoir. Telles que clone (), equals (), hashCode (), toString (), etc. .

Par implicitement, cela signifie que si vous n'étendez aucune classe, seul le compilateur étendra implicitement la classe Object, mais si la classe étend déjà une autre classe, le compilateur n'étendra pas la classe Object. Par exemple. Classe A{ }

La classe B étend A {}

Ici, le compilateur ajoutera implicitement la classe Object Object dans la déclaration de classe A.

Classe A étend l'objet {}

La classe B étend A {}

Comme la classe A étend la classe Object, elle fournira les fonctionnalités de base de la classe Object telles que equals (), toString (), etc. Et puisque la classe B étend la classe A qui étend implicitement l'objet de classe, la classe B fournit également toutes ces fonctionnalités.

Ainsi, en suivant cette approche, tous les objets de classe (variables) sont conformes aux fonctionnalités que chaque Java objet devrait avoir, sans aller pour l'héritage multiple (une classe s'étendant sur plus d'une classe) qui Java ne le permet pas. Cette approche suit l'héritage à plusieurs niveaux.

3
user1425349

Quoting Head first Java 2nd edition:

Sans une superclasse commune pour tout en Java, il n'y aurait aucun moyen pour les développeurs de Java de créer des classes avec des méthodes qui pourraient prendre vos types personnalisés ... types dont ils ignoraient quand ils a écrit la classe ArrayList.

Ce qui explique essentiellement la nécessité d'un type de classe prédéfini générique en Java, qui peut être utilisé pour implémenter les différentes fonctionnalités fournies par le langage.

2
Aaditya

Voir les docs :

La classe Object, dans le package Java.lang, se trouve en haut de l'arborescence de la hiérarchie des classes. Chaque classe est un descendant, direct ou indirect, de la classe Object. Chaque classe que vous utilisez ou écrivez hérite des méthodes d'instance d'Object. Vous n'avez pas besoin d'utiliser l'une de ces méthodes, mais, si vous choisissez de le faire, vous devrez peut-être les remplacer par du code spécifique à votre classe.

La classe Object définit simplement l'état de base que tous les objets doivent avoir - Comme la comparer à d'autres objets.

C'est la classe parent de tout. Il fournit simplement une sorte de modèle à tous les objets dérivés.

2
Maroun

C'est une décision de conception Java. Il utilise le concept d'héritage et de réutilisation. Cela garantit que toutes les classes ont des méthodes de base comme wait(), toString() etc.

2
Aneesh

La classe d'objets est la plus super classe de Java, elle a des méthodes prédéfinies selon les types, vous pouvez utiliser ces méthodes. & Vous n'avez plus besoin d'étendre la classe d'objets & partout où elle est implicitement là

2
Yasa