Cours Java - Héritage, Polymorphisme et Classes Génériques (PDF)

Document Details

Uploaded by Deleted User

Département de Génie Informatique

A. Mazoul

Tags

Java programming object-oriented programming inheritance Generics

Summary

Ce document est un cours sur la programmation orientée objet en Java, se concentrant sur l'héritage, le polymorphisme et les classes génériques. Il décrit les concepts clés, les exemples et les différences entre diverses approches.

Full Transcript

Programmation Orientée Objet et Langage Java 2- Héritage Module: Programmation Objet Avancée A.Mazoul Département Génie informatique Programmation orienté objet en Java...

Programmation Orientée Objet et Langage Java 2- Héritage Module: Programmation Objet Avancée A.Mazoul Département Génie informatique Programmation orienté objet en Java Héritage en Java Qu’est-ce que héritage On parle d’héritage pour désigner le mécanisme qui permet d’implémenter la relation « est un » (is-a). Le terme d’héritage vient du fait qu’une classe qui en étend une autre hérite les attributs et les méthodes la classe mère.  Intérêt  la possibilité de reprendre intégralement tout ce qui a déjà été fait et de pouvoir l'enrichir. Personne  la possibilité de regrouper en un seul endroit ce qui est nom commun à plusieurs. cin lire()  Programmation sans héritage Etudiant Employe - Duplication de code. - Une modification faite sur un attribut (ou nom nom méthode) commun doit être refaite dans les cin cin autres classes. moyenne salaire lire() lire() reviser() travailler() A.Mazoul Programmation orienté objet Java 2 Programmation orienté objet en Java Héritage en Java Pourquoi l’héritage  Avec l’héritage Super-classe  On place dans la classe mère (super-classe) Classe mère tous les attributs et toutes les méthodes Personne communs à toutes les classes. nom cin  Les classes filles (sous-classes) ne comportent que les attributs ou méthodes plus spécifiques. lire()  Les classes filles (sous-classes) héritent Héritent de automatiquement les attributs (et les méthodes) qui n'ont pas besoin d'être réécrits Etudiant Employe moyenne salaire  Réutilisation du code reviser() travailler()  Un seul endroit pour faire des modifications sur les attributs ( ou méthodes) en commun Sous-classes Classes filles A.Mazoul Programmation orienté objet Java 3 Programmation orienté objet en Java Héritage en Java l’héritage en Java En Java, l’héritage est indiqué par le mot clé extends après le nom de la classe. Et On dit qu’une classe en étend (hérite) une autre. La classe qui est étendue est appelée classe mère (super-classe ou classe parente) et la classe qui étend (qui hérite) est appelée classe fille (sous-classe ou classe enfant). A.Mazoul Programmation orienté objet Java 4 Programmation orienté objet en Java Héritage en Java l’héritage en Java Le langage Java ne permet pas de l'héritage multiple, donc une classe ne peut avoir qu’une seule classe mère. Personne EtreHumain nom peau cin yeux lire() respirer() respirer() Etudiant moyenne reviser() pas d'héritage multiple en java Le compilateur Java ne peut pas décider quelle méthode respirer() il doit hériter. Pour éviter toute ambiguïté, l’héritage multiple n’est pas pris en charge en Java. A.Mazoul Programmation orienté objet Java 5 Programmation orienté objet en Java Héritage en Java Le mot-clé super Le mot-clé « super » permet de désigner la classe mère (super-classe). super permet d'accéder aux attributs et méthodes de la super-classe.  Pour manipuler un attribut de la super-classe : super.cin  Pour manipuler une méthode de la super-classe : super.lire()  Pour faire appel au constructeur surchargé de la super-classe: super(nom,cin)  super() fait appel au constructeur par défaut de la classe mère super() A.Mazoul Programmation orienté objet Java 6 Programmation orienté objet en Java Héritage en Java Constructeur de la classe fille (sous-classe) La première instruction dans le constructeur de la sous-classe doit être l’appel au constructeur de la superclasse avec le mot clé super. Si on ne fait pas d’appel explicite au constructeur de la superclasse, c’est le constructeur par défaut de la superclasse qui est appelé implicitement. le constructeur par défaut n’est pas défini. Erreur de compilation Implicit super constructor Animal() is undefined for default constructor. Must define an explicit constructor Solution 1 Solution 2 Remplacer super() par super(4) A.Mazoul Programmation orienté objet Java 7 Programmation orienté objet en Java Héritage en Java Enchaînement des constructeurs Appel implicite ou explicite à super(). Je suis une Forme Exécution Je suis un Rectangle Je suis un Carre A.Mazoul Programmation orienté objet Java 8 Programmation orienté objet en Java Héritage en Java Enchaînement des constructeurs Appel implicite à super() de la classe Rectange Appel implicite à super() de la classe Carre Je suis une Forme Exécution Je suis un Rectangle Je suis un Carre A.Mazoul Programmation orienté objet Java 9 Programmation orienté objet en Java Héritage en Java Redéfinition des méthodes On dit qu’une méthode d’une sous-classe redéfinit une méthode de sa classe supérieure (super-classe), si elles ont la même signature mais que le traitement effectué est réécrit dans la sous-classe. la même signature pour les deux méthodes Afficher() avec des contenus différents On parle alors de redéfinition des méthodes (override) A.Mazoul Programmation orienté objet Java 10 Programmation orienté objet en Java Héritage en Java Redéfinition des méthodes Possibilité de réutiliser le code de la méthode héritée (super) Je suis un Carre Exécution Je suis un Rectangle A.Mazoul Programmation orienté objet Java 11 Programmation orienté objet en Java Héritage en Java Surcharge des méthodes La surcharge de méthode consiste à garder le nom d'une méthode et à changer le nombre ou les types de ses paramètres. On garde le même nom de la méthode, le même type de retour et on change les paramètres Rectangle possède deux méthode :  Afficher()  Afficher(String couleur) A.Mazoul Programmation orienté objet Java 12 Programmation orienté objet en Java Héritage en Java Empêcher la redéfinition il est possible d’interdire la redéfinition d’une méthode ou d’une variable en introduisant le mot-clé final au début d’une signature de méthode ou d’une déclaration de variable. Il est aussi possible d’interdire l’héritage d’une classe en utilisant final au début de la déclaration d’une classe (avant le mot-clé class). Toutes les méthodes à l’intérieur de la classe final seront implicitement finales De nombreuses classes de la bibliothèque standard Java sont déclarées comme final telles que java.lang.System ou java.lang.String. A.Mazoul Programmation orienté objet Java 13 Programmation orienté objet en Java Héritage en Java Héritage de la classe Object Toutes les classes java héritent implicitement de la classe Object. On dit alors que la classe Object est l’ancêtre de toutes les classes. A.Mazoul Programmation orienté objet Java 14 Programmation orienté objet en Java Polymorphisme Qu’est-ce que le Polymorphisme Le polymorphisme dans java veut simplement dire qu’une classe peut prendre plusieurs formes. Le polymorphisme est le fait de référencer une classe fille avec un référence déclaré de type une classe mère. Avec le polymorphisme : le type de la référence peut être la classe mère de l’objet instancié. Forme Forme form = new Rectangle(); Référence déclaré en Objet crée en Rectangle tant que Forme. tant que Rectangle. A.Mazoul Programmation orienté objet Java 15 Programmation orienté objet en Java Polymorphisme Principe du polymorphisme Le principe du polymorphisme repose en Java sur la redéfinition de méthodes. il faut que la méthode qui redéfinit possède une signature correspondante à celle de la méthode originale. Prenons l’exemple de la classe Animal. Cette classe offre une méthode show() qui va présenter le type de l’Objet en cours. Chaque classe fille change le comportement de la méthode show(). Animal Show() Chat Chien Show() Show() A.Mazoul Programmation orienté objet Java 16 Programmation orienté objet en Java Polymorphisme Principe du polymorphisme Cet exemple montre que la méthode show() exécutée dépend du type réel de l’objet et non pas du type de la référence. Chien Ref Show() Animal A.Mazoul Programmation orienté objet Java 17 Programmation orienté objet en Java Polymorphisme Tableau Polymorphique On peut mettre n’importe quel classe fille de la classe Animal() dans le tableau. A.Mazoul Programmation orienté objet Java 18 Programmation orienté objet en Java Polymorphisme Redéfinition et signature de méthode Les méthodes de portée private ne supportent pas le polymorphisme. Donc c’est la méthode de la classe mère qui sera appelée. Il est possible d’augmenter la portée (visibilité) de la méthode mais jamais de la réduire :  Une méthode de portée package (par défaut) peut être redéfinie avec la portée package mais aussi protected ou public.  Une méthode de portée protected peut être redéfinie avec la portée protected ou public.  Une méthode de portée public ne peut être redéfinie qu’avec la portée public. A.Mazoul Programmation orienté objet Java 19 Programmation orienté objet en Java Polymorphisme Polymorphisme et l’annotation @Override Les annotations sont des types spéciaux en Java qui commence par @. Les annotations servent à ajouter une information sur une classe, un attribut, une méthode, un paramètre ou une variable. L’annotation @Override s’ajoute au début de la signature d’une méthode pour préciser que cette méthode est une redéfinition d’une méthode héritée. Elle permet au compilateur de vérifier que la signature de la méthode correspond bien à une méthode d’une classe parente. A.Mazoul Programmation orienté objet Java 20 Programmation orienté objet en Java Polymorphisme Polymorphisme et méthodes de classe Les méthodes de classe (déclarées avec le mot-clé static) ne supportent pas la redéfinition. la méthode appelée dépend du type de la variable et non du type de l’objet référencé par la variable. A.Mazoul Programmation orienté objet Java 21 Programmation orienté objet en Java Polymorphisme Polymorphisme et Méthodes finales Une méthode qui a le mot-clé final dans sa signature ne peut plus être redéfinie par les classes qui en hériteront. L’utilisation du mot-clé final pour une méthode est réservée lorsqu'on souhaite garantir qu’une méthode aura toujours le même comportement même dans les classes qui en héritent A.Mazoul Programmation orienté objet Java 22 Programmation orienté objet en Java Polymorphisme Polymorphisme et Constructeurs L’exécution des constructeurs commencent par la classe la plus haute dans la hiérarchie d’héritage. C’est toujours le constructeur le plus ancêtre qui sera exécuté en premier. A.Mazoul Programmation orienté objet Java 23 Programmation orienté objet en Java Polymorphisme Polymorphisme et Constructeurs On peut choisir le constructeur de la classe mère à exécuter avec le mot-clé super(). A.Mazoul Programmation orienté objet Java 24 Programmation orienté objet en Java Polymorphisme Polymorphisme et Constructeurs Essayez d’expliquer le résultat du code ci-dessous. A.Mazoul Programmation orienté objet Java 25 Programmation orienté objet en Java Les classes abstraites Les classes abstraites Une classe abstraite ne peut pas être instanciée. Il est nécessaire de créer une sous-classe concrète (c'est-à-dire non abstraite !) qui l'étende. C’est-à-dire impossible de faire new NomClasse() Toute classe sous-classe d'une classe abstraite doit implémenter toutes les méthodes abstraites de cette dernière.. On appelle classe concrète une classe qui n’est pas abstraite. On ajoute le mot-clé abstract dans la déclaration de la classe (avant le mot-clé class) pour indiquer qu’elle est abstraite. une classe abstraite peut étendre une autre classe abstraite. une classe abstraite peut étendre une classe concrète. une classe concrète qui étend une classe abstraite doit obligatoirement fournir une implémentation pour toutes les méthodes abstraites de la classe mère. A.Mazoul Programmation orienté objet Java 26 Programmation orienté objet en Java Les classes abstraites Déclarer une méthode abstraite Une méthode abstraite possède une signature (prototype) mais pas de corps. Un classe abstraite peut déclarer des méthodes abstraites. Si au moins une méthode est abstraite, alors la classe est abstraite. Il faut utiliser le mot-clé abstract. Une classe qui hérite d’une classe abstraite doit obligatoirement implémenter toutes les méthodes abstraites héritées. Méthode abstraite Pas de corps de méthode Impossible d’instancier une classe abstraite A.Mazoul Programmation orienté objet Java 27 Programmation orienté objet en Java Interfaces Interfaces Une interface est une classe abstraite sans attributs et dont toutes les méthodes sont abstraites. Une interface se déclare avec le mot-clé interface. Une interface décrit un ensemble de méthodes en fournissant uniquement leur signature, sont par défaut de portée public. Une classe peut ensuite implémenter une ou plusieurs interfaces. Toute classe qui implémente l’interface à l’obligation d’implémenter toutes les méthodes avec le mot-clé implements. Une classe peut implémenter plusieurs interfaces, cela permet de contourner la limitation sur l’héritage multiples. Une interface se crée comme une classe, sauf qu’on utilise le mot clé Interface. Toutes les méthodes sont nécessairement abstraites A.Mazoul Programmation orienté objet Java 28 Programmation orienté objet en Java Interfaces Interfaces Implémenter plusieurs interfaces et hériter également d’une classe. A.Mazoul Programmation orienté objet Java 29 Programmation orienté objet en Java Interfaces Interface et Classe abstraite Classe Abstraite Interface Partiellement implémentée Aucune implémentation  Peut posséder des attributs  Pas d’attributs  Peut posséder des méthodes déjà  Toutes les méthodes sont implémentées abstraites Une classe hérite d’une classe abstrait Une classe implémente une interface Pas instanciable, mais peut avoir un Pas instanciable et pas de constructeur constructeur Une classe JAVA n’hérite que d’une Une classe JAVA peut implémenter seule classe (abstraite ou pas) plusieurs Interfaces A.Mazoul Programmation orienté objet Java 30 Programmation orienté objet en Java Classes génériques Méthodes et classes génériques (Généricité) Ecrire des objets génériques consiste à structurer les méthodes et l'information de manière à ce qu'elle soit indépendante d'un type. les classes génériques ont l'avantage de ne pas dupliquer le code. Une classe générique est une classe Java qui peut être réutilisée pour des objets de différents types. T est le type générique, Lors de l'instanciation de cette classe, on doit lui donner une valeur (nom d’une classe ou interface) Instanciation d'un ArrayList générique A.Mazoul Programmation orienté objet Java 31 Programmation orienté objet en Java Classes générique Écrire une classe générique Une classe peut également être générique et supporter un ou plusieurs types paramétrés. il n’est pas nécessaire de préciser le type des paramètres à droite de l’expression. A.Mazoul Programmation orienté objet Java 32 Programmation orienté objet en Java Classes générique Méthodes génériques On peut également déclarer un type générique à une méthode, que cette méthode appartienne à une classe générique ou non. Appel d'une méthode générique La déclaration du type générique doit se faire en déclarant ce type entre brackets après les modificateurs de méthode A.Mazoul Programmation orienté objet Java 33 Programmation orienté objet en Java Classes générique Limitation de la porté des types générique Il est possible de contraindre (conditionner) un type générique à un ensemble de classes restreint par un héritage. Pour ce faire, nous utiliserons la notation. Seule les classes dérivant de la classe SuperClass pourront être utilisées comme paramètre générique. Erreur de compilation Bound mismatch: The type String is not a valid substitute for the bounded parameter of the type GenAnimal A.Mazoul Programmation orienté objet Java 34 Programmation orienté objet en Java Classes générique Classe générique & l’héritage lors d'un héritage d'une classe générique, il est possible de conserver la généricité ou d'ajouter des paramètres génériques à la classe fille. Dans ce cas, la classe fille restera aussi une classe générique. A.Mazoul Programmation orienté objet Java 35 Programmation orienté objet en Java Classes générique L’opérateur instanceof L'opérateur instanceof permet de vérifier si une référence d'objet est une instance d'une certaine classe ou interface. Objet instanceof {Classe | Interface} A.Mazoul Programmation orienté objet Java 36 Programmation orienté objet en Java Classes générique Limitations On ne peut pas spécifier un type primitif (int, float, …) comme type générique il n’est pas possible de spécifier un type paramétré avec le mot-clé instanceof : Il n’est pas possible d’instancier un type générique : Il n’est pas possible de déclarer un attribut de classe (static) avec un type générique: A.Mazoul Programmation orienté objet Java 37 Programmation orienté objet en Java Classes générique Limitations Il n’est pas possible de créer des tableaux en spécifiant des types générique: Il n’est pas possible de surcharger une méthode en ne changeant que le type générique d’un paramètre : Même méthode A.Mazoul Programmation orienté objet Java 38 Programmation orienté objet en Java Classes générique liste d’arguments variable Les var-args (liste d’arguments variable) sont une nouveauté Java 5. Il sert principalement à simplifier le passage de tableaux en paramètre des méthodes. Exemple & Problème  Etant donné une méthode pour afficher un ensemble de Strings.  il fallait construire un tableau pour passer les Strings en paramètre,  ou construire le tableau directement dans l’appel : A.Mazoul Programmation orienté objet Java 39 Programmation orienté objet en Java Classes générique liste d’arguments variable Les var-args permettent de simplifier cette écriture. Il suffit de changer légèrement la signature de la méthode (notez les trois points "…" au lieu des crochets). Il ne peut y avoir qu’un seul var-arg par signature de méthode Le var-arg doit toujours être le dernier paramètre Exemple :  L’appel sera maintenant plus simple : A.Mazoul Programmation orienté objet Java 40 Programmation orienté objet en Java Classes générique Liste d’arguments variable Exemple : A.Mazoul Programmation orienté objet Java 41 Programmation orienté objet en Java Classes Internes Classe interne il est possible de déclarer des classes dans une classe. On parle alors de classes internes (inner classes) le compilateur génère un Les classes internes peuvent être ou non déclarées static. fichier constitué du nom de la classe englobante puis un ‘$’, puis le nom de la classe interne, puis “.class” La classe interne peut avoir accès aux méthodes est attributs de la classe englobante. A.Mazoul Programmation orienté objet Java 42 Programmation orienté objet en Java Classes Internes Visibilité des classes internes un accès public, protected, private ou paquetage porte aussi sur la définition classe. A.Mazoul Programmation orienté objet Java 43 Programmation orienté objet en Java Classes Internes Visibilité des classes internes Les classes internes et ses attributs ayant une portée private sont toujours accessibles depuis la classe englobante. A.Mazoul Programmation orienté objet Java 44 Programmation orienté objet en Java Classes Internes Classes internes Static et non-static On peut créer une instance de la classe englobée static, sans qu'il existe d'instance de la classe englobante. Nom de la Classe Objet avant new A.Mazoul Programmation orienté objet Java 45 Programmation orienté objet en Java Classes Internes Classes internes locales une classe interne locale est une classe interne définie dans un bloc dont la portée est limitée au bloc, dans une méthode par exemple. Une classe locale ne peut pas être static. Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis un nombre, puis le nom de la classe interne, puis “.class” A.Mazoul Programmation orienté objet Java 46 Programmation orienté objet en Java Classes Internes Classe anonyme Il est possible de définir une classe interne, sans lui donner de nom par dérivation d’un super classe, ou par implémentation d’une interface. Lors de la compilation, le compilateur génère un fichier constitué du nom de la classe englobante puis un ‘$’, puis un nombre puis “.class”.  Dérivation de super classe  Implémentation d’interface A.Mazoul Programmation orienté objet Java 47 Programmation orienté objet en Java Classes Internes Classe anonyme Classe anonyme de la classe NomClass, équivalent à l’instanciation d’une sous-classe de NomClass A.Mazoul Programmation orienté objet Java 48 A.Mazoul Réseaux informatiques Téléinformatique 49

Use Quizgecko on...
Browser
Browser