Comprendre les Objets

Fermé
Ludo - 4 oct. 2016 à 10:31
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 7 oct. 2016 à 22:09
Bonjour,
J'apprend en ce moment le Java. J'ai du mal à ce que ça rentre car j'ai du mal à me rendre compte de ce que c'est qu'un objet. C'est la base de la programmation orientée objets, je sais, mais personne n'a pu clairement m'expliquer ce que c'est. Pour moi un objet, dans ma tête, c'est toujours matérialisé comme un objet physique qui a des caractéristiques qu'on défini dans un fichier à part.
J'ai vraiment du mal ^^

2 réponses

Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
4 oct. 2016 à 10:55
Salut,

Tu as une bibliothèque pleine de livre chez toi.

La bibliothèque sera l'objet informatique. C'est une fonction (structure en bois) contenant plusieurs variables (des livres).

Si tu veux lire le livre harry potter, tu devras aller à la bibliothèque et prendre le livre de la bibliothèque

ex : bibliothèque.getHarryPotter

Harry potter est un objet de bibliothèque.

Tu ne peux pas prendre harry potter du lit.

lit.getHarryPotter sera faut car il fait partit de bibliothèque pas de lit.

En espérant avoir expliqué comme il faut.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
7 oct. 2016 à 20:13
Bonjour,

Oui c'est ça, c'est qu'il y a deux approches différentes pour expliquer ce qu'est un objet, selon la sensibilité de chacun. Il y a l'explication par l'usage, l'approche du résultat: L'objet est une entité permettant de lier des données et du code (sous forme de méthodes - des fonctions d'objets) agissant sur ces données; Un objet peut hériter des données et du code d'un objet source, en ajouter, ou remplacer différentes parties du code ou modifier l'implémentation de certaines données. L'objet lui-même ou l'utilisateur de l'objet peut donc utiliser ses méthodes en l'état, mais un objet hérité pourra remplacer les méthodes déclarées comme modifiables.
Par exemple, on créé un objet servant à représenter une colonne dans un tableau, cet objet contiendra donc entre autres une méthode "draw" pour dessiner la colonne, et le code du tableau appellera cette méthode pour dessiner chacune des colonnes. Par la suite, il est possible de créer une instance d'objet spécifique à chaque colonne, et surtout, il est possible de dériver des objets de manière à créer des colonnes spécifiques, avec une méthode "draw" remplacée par une méthode propre à chaque type, par exemple.
Le code du tableau appellera donc la méthode "Draw" de chaque objet colonne, mais la méthode "draw" effectivement exécutée dépendra de la classe de l'objet.

L'autre explication autour de l'objet me convient mieux personnellement, car elle permet d'en déduire toute la subtilité: L'objet est un enregistrement +c'est à dire la structuration d'une zone mémoire+ ayant en plus un champ caché, un pointeur sur une structure décrivant toutes les informations de classe de celui-ci, donc l'ensemble de sa déclaration.
Chaque instance de l'objet contient donc non seulement la zone de données propres, mais aussi ce fameux pointeur de classe, qui détermine la classe de l'objet et donc son comportement.
Le cas le plus classique et le plus efficace est la lecture dans la Vmt (Virtual Methodes Table - concernant les méthodes déclarées virtuelles) : Chaque classe d'objet comprend notamment une vmt qui lui est propre.
Chaque méthode virtuelle se voit attribuer un indice dans la vmt de toutes les classes d'objets dérivées, et le compilateur lit donc le pointeur de fonction correspondant à l'indice dans cette table pour savoir quel code exécuter.
C'est à dire que lorsque qu'une méthode d'objet est appelée, le compilateur lit le pointeur de classe au tout début de l'instance concernée, et retrouve le pointeur de la fonction voulue dans la Vmt de cette classe, ou par différents moyens selon qu'elle est déclarée virtuelle, dynamique, indicée, etc...
Ainsi, un programme utilise des méthodes d'objets "en dur", mais il est possible de remplacer l'objet par un autre, et donc de modifier son comportement sans réécrire tout le code!
En résumé, ce qu'on appelle une fonction correspond à l'adresse directe du code en mémoire, tandis qu'une méthode s'utilise de la même manière, mais le compilateur lit l'adresse de la fonction correspondante en temps réel, et dépendamment de la classe de l'objet à partir duquel on exécute la-dite méthode.
Sans l'approche objet, on se retrouve avec des tests innombrables : "si c'est tel type exécute ceci, si c'est tel autre type exécute cela, etc.." alors qu'avec le fonctionnement objet, on remplace ces tests par l'appel d'une méthode au nom unique, et c'est ensuite la classe de l'objet qui déterminera quelle fonction sera exécutée. C'est non seulement révolutionnaire au niveau de la simplification apportée, mais en plus la poo se paye le luxe d'être hyper optimisée, parce qu'il est bien plus rapide de lire une seule fois dans la vmt (en deux opérations asm) que de faire des batteries de tests!
Voilà, pour faire court...
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
7 oct. 2016 à 20:35
"Voilà, pour faire court..."
C'est ce que l'on appelle un retour en grande pompe, cela faisait longtemps que l'on n'avait pas eu l'occasion de te lire ;-)
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
7 oct. 2016 à 22:09
Hihi hé oui Kx, ça faisait quelque temps car je manque trop de ce dernier!
Et comme je n'en suis toujours qu'au stade d'admirer ton fameux esprit de synthèse, je me prive de tenter d'aider ;-}
0