Pourquoi est-ce que chaque objet en Java implicitement étendre java.lang.La classe d'objet?
J'ai été la programmation en Java pour assez un certain temps, mais quand j'ai essayé d'expliquer ce qu'est un java.lang.Object
classe est pour un ami, je ne pouvais pas venir avec plus qu'un simple one-liner:
Tous les objets en Java étendre
java.lang.Object
implicitement
Je n'étais pas très bien pourquoi il devrait le faire.
Donc, j'ai regardé le code source sur GrepCode, en espérant que je puisse trouver quelques indices. Maintenant, je sais ce qu'est un java.lang.Object
est et ce qu'il fait, je veux savoir si il y avait une raison pour laquelle il a été conçu de cette façon.
Ma question subsiste: pourquoi chaque objet étendre java.lang.Object
?
- De sorte que vous pouvez en toute confiance Objet d'appel de méthodes sur un objet quelconque.
- Quelqu'un a demandé de la fermer, s'il vous Plaît laissez-moi savoir ce que tu ne comprends pas? Désolé Si je ne suis pas clair.
- N'est-ce pas un autre double question?...
- J'étais confus au premier abord, mais vous êtes essentiellement de se demander pourquoi Java est en une seule enracinée hiérarchie de classe? (Par opposition à la possibilité que les choses descendre de quelques autres de la racine de la classe)
- Chaque objet est une
Object
qu'il est utile d'avoir une fonctionnalité qui est commun à tous les objets. - J'ai voté pour le fermer car votre "Pourquoi chaque objet de la prolonger?" n'est pas claire. Il existe des méthodes sur l'objet, les méthodes qui sont disponibles pour chaque objet. Donc la réponse est tellement évidente qu'il doit y avoir quelque chose vous préoccupe et que quelque chose n'est pas clair.
- Donc, il s'agit tout simplement d'une décision de conception, est-il plus que cela pour elle?
- J'ai édité ma réponse.
- Pourquoi? afin de garantir les classes d'Objet d'appel de méthodes.
- Si votre question est "Pourquoi est-il implicite ?" alors la réponse est que Java est déjà gagner la course pour le niveau le plus détaillé de la langue, de sorte que l'ajout de "s'étend de l'Objet" pour tous les fichiers source n'était pas nécessaire.
- Ma question est pourquoi ne était pas sur le plan de la syntaxe... ou pourquoi ne pas ajouter un autre 2 mots dans tous les fichiers source.
- Basé sur tous les commentaires et les réponses, j'ai encore une question. Veuillez prendre un coup d'oeil à mon édité question.
Vous devez vous connecter pour publier un commentaire.
Je dirais que la raison est d'avoir une API commune pour tous les objets en java prend en charge des fonctionnalités de base comme
wait
,notify
,notifyAll
finalize
hashCode
,equals
clone
Et chaque objet
getClass
l'homme et peut lire des cordes -
toString
C'est la façon dont le langage est conçu. Chaque objet va hériter de la classe de base
Object
. Cela signifie qu'il est garanti pour chaque objet, il y aura certaines méthodes, comme latoString()
,equals()
,hashCode()
, etc.Je pense que l'utilisation la plus importante de
Object
n'est pas de fournir des méthodes communes commetoString()
, mais de fournir un commun type qui contiendrait tous les types référence.C++ n'ont pas de
Object
équivalent et les gens sont toujours heureux. Mais depuis que Java n'ont pas de pointeurs en C++comme modèles,Object
est nécessaire de faire des mises en œuvre deCollection
s, etc. possible.Voir aussi sur les discussions de référence et de type primitif.
Je dirais
Design
. Commune/méthodes Obligatoires qui chaqueObject
devrait soutenir l'écrit et l'extension de cette classe comme un langage de spécification.Vous de trouver les raisons ici dans Officiel Docs.
Si nous disons que c'est un
Object
,Ils doivent avoir les méthodes courantes, Qui sont définis ou décidé parAPI
.Imaginer les méthodes ci-dessous pour chaque classe sur votre Propre.
Le notify, notifyAll, et d'attendre les méthodes de l'Objet jouent tous un rôle dans la synchronisation des activités de façon indépendante threads en cours d'exécution dans un programme:
Afin de réduire la douleur, à créer un projet commun et standard
API
.clone
doit avoir appartenu à une "magique"CloneableObject
de la classe de base, etfinalize
doit avoir été remplacé par un "enregistrer pour le nettoyage de la notification" de la méthode. Avoir les fonctions universelles de trouver une classe de l'objet, bien que, et de définir une relation d'équivalence est utile [ce dernier serait encore plus utile si les objets avaient paires séparées d'égal à égal/hashCode des méthodes de toujours définir les deux universel relations d'équivalence, plutôt que d'utiliser une paire de méthodes, mais à l'encontre de la sur lequel relation qu'elle met en œuvre].Ceci est fait de sorte que la plupart des fonctions de base comme toString (), etc, serait automatiquement hérité et à votre prochaine question, c'est PAS l'héritage multiple, c'est multiniveau l'héritage...
Dans l'héritage multiple seule classe est dérivée à partir de 2 ou plus de la classe de base alors que dans le multi-niveaux comme vous l'avez dit, il a une classe de base qui est elle-même dérivée de la classe d'Objet
Chaque Classe étend la classe d'Objet implicitement pour qu'ils fournissent des fonctionnalités de base qui, selon Java recommandation de chaque classe devrait avoir. Comme clone(), equals(), hashCode(), toString(), etc.
Par implicitement, cela signifie que si vous n'êtes pas de l'extension de toute la classe, puis seulement compilateur implicitement s'étend de la classe d'Objet.Mais si la classe s'étend déjà autre classe alors le compilateur va pas s'étendre de la classe d'Objet. Pour eg.
Class A{
}
Class B extends A{
}
Ici, le compilateur va implicitement ajouter étend la classe d'Objet dans la classe Une déclaration.
Classe Un s'étend Objet{
}
Class B extends A{
}
Comme Une classe étend la classe d'Objet, de sorte qu'il sera de fournir des fonctionnalités de base de la classe d'Objet comme equals(), toString(),etc. Et depuis la Classe B s'étend de la classe A, qui s'étend implicitement de la Classe de l'Objet, de sorte que la classe B offre également toutes les fonctionnalités.
Donc en suivant cette approche, tous les objets de la classe(variables) est conforme à des caractéristiques qui chaque Objet Java doit avoir, sans passer pour l'Héritage Multiple (une classe étendant plus d'une classe) qui Java ne permet pas. Cette approche suit Multi-Niveau de l'Héritage.
Voir le docs:
La
Object
classe définit simplement la base de l'état qui tous objets doivent avoir - Comme le comparant à d'autres objets.C'est le parent classe de tout. Il fournit simplement à type de modèle à tous les objets dérivés.
C'est une java décision de conception. Il met à utiliser le concept d'héritage et de re-usabilty. Cela garantit que toutes les classes ont quelques méthodes de base comme
wait()
,toString()
etc.Classe d'objet est le plus super-classe de la programmation java, Il a des méthodes prédéfinies selon les types, vous pouvez utiliser ces méthodes. & vous n'avez pas besoin de s'étend de la classe d'objet plus & partout où il est implicitement il y
Citant la Tête la première, Java 2nd edition:
Qui explique l'essentiel du besoin générique d'une classe prédéfinie type en Java, qui peut être utilisé pour mettre en œuvre les différentes fonctionnalités offertes par la langue.