TROISIEME PRINCIPE Hiérarchie HIÉRARCHIE D’UNE INSTANCE À UNE CLASSE (DÉJÀ VU DANS L’INSTANCIATION) Relation Est-un entre i et C i est instance de la classe C ! i est un élément de l'extension de la classe C ! i possède toutes les propriétés (état et comportement) définies dans l’intension (la description) de C HIÉRARCHIE D’UNE INSTANCE À UNE CLASSE La relation est établie lors de la création de l'instance par new (instanciation) C i=new C(); Livre l=new Livre(); l.titre="Eragon"; C Livre est-un i Eragon HIÉRARCHIE D’UNE INSTANCE À UNE CLASSE La relation est établie lors de la création de l'instance par new (instanciation) C i=new C(); Livre l=new Livre(); l.titre="Eragon"; Extension(Livre) Eragon ✗ HIÉRARCHIE D’UNE CLASSE À UNE AUTRE Relation de généralisation (Sorte-de) entre les classes C1 et C2 C2 est une superclasse par rapport à C1 ou classe mère de C1 ! C2 est plus générale que C1 C1 est une sous-classe de C2 ou classe dérivée de C2 ou classe fille de C2 ! C1 est plus spécifique que C2 C2 Document sorte-de C1 Livre HIÉRARCHIE D’UNE CLASSE À UNE AUTRE La relation sorte-de est transitive inclusion des extensions (ensemble d'instances) Extension(C1)⊂Extension(C2) inclusion inverse des intensions (description : ensemble de membres) Intension(C2)⊂Intension(C1) ! On parle d'héritage HIÉRARCHIE D’UNE CLASSE À UNE AUTRE Établi lors de la définition de la classe (phase de programmation) en java : mot clef extends HIÉRARCHIE D’UNE CLASSE À UNE AUTRE class Livre extends Document { Document C2 <attributs et méthodes spécifiques à un livre par rapport à celles d’un document> } sorte-de class DVD extends Document { <attributs et méthodes spécifiques à un DVD par rapport à celles d’un document> } Les livres et les dvd sont des sortes de documents (Exemple tiré de : https://wind.developpez.com/tutoriels/windev/windev-poo-heritage/) Livre C1 sorte-de DVD C’1 HIÉRARCHIE D’UNE CLASSE À UNE AUTRE Lien de généralisation (sorte-de) inclusion des extensions Extension(C1)⊂Extension(C2) Toute instance de Livre est une instance de Document l'ensemble des instances de C1 est inclus dans l'ensemble des instances de C2. Toute Tout C1 est-un C2. instance de DVD est une instance de Document Il peut exister des instances de personnes qui ne sont pas des instances de Livre ni de DVD Extension (Document) Extension(Livre) sorte-de Document Eragon ✗ Antigone ✗ Germinal Phèdre ✗ ✗ Extension(DVD) sorte-de Document Aquarius Radin ! ✗ Ben-Hur ✗ ✗ Cours de java ✗ La Llorona ✗ HIÉRARCHIE D’UNE CLASSE À UNE AUTRE Lien de généralisation (sorte-de) inclusion inverse des intensions Intension(C2)⊂Intension(C1) la description de C2 est incluse dans la description de C1. C1 a toutes les propriétés (attributs et méthodes) de C2 Intension(Livre) sorte-de Document Intension(Document) String titre; Personne auteur; String isbn; String Collection; Editeur éditeur; Intension(DVD) sorte-de Document Intension(Document) String titre; Personne auteur; String LangueSousTitr; HIÉRARCHIE D’UNE CLASSE À UNE AUTRE Lien de généralisation (sorte-de) inclusion inverse des intensions Intension(C2)⊂Intension(C1) on dit que C1 hérite de C2. Les propriétés définies au niveau de C2 sont « propagées » au niveau de C1 ! En fait, simplement, elles y sont accessibles comme si elles y avaient été définies Intension(Livre) sorte-de Document Intension(Document) String titre; Personne auteur; String isbn; String Collection; Editeur éditeur; Intension(DVD) sorte-de Document Intension(Document) String titre; Personne auteur; String LangueSousTitr; HIÉRARCHIE À PLUSIEURS NIVEAUX Document Il y a héritage des propriétés et méthodes transitivement ! utile pour programmer par raffinements successifs sorte-de DocMultimedia sorte-de sorte-de DVD CD HIÉRARCHIE À PLUSIEURS NIVEAUX Intension(DVD) sorte-de DocMultimedia Il y a héritage des propriétés transitivement ! utile pour programmer par raffinements successifs Intension(DocMultimedia) sorte-de Document Intension(Document) String titre; Personne auteur; int duree; String StyleFilm; HIÉRARCHIE HÉRITAGE MULTIPLE N'existe pas en java mais simulable cf. implements mais ce n’est pas fait pour ça Un livre est composé de paragraphes et de chapitres, ces derniers pouvant être eux-mêmes composés de paragraphes ou de sous chapitres. Les chapitres sont donc à la fois : des parties ! ils composent d’autres éléments des suites d’autres parties ! ils sont composés d’autres éléments HIÉRARCHIE HÉRITAGE MULTIPLE TexteStructure int getNombreMots(); sorte-de sorte-de Partie SuiteParties N'existe pas en java mais simulable cf. implements Partie[] contenu; int getNombreMots(){…} sorte-de SuiteParties contenant; int rang; String getNumero(){…} int getNombreMots(){…} Livre extends suiteParties Auteur[] auteurs; String isbn; String collection; Editeur editeur; sorte-de sorte-de sorte-de Paragraphe extends Partie Alinea[] contenu; Chapitre extends Partie, extends suiteParties Chapitre contenant; int rang; String getNumero(){…} int getNombreMots(){…} HIÉRARCHIE SYSTÈME DE CAST DE JAVA Une variable dont le type est une classe C2 peut contenir une référence à une instance de type C1 si C2 est plus générale que C1. C2 o2=new C1(); mais on ne « voit alors » que les informations définies au niveau général (celui de C2). o2.s2 → OK ! o2.s1 → inconnu… class C1 extends C2 class C2 extends C3 String s2="2"; String s1="1"; HIÉRARCHIE SYSTÈME DE CAST DE JAVA … mais il est possible de changer le type d’une telle référence en le « castant » vers le type le plus spécifique : C2 o2=new C1(); class C1 extends C2 class C2 extends C3 C1 o1=(C1)o2; Toutes les couches sont alors visibles : o2.s → OK ! o2.s1 → OK !… String s2="2"; String s1="1"; HIÉRARCHIE EN JAVA CLASSE OBJECT Classe Object Superclasse par défaut pour toutes les classes ! pas nécessaire de préciser extends Object HIÉRARCHIE EN JAVA CLASSE OBJECT Contient : Le mécanisme d’instanciation allocation mémoire lancement du constructeur HIÉRARCHIE EN JAVA CLASSE OBJECT Contient aussi : Des méthodes prédéfinies avec un comportement par défaut. Etudiant@28051bdb → toString d’une instance de Etudiant Entre autres : [I@28645a05 → instance de tableau d’entiers [Ljava.lang.String;@7e6321ae → instance de tableau de chaîne de caractères [LEtudiant;@45b1bb60 → instance de tableau d’étudiants toString() → restitue une chaîne de caractère sous la forme : <type>@<adresseenhexadécimal> equals(…) → restitue true si l’objet qui exécute la méthode et celui qui est référencé en paramètre sont techniquement les mêmes : ! même adresse. ! même fonctionnement que « == ». getClass() → restitue la classe la plus spécifique à laquelle appartient une instance HIÉRARCHIE EN JAVA REDÉFINITION Affiche 3 Les méthodes d’une classe peuvent être redéfinies dans une classe descendante (fille, petite fille, arrière petite fille…) Affiche 3 lors de l’appel, c’est la définition la plus spécifique qui est utilisée ! celle qui est la plus proche de l’instance Affiche 1 C3 f(){println(3);} testC3(f();} C2 extends C3 testC2(f();} C1 extends C2 f(){println(1);}; testC1(f();} HIÉRARCHIE EN JAVA REDÉFINITION Permet de prendre en compte les propriétés supplémentaires des sous-classes Techniquement, il n’y a pas de contrainte sur le code écrit… mais il faut respecter la logique conceptuelle : la méthode de la sous-classe doit en général préciser la fonctionnalité apportée par la méthode de la superclasse… … en fonction des informations nouvelles apportées par les attributs de la sous-classe. ! en java : super.f() désigne la plus proche fonction f d’un niveau plus général. HIÉRARCHIE EN JAVA REDÉFINITION Permet de prendre en compte les propriétés supplémentaires des sous-classes Cela fonctionne aussi avec les constructeurs : ! en java : super(…) désigne dans le constructeur d'un objet le constructeur de son ancêtre immédiat. LANGAGE OBJET ET MÉMOIRE LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1 null LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1 référence la nouvelle instance a1 p1 a1 null nom=null abscisse=0 ordonnee=0 LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance a1 p1 a1 nom="A" abscisse=3 ordonnee=-1 LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1 a1 p2 a1 a1 nom="A" abscisse=3 Ordonnee=-1 LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1 a1 p2 a1 a1 nom="A" abscisse=0 ordonnee=-1 LANGAGE OBJET ET MÉMOIRE Point p1=new Point(); p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); p2=new Point(); Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1 a1 nom="A" abscisse=0 ordonnee=-1 a1 p2 a2 a2 nom=null abscisse=0 ordonnee=0 LANGAGE OBJET ET MÉMOIRE Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance Point p1=new Point(); p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); p2=new Point(); p2.setNom("B"); p1 a1 nom="A" abscisse=0 ordonnee=-1 a1 p2 a2 a2 nom="B" abscisse=0 ordonnee=0 LANGAGE OBJET ET MÉMOIRE Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1.setNom("A"); p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); p2=new Point(); p2.setNom("B"); p1=p2; Ramasse miettes p1 a1 nom="A" abscisse=0 ordonnee=-1 a2 p2 a2 a2 nom="B" abscisse=0 ordonnee=0 LANGAGE OBJET ET MÉMOIRE Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); p2=new Point(); p2.setNom("B"); p1=p2; p2=null; p1 a2 p2 null Valeur null. La variable ne référence aucune instance. a2 nom="B" abscisse=0 ordonnee=0 LANGAGE OBJET ET MÉMOIRE Une instance est représentée par une variable qui contient (qui pointe vers) l’endroit où se situe le “contenu” de l’instance p1.setAbscisse(3); p1.setOrdonnee(-1); Point p2=p1; p2.setAbscisse(0); p2=new Point(); p2.setNom("B"); p1=p2; p2=null; La variable n’est plus référencée p1 null p2 null a2 nom="B" abscisse=0 ordonnee=0 VARIABLES ÉGALES, OBJETS IDENTIQUES/ÉQUIVALENTS Égalité des variables : « == » en java Égalité des références ! deux variables égales référencent le même objet informatique Équivalence des objets .equals en java (si redéfini) Zones mémoires différentes Objets informatiques différents ! contenus conceptuellement (sémantiquement) « équivalents » selon le point de vue de l’utilisateur du programme ! objets informatiques différents qui modélisent des objets appartenant à une même classe d’équivalence dans la réalité MEMBRES D'INSTANCE ET MEMBRES DE CLASSE membre d'instance ! cas par défaut variable d’instance (attribut d’instance) déclarée sous le nom <nomvariable> ! appartient à l'instance : Chaque instance contient sa propre variable de nom <nomvariable> distincte de celles des autres instances ! Les contenus des variables de même nom d'une instance à l'autre sont potentiellement différents. destinée surtout à représenter des propriétés (attributs) de l'instance MEMBRES D'INSTANCE ET MEMBRES DE CLASSE membre d'instance ! cas par défaut méthode d'instance ! appartient à l'instance. Destinée à représenter le comportement d'une instance. MEMBRES D'INSTANCE ET MEMBRES DE CLASSE membre de classe ! introduit par défaut en java par le mot clé static variable de classe (attribut de classe) une seule variable, liée à la classe. Elle est accessible par le nom de la classe et peut être modifiée par toutes les instances. ! peut servir à… référencer des instances caractéristiques : décimal π, couleurs noir, blanc, rouge, vert, bleu, point origine. On ajoute alors le mot clé final pour « figer » la valeur. stocker des informations statistiques : nombre d'instances, liste d'instances, max, min de certains attributs… MEMBRES D'INSTANCE ET MEMBRES DE CLASSE Membre de classe ! introduit par défaut en java par le mot clé static méthode de classe appartient à la classe et est accessible à toutes ses instances. ! permet d'amorcer le programme aucune instance n'existe encore cas de la fonction main ! permet d'effectuer des traitements sans créer d'instances : (bibliothèques) classe Math, Lire,… ! permet d'offrir des services généraux en rapport avec les instances de la classe. Integer.parseInt ! peut être utilisée pour représenter les opérations sur plusieurs instances, dont des traitements statistiques. LANGAGE OBJET ET MÉMOIRE Méthode de classe préfixée par le nom de la classe ! Math.random(), ! Integer.parseInt(), ! Lire.i() Méthode d'instance préfixée par le nom d'une des variables qui référence l'instance : ! Fraction f=new Fraction(2,3); Fraction res=f.fois(-2).sur(new Fraction(-1,5)); ou par une expression quelconque qui restitue une telle référence : ! Fraction f=new Fraction(2,3); Fraction res=f.fois(-2).sur(new Fraction(-1,5)); LANGAGE OBJET ET MÉMOIRE Une fonction ou variable de classe ne peut pas référencer/ utiliser une méthode ou variable d'instance. ! Ben, oui, parce que les membres qui appartiennent à l'instance ne sont pas connus de la classe — ni d'ailleurs des autres instances. LANGAGE OBJET ET MÉMOIRE Une fonction ou variable d'instance peut référencer/utiliser une méthode ou variable de classe. ! Ben, oui, parce que les membres qui appartiennent à la classe appartiennent aussi à toutes ses instances. LANGAGE OBJET ET MÉMOIRE class C static type m1; c1=new C(); c2=new C(); c3=new C(); valeur C.m1 type m2; pas d'accès à partir de la classe ; la variable n'existe pas à ce niveau c1.m1 c2.m1 c3.m1 valeur1 valeur2 valeur3 c1.m2 c2.m2 c3.m2 POLYMORPHISME POLYMORPHISME Un même identificateur apparaît dans des sens différents. On parle surtout de polymorphisme pour des fonctions (en particulier des méthodes) de mêmes noms mais qui effectuent des actions différentes. ! polymorphisme contingent ! polymorphisme de signature (surcharge) ! polymorphisme hiérarchique POLYMORPHISME Polymorphisme contingent Des méthodes (ou attributs) définies dans des classes différentes ont le même nom mais les notions modélisées n'ont pas forcément le même sens class Personne { double taille;//en cm double getTaille(){} } class Televiseur { double taille;//en pouces double getTaille(){} } POLYMORPHISME Polymorphisme de signature (surcharge) plusieurs méthodes (ou constructeurs) différentes définies dans une même classe ont le même nom… … mais une signature différente class Somme { static double getValeur(double x,double y){…} static Fraction getValeur(Fraction x,Fraction y){…} static Complexe getValeur(Complexe x,Complexe y){…} } POLYMORPHISME Polymorphisme hiérarchique Une fonction définie dans une classe est redéfinie dans une sous classe… … ce qui a pour effet de « masquer » dans la classe la plus spécifique la définition de la fonction sise dans sa super classe ! les signatures peuvent être les mêmes d'un niveau à l'autre… mais pas forcément POLYMORPHISME Polymorphisme hiérarchique Une fonction définie dans une classe est redéfinie dans une sous classe… class Rectangle { String toString() { return "Largeur : "+getLargeur()+ "\n"+ "Hauteur : "+getHauteur(); } } class Carre extends Rectangle { String toString() { return "Coté : "+getLargeur(); } } POLYMORPHISME Polymorphisme hiérarchique Une fonction définie dans une classe est redéfinie dans une sous classe… ! on peut faire appel dans la sous-classe à la fonction de la classe supérieure : super class Personne { String toString() { return "Nom : "+getNom()+"\n"+ "Prénom : "+getPrenom(); } } class Etudiant extends Personne { String toString() { return super.toString()+"\n"+ "numEtud : "+getNumEtud(); } }