Maison  >  Article  >  Java  >  Introduction détaillée à l'introduction des objets Java

Introduction détaillée à l'introduction des objets Java

黄舟
黄舟original
2017-03-01 11:13:111128parcourir

(1) Le processus d'abstraction des choses

La complexité des problèmes que les gens peuvent résoudre dépend de la capacité à abstraire les choses Dans quelle mesure.

Les mathématiques et la physique avancées sont des choses très abstraites. Ils sont étudiés à un niveau extrêmement abstrait et, une fois qu'ils auront fait de grands progrès, ils auront un grand impact sur notre vie quotidienne. Par exemple, la théorie de la relativité d'Einstein, dont la découverte a eu un impact énorme sur le monde. Il en va de même pour la programmation. Plus le niveau d’abstraction est élevé, plus nous pouvons utiliser un code concis pour les décrire.

Alan Kay a un jour résumé les cinq caractéristiques de base de Smalltalk, le premier langage orienté objet à succès et l'un des langages sur lesquels Java est basé. Ces caractéristiques représentent une pure approche de conception orientée objet. :

  1. Tout est un objet

  2. Un programme est une collection d'objets, et ils se disent quoi faire en envoyant messages

  3. Chaque objet a son propre stockage composé d'autres objets

  4. Chaque objet a son type

  5. Tous les objets d'un type spécifique peuvent recevoir le même message

Ou nous pouvons décrire les objets de manière plus concise : Les objets ont un état, des comportements et des logos . Chaque objet possède des données internes, des méthodes et une adresse unique.

(2) Chaque objet a sa propre fonction

Tous les objets sont uniques, mais ont les mêmes caractéristiques et comportements faisant partie de la classe. Par exemple, il y a beaucoup de moineaux dans le ciel, et chaque moineau est un individu indépendant, mais ces individus sont tous des moineaux et ils ont tous les caractéristiques des moineaux.

Chaque objet est un fournisseur de services. Nous pouvons effectuer nos propres opérations en appelant des méthodes dans cet objet et en utilisant des variables dans l'objet. Considérer les objets comme des fournisseurs de services présente un avantage secondaire : cela contribue à rendre les objets plus cohérents. Une cohésion élevée est l'une des exigences de qualité de base de la conception de logiciels, ce qui signifie qu'une structure logicielle est bien organisée. Dans cette classe, toutes les méthodes et attributs sont créés pour une seule fonction. et sont très pratiques à utiliser. Mais l’un des problèmes auxquels nous sommes confrontés chaque jour lorsque nous concevons des objets est que nous regroupons souvent trop de fonctions dans un seul objet.
Dans une bonne conception orientée objet, chaque objet accomplit bien une tâche et n'essaie pas d'en faire plus. Une telle conception aura un autre avantage : faible couplage. Parce que chaque objet a ses propres méthodes d'attributs hautement cohérentes, ils sont tous nés pour faire leurs propres « choses ». Plusieurs objets de différents types obtiennent ce faible couplage en combinant leurs fonctions respectives.

(3) Encapsulation - implémentation spécifique cachée

Dans le modèle à sept couches de la structure du réseau informatique, chaque couche est fermée les unes aux autres, et finalement complétée. structure de réseau entière, depuis les opérations informatiques les plus virtuelles jusqu'aux opérations de circuits électroniques sous-jacentes. Entre ses couches, la couche supérieure ne peut voir que l'interface de la méthode de la couche suivante. Elle ne peut savoir que comment appeler la méthode de la couche suivante, mais n'est pas intéressée par l'implémentation spécifique du code de la couche suivante.
Dans le code Java, trois mots-clés sont utilisés pour fixer les limites dans la classe. Ces trois mots de désignation d'accès déterminent qui peut utiliser le contenu qui suit :

  1. public : Classe actuelle Package actuel Descendants autres packages

  2. protégé : Classe actuelle Package actuel Descendants

  3. Par défaut (non modifié) : Classe actuelle Package actuel

  4. privé : Classe actuelle

(4) Réutilisation et combinaison

La réutilisation et la combinaison de code sont l'un des avantages les plus étonnants offerts par les langages de programmation orientés objet.

Le moyen le plus simple de réutiliser est d'utiliser directement un objet de cette classe. De plus, vous pouvez également placer un objet de cette classe dans une nouvelle classe. Nous appelons cette méthode de réutilisation « création d'un objet membre ». La nouvelle classe peut être composée de n'importe quel nombre d'autres objets de n'importe quel type, de quelque manière que ce soit, permettant d'obtenir la fonctionnalité souhaitée dans la nouvelle classe. Parce que vous utilisez des classes existantes pour synthétiser de nouvelles classes, ce concept est appelé composition.
Nous pensons généralement à la combinaison comme à une relation - "a-a".

Par rapport à de nombreux novices qui aiment utiliser les relations d'héritage dans leurs propres classes, en fait, la composition doit être prise en compte en premier lors de la création d'une nouvelle classe car elle est plus flexible. Si vous utilisez cette combinaison, le design deviendra plus clair.

(5) Héritage

Nous n'introduireons pas ce que signifie l'héritage. Il convient de mentionner que lorsque nous réfléchissons à la manière d'abstraire la classe parent dans le projet, nous pouvons y penser. Plusieurs sous-classes, utilisez plusieurs sous-classes pour découvrir ce qu'elles ont en commun, ce qui nous est très utile pour faire abstraction de la classe parent.

En raison de la relation d'héritage, tous les messages qui peuvent être envoyés aux objets de la classe de base peuvent également être envoyés aux objets de la sous-classe. Cela signifie qu'en effet, la sous-classe a le même type que la classe parent . Si nous héritons simplement de la classe parent et remplaçons uniquement les méthodes sans créer de nouvelles méthodes dans la classe parent, nous pouvons l'appeler substitution pure Pour une substitution pure, nous utilisons - "is-a" pour exprimer cette relation. . Pour ceux qui non seulement héritent de la classe parent, mais ajoutent également de nouvelles méthodes basées sur la classe parent, nous utilisons - "is-like-a" pour exprimer cette relation.

(6) Caractéristiques du polymorphisme et de la liaison tardive

Lorsque nous traitons de structures hiérarchiques, nous traitons souvent un objet non pas comme un objet spécifique, mais plutôt comme un objet spécifique. leur classe parent. Par exemple, nous devons transmettre une liste. Pour le moment, nous n'avons pas besoin de distinguer s'il s'agit d'une ArrayList ou d'une LinkedList dans les paramètres de la méthode. Ce polymorphisme enrichit grandement le programme.

Mais il y a ici un problème simple mais difficile à expliquer : par exemple, la méthode ci-dessus appelle la fonction add après avoir transmis une liste. Comment cette méthode sait-elle quelle fonction add appeler pour la liste passée ? ?

La réponse à cette question est également le conseil le plus important en programmation orientée objet : Le compilateur ne génère pas d'appels de fonction à liaison anticipée au sens traditionnel, mais utilise la méthode de liaison tardive. Un appel de fonction généré par un compilateur non orienté objet provoquera ce que l'on appelle une liaison anticipée. Cette méthode de liaison signifie que le compilateur générera un appel avec un nom de fonction spécifique et que le runtime se résoudra au. adresse absolue du code à exécuter. Pour résoudre ce problème, la POO utilise le concept de liaison tardive. Lors de l'envoi d'un message à un objet, le code appelé ne peut être déterminé qu'au moment de l'exécution. Le compilateur s'assure que la méthode appelée existe et vérifie les valeurs de retour des paramètres, mais il ne connaît pas le code exact qui sera exécuté.

En C, vous devez déclarer explicitement via le mot-clé virtual que vous souhaitez qu'une méthode ait la flexibilité apportée par les attributs de liaison tardive, ce qui signifie qu'elle n'est pas une liaison tardive par défaut. En Java, la liaison dynamique est le comportement par défaut.

(7) Structure d'héritage à racine unique

En Java, toutes les classes héritent finalement d'une seule classe de base, et cette classe de base est Object. Il s'avère que la structure d'héritage à racine unique apporte de nombreux avantages. L'héritage à racine unique facilite grandement la mise en œuvre d'un garbage collector. Étant donné que tous les objets sont assurés d'avoir leurs informations de type, il n'y a pas de blocage dû à l'incapacité de déterminer le type d'un objet.

(8) Création d'objets et cycle de vie

Quand on parle de création et de cycle de vie d'objets, de nombreux langages ne peuvent s'empêcher de penser. Sa manipulation varie. C estime que le contrôle de l'efficacité est la question la plus importante, c'est pourquoi C donne aux programmeurs le droit de choisir. Vous pouvez en créer un nouveau par vous-même, mais vous devez supprimer l'espace créé par new, sinon vous tomberez dans le fameux problème de fuite de mémoire.
En Java, tous les objets sont créés dynamiquement dans le pool de mémoire tas. Dans cette approche, vous ne savez pas avant l'exécution combien d'objets sont nécessaires, quel est leur cycle de vie et quels sont leurs types spécifiques. De tels problèmes ne peuvent être déterminés qu'au moment où le code concerné est exécuté pendant l'exécution du programme. Il faut donc beaucoup de temps pour allouer de l'espace de stockage dans le tas, ce qui peut être beaucoup plus long que le temps nécessaire pour créer de l'espace de stockage dans la pile. La création et la libération d'espace de stockage sur la pile ne nécessitent généralement qu'une seule instruction. Le temps nécessaire pour créer un stockage en tas dépend de la conception du mécanisme de stockage.

(9) Gestion des exceptions

L'exception est un objet. Il a été « jeté » du point de vue de l'erreur. et sont "attrapés" par les gestionnaires d'exceptions correspondants spécifiquement conçus pour gérer des types spécifiques d'erreurs. La gestion des exceptions est comme un autre chemin exécuté en parallèle avec le chemin d'exécution normal du programme lorsqu'une erreur se produit. Puisqu’il s’agit d’un chemin d’exécution complètement distinct, il n’interfère pas avec l’exécution normale du code.

Il convient de noter : La gestion des exceptions n'est pas une fonctionnalité orientée objet - bien que dans les langages orientés objet, la gestion des exceptions soit souvent représentée comme un objet. La gestion des exceptions existait avant l'existence des langages orientés objet.

Ce qui précède est une introduction détaillée aux objets Java. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn