Récemment, j'ai une certaine expérience dans l'attribution d'objets de sous-classe à des objets de classe parent, et j'aimerais la partager avec vous. Mais mon niveau est limité, alors corrigez-moi et critiquez-moi.
Plus près de chez nous, voici quelques petits exemples, n'hésitez pas à y jeter un oeil.
Testez-en un
Classe parentale :
Sous-classe :
Résultat : il s'agit de la méthode print() de la classe parent - l'objet à ce moment est Subclass@126b249
À l'heure actuelle, l'objet est Subclass@126b249
illustrer:
Supclass sup=nouvelle sous-classe();
Bien que l'objet déclaré soit un objet de classe parent, l'espace mémoire réel appartient à l'objet de sous-classe.
La méthode public void print() héritée de la classe parent est appelée et le résultat est la résolution du nom de l'objet de sous-classe.
Conclusion : L'objet déclaré au moment de la compilation est un objet de classe parent, mais au moment de l'exécution, c'est un objet de sous-classe. Si la sous-classe ne remplace pas la méthode de la classe parent, l'objet appelle à ce moment la méthode héritée de la classe parent.
Essai 2
Classe parentale :
Sous-classe :
Résultat : il s'agit de la méthode print() de la sous-classe - à ce stade, l'objet est Subclass@126b249
À l'heure actuelle, l'objet est Subclass@126b249
illustrer:
Sur la base de l'exemple précédent, j'ai réécrit la méthode print() de la classe parent. A ce moment, la méthode print() de la sous-classe a été appelée.
Conclusion : Sur la base de la conclusion de l'exemple précédent, je suis arrivé à une conclusion : à ce stade, l'objet est bien un objet de sous-classe lors de son exécution. Si la sous-classe n'écrit pas la méthode de la classe parent,
Ensuite, l'objet appelle à ce moment la méthode héritée de la classe parent ; sinon, l'objet appelle à ce moment la méthode de sous-classe.
Question : Pouvons-nous tirer la conclusion suivante du test ci-dessus : attribuer l'objet de sous-classe à l'objet de classe parent (c'est-à-dire Supclass sup=new Subclass()),
Ce que nous obtenons est un objet de sous-classe, c'est-à-dire que sup est un objet de sous-classe ??????
Testez trois
Classe parentale :
Sous-classe :
Résultat : Attributs à ce moment : attributs de classe parent
Remarque : sur la base du premier test, j'ai ajouté un attribut className à la classe parent et remplacé cet attribut dans la sous-classe.
Mais lorsque j'affiche les propriétés de l'objet à ce moment-là, ce sont les propriétés de la classe parent.
Conclusion : lors de l'attribution d'objets de sous-classe à des objets de classe parent, les méthodes et propriétés sont très différentes de notre relation d'héritage orthodoxe.
question:
L'objet est-il actuellement un objet de sous-classe ou un objet de classe parent ?
Commencez à spéculer :
Il y a quelques points que je dois souligner avant de spéculer :
1. Lorsque nous créons un nouvel objet de sous-classe, le constructeur de l'objet de classe parent est également exécuté en même temps, c'est-à-dire que certaines informations nécessaires de la classe parent et de l'objet de sous-classe occupent le même espace mémoire.
Lorsque nous remplaçons la méthode, nous pouvons utiliser le super objet pour faire référence à la classe parent.
2. Les objets en Java ne sont pas entièrement orientés objet, c'est-à-dire que les attributs et les méthodes d'un objet ne sont pas encapsulés en même temps dans l'objet.
Mais l'objet a ses propres attributs, mais la méthode fait référence à la méthode de la classe. On peut dire qu'elle encapsule les références des attributs et des méthodes de la classe dans l'objet.
Ainsi, la méthode appelée par l'objet n'est pas sa propre méthode, mais la méthode de la classe. Quant à savoir pourquoi Java fait cela, je ne sais pas.
3. Lorsque l'objet est chargé dans la mémoire, la classe est d'abord chargée dans la mémoire, puis la classe doit rester dans la mémoire. Quant au moment où la classe disparaît de la mémoire, je ne sais pas.
Je pense que Java doit avoir son propre mécanisme de recyclage, tout comme le recyclage des objets.
4. La compilation et l'exécution sont des choses complètement différentes. Les principales choses que vous faites lors de la compilation sont de déclarer le type de l'objet, d'attribuer des attributs, de vérifier les erreurs de syntaxe, etc.
Ce que fait le runtime, c'est charger des objets en mémoire (généralement en utilisant new, la réflexion est également couramment utilisée), exécuter des fonctions d'exécution de code, etc.
5. Si vous, lecteur, et moi ne sommes pas d’accord sur ces points, ou si nous n’avons pas la même compréhension sur ces points, vous penserez que je dis des bêtises.
Peut-être penserez-vous que mon score d'expert est trop faible, et donc ma crédibilité est faible. Mais ce que je veux dire, c'est qu'il n'y a pas d'ordre d'apprentissage, et ceux qui maîtrisent passent en premier.
Haha, je suis prêt à transformer mes points d'expert en valeurs négatives, fini les bêtises, continuons.
Spéculation:
1. Lorsque nous compilons Supclass sup=new Subclass(), l'objet sup est déclaré comme la classe Supclass, donc les attributs de l'objet sup sont les valeurs des attributs de l'objet de classe parent.
3. En continuant à l'étape 2, si nous substituons la méthode de la classe parent, puisque l'espace mémoire de l'objet sup est l'espace mémoire de l'objet sous-classe, la méthode de la sous-classe public void print() a été chargée dans la mémoire.
Donc, ce que nous appelons est la méthode public void print() de la sous-classe ; si vous devez appeler la méthode remplacée de la classe parent, vous devez utiliser super.
Ce passage peut expliquer le test 2.
Résumer:
Ce qui suit sont des opinions purement personnelles :
Affectez l'objet de sous-classe à l'objet de classe parent et l'objet résultant est un objet comme celui-ci :
Il est compilé en tant qu'objet de classe parent, mais s'exécute en tant qu'objet de sous-classe. Les caractéristiques spécifiques sont les suivantes.
1. Déclaré comme objet de classe parent 2. Possède des attributs de classe parent 3. Occupe l'espace mémoire de la sous-classe 4. Lorsque la méthode de la sous-classe remplace la méthode de la classe parent, l'objet appelle la méthode de la sous-classe à ce moment-là ; appelées Méthodes de la classe parent.
5. Je pense que cet objet n'est ni un objet de classe parent ni un objet de sous-classe. Lorsque nous utilisons ses méthodes,
Je le traite comme un objet de sous-classe ; si j'utilise ses propriétés, je le traite comme un objet de classe parent.
C'est un objet qui occupe les attributs de la classe parent et utilise les méthodes de la sous-classe. Quant au type d'objet dont il s'agit, je pense que cela dépend de la déclaration. Il doit être considéré comme un objet de classe parent, mais il a une sous-classe. méthodes.
Pensez-y :
Sur la base du test 3, comment extraire les attributs de la sous-classe ? ? ? ? ?