chapitre2java.pdf
Document Details
Related
- PCSII Depression/Anxiety/Strong Emotions 2024 Document
- A Concise History of the World: A New World of Connections (1500-1800)
- Human Bio Test PDF
- University of Santo Tomas Pre-Laboratory Discussion of LA No. 1 PDF
- Vertebrate Pest Management PDF
- Lg 5 International Environmental Laws, Treaties, Protocols, and Conventions
Full Transcript
FACULTE DES SCIENCES DE SFAX Département d’Informatique et des Communications Programmation Java Héritage et Polymorphisme Amal BEN HAMIDA [email protected] Année Universitaire 2024-2025 Héritage Principe de l’hérita...
FACULTE DES SCIENCES DE SFAX Département d’Informatique et des Communications Programmation Java Héritage et Polymorphisme Amal BEN HAMIDA [email protected] Année Universitaire 2024-2025 Héritage Principe de l’héritage On peut dériver une classe B à partir d’une autre classe A, on dit que B hérite de la classe A B est une sous-classe, classe dérivée, classe fille de A A est dite super classe, classe de base ou classe mère La classe fille: o récupère automatiquement tous les attributs et méthodes de la classe de base, si leur accessibilité le permet o peut ajouter ses propres attributs et méthodes o peut redéfinir une ou plusieurs méthodes dont elle hérite Une relation d’héritage se définit en Java par le mot-clé extends : class extends class A { class B extends A { int x; int y; void meth1() {}; void meth3() {}; void meth2() {}; void meth1() {}; } } AMAL BEN HAMIDA 3 Principe de l’héritage La relation d’héritage est unidirectionnelle Une classe ne peut hériter directement que d’une seule classe : pas d’héritage multiple en Java Une classe peut avoir plusieurs sous-classes Une classe peut avoir une mère, une grand-mère, une arrière grand-mère,…: Héritage en cascade La classe fille est un cas particulier de la classe mère, donc que les objets instanciant la sous classe instancient également la classe de base AMAL BEN HAMIDA 4 Héritage et encapsulation Tous les champs sont hérités par la classe dérivée, si leur accessibilité le permet Package 1 Package 2 public class Personne{ class Enseignant extends Personne { public String nom; … protected String prenom; } Date date_naissance; private long cin; } Etudiant hérite : Enseignant hérite : ✓ nom ✓ nom ✓ prenom ✓ prenom class Etudiant extends Personne { ✓ date_naissance … } AMAL BEN HAMIDA 5 Le mot-clé super Le mot-clé super permet de désigner la super classe Pour accéder dans une méthode d’une classe à un attribut d’une superclasse, on appelle : super. Pour accéder dans une méthode d’une classe à une méthode d’une superclasse, on appelle : super. Pour accéder à partir d’un constructeur d’une classe à un des constructeurs de sa classe mère, on appelle : super(liste des paramètres) AMAL BEN HAMIDA 6 Le mot-clé super Les attributs de la classe mère peuvent être masqués par la définition d’attributs qui ont le même nom dans la classe dérivée Le nouveau attribut dans la classe fille peut être désigné par this. Il est possible de manipuler celui qui est masqué (s'il est accessible) par la notation super. class A { class B extends A { class Test { int x=2024; int x=2025; String y="FSS"; public static void main (String[] args) } public void afficher () { { System.out.println(super.x); B b =new B(); System.out.println(super.y); b.affiche(); System.out.println(this.x); } } } } AMAL BEN HAMIDA 7 Casting et Héritage Le transtypage (cast) permet d'accéder en changeant le type déclaré de la référence class A { class B extends A { class C extends B { int x=2024; String x="FSS"; boolean x=true; } } public static void main (String[] args) { C c=new C(); System.out.println(c.x); System.out.println(((B)c).x); System.out.println(((A)c).x); } } AMAL BEN HAMIDA 8 Constructeur et héritage Les constructeurs ne sont pas hérités par une sous-classe, mais le constructeur de la super classe peut être invoqué à partir de la sous-classe L’appel au constructeur de la superclasse avec le mot clé super doit toujours se situer dans un constructeur de la sous-classe et toujours en tant que première instruction public class Personne{ class Enseignant extends Personne { protected String nom; public float salaire; protected long cin; Enseignant () { Personne () { super(); nom="Foulen"; salaire=0.0f; cin=00000000; } } } } AMAL BEN HAMIDA 9 Constructeur et héritage Si aucun appel explicite à un constructeur d’une classe supérieure n’est fait, le constructeur fait appel implicitement à un constructeur vide de la classe supérieure Si aucun constructeur vide n’est accessible dans la classe supérieure, une erreur se produit lors de la compilation public class Personne{ class Enseignant extends Personne { public String nom; public long cin; //Constructeur par défaut Enseignant () { Personne (String nom, long cin) //Appel implicite à super { super(); this.nom=nom; } this.cin=cin; } } } AMAL BEN HAMIDA 10 Redéfinition des méthodes Une méthode d’une sous-classe redéfinit une méthode de sa classe supérieure, si elles ont la même signature mais que le traitement effectué est réécrit dans la sous-classe Une méthode redéfinie doit avoir : même nom que la méthode d'origine dans la classe supérieure même type et nombre d'arguments que la méthode d'origine même type de retour que la méthode d'origine class Personne{ class Enseignant extends Personne { public void afficher () { public void afficher () { System.out.println("Je suis une Personne"); System.out.println("Je suis une Personne"); } System.out.println("Je suis un Enseignant"); } } } AMAL BEN HAMIDA 12 Redéfinition des méthodes Lors de la redéfinition d’une méthode, il est possible d’accéder à la méthode définie dans la classe supérieure grâce au mot-clé super class Personne{ class Enseignant extends Personne { public void afficher () { public void afficher () { System.out.println("Je suis une Personne"); super.afficher (); } System.out.println("Je suis un Enseignant"); } } } AMAL BEN HAMIDA 13 Redéfinition versus surcharge Si la signature de la méthode qu'on définit dans la classe dérivée n'est pas la même que celle de la classe mère, il s'agit de surcharge Les deux méthodes cohabitent dans la classe dérivée class Personne{ public void afficher () { System.out.println("Je suis une Personne"); }} Surcharge Redéfinition class Enseignant extends Personne { class Enseignant extends Personne { public void afficher ( String discipline) { public void afficher () { System.out.println("Je suis un Enseignant super.afficher (); de"+ discipline); System.out.println("Je suis un Enseignant"); } } } } AMAL BEN HAMIDA 14 Le mot-clé final Il est possible d’interdire la redéfinition d’une méthode en introduisant le mot-clé final au début de sa signature class Personne{ final void afficher () { System.out.println("Je suis une Personne"); } } Il est possible d’interdire l’héritage d’une classe en utilisant final final class Personne{ void afficher () { La méthode afficher() System.out.println("Je suis une Personne"); } est implicitement finale } AMAL BEN HAMIDA 15 La classe Object La classe Object est la classe mère dont héritent toutes les autres classes Toute classe définie en Java, que ce soit par l’utilisateur ou dans un package de l’API, hérite de la classe Object Ainsi, toute classe hérite des méthodes de la classe Object Class getClass() renvoie le type de l'objet void finalize() utilisée par le Garbage Collector boolean equals(Object o) compare le contenu des références (à redéfinir) Object clone() crée une copie de l’objet (à redéfinir) String toString() renvoie un String décrivant l'objet (à redéfinir) int hashCode() retourne le hash code de l'objet AMAL BEN HAMIDA 16 La classe Object : la méthode toString() La méthode toString() définie dans la classe Object renvoie le nom de la classe de l'objet concerné suivi du caractère @, et de l'adresse de cet objet La conversion d'un objet en String : méthode toString() Quand la méthode to String() est redéfinie, elle revoie une chaine de caractères servant à décrire l'objet concerné AMAL BEN HAMIDA 17 La classe Object : la méthode equals() La méthode equals (Object o) détermine si deux objets sont égaux ou non Son implémentation d'origine vérifie que les références des objets sont identiques On a besoin de redéfinir la méthode equals (Object o) : deux objets sont égaux quand ils ont le même état AMAL BEN HAMIDA 18 La classe Object public class Personne { public String nom; public Personne(String nom) { this.nom=nom;} public String toString() { return "Classe:" +getClass().getName() + " Objet:" +nom;} boolean equals(Personne p) {return p.nom.equals(this.nom);} public static void main(String args[]){ Personne p1=new Personne("Foulen BENFOULEN"); Personne p2=new Personne("Foulen BENFOULEN"); System.out.println(p1.toString()); System.out.println(p1.equals(p2));}AMAL BEN HAMIDA 19 Polymorphisme Principe de polymorphisme Le polymorphisme permet de manipuler des objets sans en connaître tout à fait le type tout en se basant sur la relation d’héritage Le polymorphisme est le fait de référencer une classe fille avec une référence déclarée de type classe mère Forme mon_rectangle= new Rectangle(); Référence déclarée Objet créé de type en tant que Forme Rectangle Il y a une seule classe “réelle” qui est celle dont le constructeur a été appelé en premier mais l’objet peut aussi être déclaré avec une classe supérieure à sa classe réelle AMAL BEN HAMIDA 21 Principe de polymorphisme Le polymorphisme est très utile pour la création d’ensembles regroupant des objets de classes différentes Forme [] formes= new Forme; Un tableau contenant des objets de type Forme AMAL BEN HAMIDA 22 Principe de polymorphisme Un tableau polymorphique contient des objets de n’importe quelle classe fille de la classe mère Forme [] formes= new Forme; formes=new Rectangle(10,20); formes=new Cercle(15); formes=new Rectangle(50,30); formes=new Carre(20); AMAL BEN HAMIDA 23 public class Forme public class Cercle extends Forme { { … … void afficher () { void afficher () { System.out.println("Je suis une Forme");} System.out.println("Je suis un Cercle");} } } public class Rectangle extends Forme public class Carre extends Rectangle { { … … void afficher () { void afficher () { System.out.println("Je suis un Rectangle");} System.out.println("Je suis un Carré");} } } AMAL BEN HAMIDA 24 Principe de polymorphisme public class Test { public static void main(String args[]){ Forme [] formes= new Forme; formes=new Rectangle(10,20); formes=new Cercle(15); formes=new Rectangle(50,30); Formes=new Carre(20); for(int i=0;i