Compléments sur les classes Programmation Orientée Objet Compléments sur les classes Frédéric Mallet http://deptinfo.unice.fr/~fmallet/ 2013-2014 F. Mallet - POO 1 Compléments sur les classes Objectifs/Plan Méthode d’instance ou méthode de classe Static Final Constructeurs Types énumérés Structures de contrôle Les modificateurs 2013-2014 F. Mallet - POO 2 Compléments sur les classes Calculatrice Calculatrice.java class Calculatrice { double add(double v1, double v2) { return v1+v2; } double mul(double v1, double v2) { return v1*v2; } double inv(double v) { return 1/v; } } État : ? Usage: 2013-2014 Calculatrice c = new Calculatrice(); c.add(12, 5); F. Mallet - POO 3 Compléments sur les classes Méthodes de classes : static Calculatrice.java class Calculatrice { static double add(double v1, double v2) { return v1+v2; } static double mul(double v1, double v2) { return v1*v2; } static double inv(double v) { return 1/v; } } État : NON Usage: Calculatrice.add(12, 5); 2013-2014 F. Mallet - POO 4 Compléments sur les classes Champs de classe : static Calculatrice.java class Calculatrice { static double add(double v1, double v2) { return v1+v2; } static double mul(double v1, double v2) { return v1*v2; } static double inv(double v) { return 1/v; } static double PI = 3.1415; } État : NON Usage: Calculatrice.add(12, 5); Calculatrice.add(Calculatrice.PI, 5); 2013-2014 F. Mallet - POO 5 Compléments sur les classes Constantes : final Calculatrice.java class Calculatrice { static double add(double return v1+v2; } static double mul(double return v1*v2; } static double inv(double return 1/v; } static final double PI = } v1, double v2) { v1, double v2) { v) { 3.1415; État : NON Accumulateur ? Mémoire ? Usage: Calculatrice.add(12, 5); Calculatrice.add(Calculatrice.PI, 5); 2013-2014 F. Mallet - POO 6 Compléments sur les classes Méthodes d’instance et état Calculatrice.java class Calculatrice { double accumulateur; void add(double v) { accumulateur += v; } void mul(double v) { accumulateur *= v; } double inv() { accumulateur = 1/accumulateur; } static final double PI = 3.1415; } Usage: 2013-2014 15.1415 12.0 État : OUI Calculatrice c = new Calculatrice(); c.add(12); c.add(Calculatrice.PI); F. Mallet - POO 7 Compléments sur les classes Objectifs/Plan Méthode d’instance ou méthode de classe Constructeurs Initialisation des champs Surcharge du constructeur Surcharge des paramètres Mots clés this. et this( Constructeur par défaut Types énumérés Structures de contrôle Les modificateurs 2013-2014 F. Mallet - POO 8 Compléments sur les classes Initialisation par défaut class Complexe { double reelle, imaginaire; // valeur initiale ? double norme() { return reelle*reelle + imaginaire*imaginaire; } } Initialisation par défaut des champs Valeurs numériques (byte, short, int, long, float, double) : 0 Booléens (boolean) : false Références : null Usage Complexe c1 = new Complexe(); 2013-2014 F. Mallet - POO 9 Compléments sur les classes Constructeur class Complexe { double reelle, imaginaire; // valeur initiale ? Complexe(double re, double im) { // constructeur reelle = re; imaginaire = im; } } Initialisation explicite des champs Lorsqu’il n’y a pas de « bonne » valeur par défaut Lorsque l’initialisation nécessite un calcul Usage Complexe c1 = new Complexe(0, 1); 2013-2014 F. Mallet - POO 10 Compléments sur les classes Constructeur : this. class Complexe { double reelle, imaginaire; // valeur initiale ? Complexe(double reelle, double imaginaire) { this.reelle = reelle; this.imaginaire = imaginaire; } } Surcharge des variables Lorsque le même nom désigne plusieurs variables différentes Usage Complexe c1 = new Complexe(0, 1); 2013-2014 F. Mallet - POO 11 Compléments sur les classes Constructeur : surcharge class Complexe { double reelle, imaginaire; // valeur initiale ? Complexe(double re, double im) { reelle = re; imaginaire = im; } Complexe(double re) { reelle = re; imaginaire = 0.0; } } Usage Complexe c1 = new Complexe(0, 1); Complexe c2 = new Complexe(6.5); 2013-2014 F. Mallet - POO 12 Compléments sur les classes Constructeur : this() class Complexe { double reelle, imaginaire; // valeur initiale ? Complexe(double re, double im) { reelle = re; imaginaire = im; } Complexe(double re) { this(re, 0.0); } } Usage Complexe c1 = new Complexe(0, 1); Complexe c2 = new Complexe(6.5); Complexe c3 = new Complexe(); 2013-2014 F. Mallet - POO 13 Compléments sur les classes Instantiation et constructeur Si un ou plusieurs constructeurs explicites Il faut obligatoirement utiliser un de ces constructeurs • Complexe c1 = new Complexe(0, 1); • Complexe c2 = new Complexe(5); • Complexe c3 = new Complexe(); // interdit Le choix du constructeur dépend Du nombre de paramètres effectifs De leur type 2013-2014 F. Mallet - POO 14 Compléments sur les classes Constructeur par défaut Si un ou plusieurs constructeurs explicites Il faut obligatoirement utiliser un de ces constructeurs • Complexe c1 = new Complexe(0, 1); • Complexe c2 = new Complexe(5); • Complexe c3 = new Complexe(); // interdit Si aucun constructeur n’est défini Un constructeur « par défaut » est créé automatiquement Il n’a pas de paramètre class Complexe{ double re, im; } Complexe c = new Complexe(); 2013-2014 F. Mallet - POO 15 Compléments sur les classes Objectifs/Plan Méthode d’instance ou méthode de classe Constructeurs Types énumérés Structures de contrôle L’alternative: if, if/else Le choix multiple : switch Les modificateurs 2013-2014 F. Mallet - POO 16 Compléments sur les classes Types énumérés Introduits par le JDK 5.0 Les types énumérés ressemblent à des classes Leurs valeurs ressemblent à des champs statiques Le compilateur construit des helpers (constructeurs, affichage, …) Peut avoir des constructeurs, méthodes et champs Exemple [Couleur.java] enum Couleur { TREFLE, CARREAU, CŒUR, PIQUE; } [Test.java] class Test { static public void main(String[] args) { Couleur c = Couleur.TREFLE; Valeur v = Valeur.AS; System.out.println(v+" "+c); } } 2013-2014 F. Mallet - POO [Valeur.java] enum Valeur { SEPT, HUIT, NEUF, DIX, VALET, DAME, ROI, AS; } > java Test AS TREFLE 17 Compléments sur les classes Couleur de cartes: TREFLE, PIQUE, CŒUR, CARREAU Sans les énumérés [Couleur.java] class Couleur { int valeur; Couleur(int v) { this.valeur = v; } static final Couleur static final Couleur static final Couleur static final Couleur } TREFLE = new Couleur(1); PIQUE = new Couleur(2); CŒUR = new Couleur(3); CARREAU = new Couleur(4); [Test.java] class Test { static public void main(String[] args) { Couleur c = Couleur.TREFLE; System.out.println(c); } } 2013-2014 F. Mallet - POO 18 Compléments sur les classes Couleur de cartes: TREFLE, PIQUE, CŒUR, CARREAU Sans les énumérés [Couleur.java] class Couleur { int valeur; Couleur(int v) { this.valeur = v; } static final Couleur TREFLE = new Couleur(1), PIQUE = new Couleur(2), CŒUR = new Couleur(3), CARREAU = new Couleur(4); } [Test.java] class Test { static public void main(String[] args) { Couleur c = Couleur.TREFLE; System.out.println(c); } } 2013-2014 F. Mallet - POO > java Test Couleur@740355a4 19 Compléments sur les classes Couleur de cartes: TREFLE, PIQUE, CŒUR, CARREAU class Couleur { // [Couleur.java] int valeur; Couleur(int v) { this.valeur = v; } static final Couleur TREFLE = new Couleur(1), PIQUE = new Couleur(2), CŒUR = new Couleur(3), CARREAU = new Couleur(4); String nom() { if (valeur==1) return if (valeur==2) return if (valeur==3) return if (valeur==4) return return "Erreur!"; } "Trèfle"; "Pique"; "Coeur"; "Carreau"; } System.out.println(Couleur.TREFLE.nom()); 2013-2014 F. Mallet - POO > java Test Trèfle 20 Compléments sur les classes Méthode toString() class Couleur { // [Couleur.java] int valeur; Couleur(int v) { this.valeur = v; } static final Couleur TREFLE = new Couleur(1), PIQUE = new Couleur(2), CŒUR = new Couleur(3), CARREAU = new Couleur(4); public String toString() { if (valeur==1) return "Trèfle"; if (valeur==2) return "Pique"; if (valeur==3) return "Coeur"; if (valeur==4) return "Carreau"; return "Erreur!"; } } System.out.println(Couleur.TREFLE); 2013-2014 F. Mallet - POO > java Test Trèfle 21 Compléments sur les classes Alternative: synopsis If si … alors …. if (condition booléenne) { instructions à exécuter si la condition est vraie [true] } If/else si … alors … sinon … if (condition booléenne) { instructions à exécuter si la condition est vraie [true] } else { instructions à exécuter si la condition est fausse [false] } Blocs d’instructions { … } Les accolades ne sont pas obligatoires que s’il y a 1 seule instruction 2013-2014 F. Mallet - POO 22 Compléments sur les classes Alternative: if, if/else class Couleur { // [Couleur.java] … // cf. planche [21] public String toString() { if (valeur==1) { return "Trèfle"; } else { if (valeur==2) { return "Pique"; } else { if (valeur==3) { return "Coeur"; } else { if (valeur==4) { return "Carreau"; } else { return "Erreur!"; } } } } } } 2013-2014 F. Mallet - POO 23 Compléments sur les classes Alternative: if, if/else class Couleur { // [Couleur.java] … // cf. planche [21] public String toString() { if (valeur==1) return "Trèfle"; else if (valeur==2) return "Pique"; else if (valeur==3) return "Coeur"; else if (valeur==4) return "Carreau"; else return "Erreur!"; } } Instruction return Termine immédiatement l’exécution de la méthode ! 2013-2014 F. Mallet - POO 24 Compléments sur les classes Alternative: if, if/else class Couleur { // [Couleur.java] … // cf. planche [21] public String toString() { if (valeur==1) return "Trèfle"; else if (valeur==2) return "Pique"; else if (valeur==3) return "Coeur"; else if (valeur==4) return "Carreau"; else return "Erreur!"; } } Instruction return Termine immédiatement l’exécution de la méthode ! (cf. planche 21) 2013-2014 F. Mallet - POO 25 Compléments sur les classes Alternative: synopsis Switch/case switch (expression) { case v1: instructions à exécuter si expression == v1 case v2: instructions à exécuter si expression == v2 default: instructions à exécuter si aucun des blocs cases ne l’est } Règle L’expression du switch est évaluée pour choisir le cas (entier, ou énuméré) [String depuis JDK 1.7] L’instruction break permet d’arrêter l’exécution du switch Le switch termine au break, au return ou à l’accolade fermante! 2013-2014 F. Mallet - POO 26 Compléments sur les classes Alternative: switch/case // [Couleur.java] class Couleur { … // cf. planche [21] public String toString() { switch (valeur) { case 1: return "Trèfle"; case 2: return "Pique"; case 3: return "Coeur"; case 4: return "Carreau"; default: return "Erreur!"; } } Instruction return 2013-2014 Termine immédiatement l’exécution de la méthode ! (cf. page 21) F. Mallet - POO 27 Compléments sur les classes Rappels: constructeur class Couleur { // [Couleur.java] String nom; Couleur(String nom) { this.nom = nom; } static final Couleur TREFLE = new Couleur("Trèfle"), PIQUE = new Couleur("Pique"), CŒUR = new Couleur("Coeur"), CARREAU = new Couleur("Carreau"); public String toString() { return nom; } } 2013-2014 F. Mallet - POO 28 Compléments sur les classes Alternative: switch/case class Valeur { // [Valeur.java] int valeur; Valeur(int v) { valeur = v; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11), DAME = new Valeur(12), ROI = new Valeur(13), AS = new Valeur(14); public String toString() { switch (valeur) { case 7: case 8: case 9: case 10: return valeur + ""; case 11: return "Valet"; case 12: return "Dame"; case 13: return "Roi"; case 14: return "As"; default: return "Erreur!"; } } } 2013-2014 F. Mallet - POO 29 Compléments sur les classes Alternative: switch/case class Valeur { // [Valeur.java] int valeur; Valeur(int v) { valeur = v; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11), DAME = new Valeur(12), ROI = new Valeur(13), AS = new Valeur(14); int maValeur() { int v = 0; switch (valeur) { case 11: case 12: case 13: v = valeur - 9; case 14: v = valeur - 3; default: } return v; } } 2013-2014 F. Mallet - POO 30 Compléments sur les classes Alternative: switch/case class Valeur { // [Valeur.java] int valeur; Valeur(int v) { valeur = v; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11), DAME = new Valeur(12), ROI = new Valeur(13), AS = new Valeur(14); int maValeur() { int v = 0; switch (valeur) { case 11: case 12: case 13: v = valeur - 9; break; case 14: v = valeur - 3; break; default: } return v; } } 2013-2014 F. Mallet - POO 31 Compléments sur les classes Rappels : constructeurs class Valeur { // [Valeur.java] int ordre; String nom; Valeur(int o) { this(o, o+""); } Valeur(int o, String nom) { ordre = v; this.nom = nom; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11, "Valet"), DAME = new Valeur(12, "Dame"), ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As"); public String toString() { return nom; } } 2013-2014 F. Mallet - POO 32 Compléments sur les classes Rappels : final class Valeur { // [Valeur.java] Valeur.AS = new Valeur(1); int ordre; Valeur.AS.ordre = 1; String nom; Valeur(int o) { Valeur.AS.estSupérieureA(Valeur.ROI); this(o, o+""); } False! Valeur(int o, String nom) { ordre = v; this.nom = nom; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11, "Valet"), DAME = new Valeur(12, "Dame"), ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As"); boolean estSupérieureA(Valeur autre) { return this.ordre > autre.ordre; } } 2013-2014 F. Mallet - POO 33 Compléments sur les classes Le modificateur private class Valeur { // [Valeur.java] Valeur.AS = new Valeur(1); private int ordre; Valeur.AS.ordre = 1; private String nom; Valeur(int o) { Valeur.AS.estSupérieureA(Valeur.ROI); this(o, o+""); } True! Valeur(int o, String nom) { ordre = v; this.nom = nom; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11, "Valet"), DAME = new Valeur(12, "Dame"), ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As"); boolean estSupérieureA(Valeur autre) { return this.ordre > autre.ordre; } } 2013-2014 F. Mallet - POO 34 Compléments sur les classes Le modificateur private class Valeur { // [Valeur.java] class X { private int ordre; static public void main(String[] args) { private String nom; Valeur v1 = new Valeur(1); private Valeur(int o) { Valeur v2 = Valeur.AS; this(o, o+""); } } private Valeur(int o, String nom) { } ordre = v; this.nom = nom; } static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8), NEUF = new Valeur(9), DIX = new Valeur(10), VALET = new Valeur(11, "Valet"), DAME = new Valeur(12, "Dame"), ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As"); public String toString() { return nom; } } 2013-2014 F. Mallet - POO 35 Compléments sur les classes Les modificateurs Le modificateur public Membres (champ, méthode, constructeur) accessibles de n’importe où Le modificateur private Membres accessibles seulement depuis le bloc de déclaration de classe class MaClasse { // bloc de déclaration de classe } Pas de modificateur Le plus souvent => package • Membres accessibles depuis n’importe quel bloc d’une classe appartement au même paquetage Parfois public ou private selon le contexte 2013-2014 F. Mallet - POO 36 Compléments sur les classes Bilan sur les énumérés Sans les énumérés (<JDK1.5) Avec les énumérés enum Couleur { TREFLE, CARREAU, CŒUR, PIQUE; } Couleur - nom : String TREFLE : Couleur PIQUE : Couleur COEUR : Couleur CARREAU : Couleur - Couleur(String) + toString() : String 2013-2014 class Couleur { private String nom; private Couleur(String nom) { this.nom = nom; } static final Couleur TREFLE = new Couleur("TREFLE"), PIQUE = new Couleur("PIQUE"), COEUR = new Couleur("COEUR"), CARREAU = new Couleur("CARREAU"); public String toString() { return nom; } } + : public - : private rien : package F. Mallet - POO 37 Compléments sur les classes Compléments sur les énumérés On peut ajouter des champs et des méthodes enum Couleur { private boolean estNoire; TREFLE(true), PIQUE(true), CARREAU(false), COEUR(false); Couleur(boolean b) { // constructeur private! estNoire = b; } boolean estNoire() { return estNoire; } boolean estRouge() { return !estNoire; } } Test Couleur c = Couleur.TREFLE; System.out.println(c+" "+c.estNoire?"noir":"rouge"); 2013-2014 F. Mallet - POO 38 Compléments sur les classes Objectifs/Plan Méthode d’instance ou méthode de classe Constructeurs Types énumérés Structures de contrôle Les modificateurs Les expressions booléennes 2013-2014 F. Mallet - POO 39 Compléments sur les classes Conditions booléennes 6 opérateurs de comparaison (int,long,float,double) < <= > >= != == inférieur inférieur ou égal supérieur supérieur ou égal différent égal 3 opérateurs logiques (boolean) && || ! 2013-2014 et logique ou logique non logique (différent de &) (différent de |) (différent de ~) F. Mallet - POO 40 Compléments sur les classes Egalité de littéraux Entiers, booléens, caractères if (x == y – 2) … Nombres approchés (float, double) 0.1+0.1+0.1+0.1+ 0.1+0.1+0.1 == 0.7 0.1+0.1+0.1+0.1+ 0.1+0.1+0.1+0.1 == 0.8 if (x == 0.8) … if (Math.abs(x – 0.8) < 1e-6) … true false NON ! OUI ! Enumérés (préfixer le littéral par le nom de l’enum !) c == Couleur.TREFLE 2013-2014 F. Mallet - POO 41 Compléments sur les classes Egalité de références Le test d’égalité entre références ne compare pas les objets ! Couleur c1 = new Couleur(1); Couleur c2 = new Couleur(1); c1 == c2 ? Couleur valeur : int c1 != c2 c1 c2 : Couleur valeur = 1 : Couleur valeur = 1 2013-2014 F. Mallet - POO 42 Compléments sur les classes Egalité de références Le test d’égalité entre références ne compare pas les objets ! Couleur c3 = new Couleur(1); Couleur c4 = c3; c3 == c4 c3 Couleur valeur : int c4 : Couleur valeur = 1 2013-2014 F. Mallet - POO 43 Compléments sur les classes Comparaison en profondeur Créer une méthode qui compare class Couleur { int valeur; Couleur(int v) { valeur = v; } boolean estLaMêmeCouleurQue(Couleur c) { if (this.valeur == c.valeur) return true; else return false; } } Usage if (c1.estLaMêmeCouleurQue(c2)) … 2013-2014 F. Mallet - POO 44 Compléments sur les classes Comparaison en profondeur Créer une méthode qui compare class Couleur { int valeur; Couleur(int v) { valeur = v; } boolean estLaMêmeCouleurQue(Couleur c) { return (this.valeur == c.valeur); } } Usage if (c1.estLaMêmeCouleurQue(c2)) … 2013-2014 F. Mallet - POO 45 Compléments sur les classes Comparaison en profondeur Créer une méthode qui compare class Couleur { private int valeur; Couleur(int v) { valeur = v; } boolean estLaMêmeCouleurQue(Couleur c) { return (this.valeur == c.valeur); } } Usage if (c1.estLaMêmeCouleurQue(c2)) … 2013-2014 F. Mallet - POO 46 Compléments sur les classes Egalité de chaînes de caractères Les chaînes de caractères sont des références String s1 = "rouge"; String s2 = "ro" + "uge"; s1 == s2 ? s1.equals(s2) ? s1 s2 : String = "rouge" : String = "rouge" 2013-2014 F. Mallet - POO 47