9
votes

Une instance de superclasse est-elle créée lorsque nous instancions un objet?

Une instance de superclasse est-elle créée lorsque nous instancions une classe particulière en Java. Si tel est le cas, il y aurait beaucoup de frais généraux d'instanciation de toutes les superches super. J'ai essayé du code suivant: xxx

La sortie du code est la suivante: xxx

Alors, signifie-t-il que la hiérarchie complète des objets des superclasses sont créées lorsque nous instancions une classe?


0 commentaires

3 Réponses :


12
votes

Un seul objet est créé - mais cet objet est une instance de la superclasse et de la sous-classe (et java.lang.Object ). Il n'y a pas trois objets distincts. Il y a un objet avec un ensemble de champs (fondamentalement l'union de tous les champs déclarés de haut en bas de la hiérarchie) et d'un en-tête d'objet.

Les constructeurs sont exécutés de la hiérarchie d'héritage - mais le Cette référence sera la même pour tous ces constructeurs; Ils contribuent tous à l'initialisation de l'objet unique.


2 commentaires

J'ai toujours pensé (incorrectement) qu'une sous-classe distincte et un objet superclasse séparé sont créées sur la création d'un objet d'une sous-classe.


Et voici comment cela fonctionne dans Python aussi ou pour cette affaire C ++ (je crois, je ne l'ai pas essayé). Droit ?



2
votes

Oui, c'est tout l'héritage de la classe.

Vous n'étudiez pas deux objets, cependant: vous instanciez un objet et exécutez à la fois le aclass , puis le constructeur bclass sur celui-ci. Le constructeur aclass est responsable de l'initialisation des pièces héritées de aclass et du constructeur bclass est responsable de l'initialisation des éléments supplémentaires définis dans < Code> Bclass .


1 commentaires

J'ai toujours pensé (incorrectement) qu'une sous-classe distincte et un objet superclasse séparé sont créées sur la création d'un objet d'une sous-classe.



3
votes

Oui.

Le constructeur de bclass ressemble à ceci: xxx

Si vous ne souhaitez pas utiliser le constructeur par défaut, vous pouvez faire comme ceci: < Pré> xxx

de Oracle Site: Si un constructeur n'invoque pas explicitement un constructeur de Superclass, le compilateur Java insère automatiquement un appel au constructeur sans argument de la superclasse. Si la super classe n'a pas de constructeur sans argument, vous obtiendrez une erreur de compilation. L'objet a un tel constructeur, donc si l'objet est la seule superclasse, il n'y a pas de problème.


1 commentaires

+1 pour énoncer explicitement la ligne cachée "super ()". C'était un point de confusion pour moi de retour quand j'ai commencé à coder en Java.