Programmation objet avec JAVA Partie 2 Badr Benmammar

Programmation objet avec JAVA Partie 2 Badr Benmammar bbm@badr-benmammar. com

Plan q Héritage q Classes abstraites q Interfaces q Modificateur final q Exception

Héritage de classe public class Rectangle 4 { double x, y, largeur, hauteur; Rectangle 4 ( ) { x = 0; y = 0; largeur = 0; hauteur = 0; } Rectangle 4 (double val. X, double val. Y, double val. L, double val. H) { x = val. X; y = val. Y; largeur = val. L; hauteur = val. H; } double surface() { return largeur * hauteur; } double perimetre() { return 2*(largeur + hauteur); } } public class Carre 4 extends Rectangle 4 { Carre 4(double val. X, double val. Y, double val. Cote) { x = val. X; y = val. Y; largeur = val. Cote; hauteur = val. Cote; } double surface() { return Math. pow(largeur, 2); } double diagonale() { return largeur * Math. sqrt(2); } } La classe Carre 4 (fille ou sous-classe) hérite les attributs et les méthodes de la classe Rectangle 4 (mère ou superclasse). La méthode surface est re-définie dans Carre 4 et donc masque la définition de surface de Rectangle 4.
![Héritage de classe public class Prog 35 { public static void main (String args[]) Héritage de classe public class Prog 35 { public static void main (String args[])](http://slidetodoc.com/presentation_image_h2/15803edcb7f4b962c0a245354f44f9e4/image-4.jpg)
Héritage de classe public class Prog 35 { public static void main (String args[]) { Carre 4 c; c = new Carre 4(40, 100); System. out. println("surface de c : "+c. surface()); System. out. println("perimetre de c : "+c. perimetre()); System. out. println("diagonale de c : "+c. diagonale()); } } A l'appel de la méthode surface, celle-ci est d'abord recherchée dans la classe Carre 4 où se trouve une (re)définition. Résultat: surface de c : 10000. 0 perimetre de c : 400. 0 diagonale de c : 141. 4213562373095 A l'appel de la méthode perimetre, celle-ci est d'abord recherchée dans la classe Carre 4 : pas de définition; puis elle est recherchée dans sa superclasse où se trouve une définition.

Exemple : sous-classe avec nouvel attribut class Personne { protected String nom; protected int age; Personne (String nom, int age) { this. nom=nom; this. age=age; } void set. Nom (String nom) { this. nom=nom; } void set. Age (int age) { this. age=age; } String get. Nom ( ) { return nom; } int get. Age ( ) { return age; } public String to. String( ) { return nom + " (" + age + ")"; } } class Formateur extends Personne { private boolean formation; Formateur (String nom, int age, boolean formation) { super (nom, age); this. formation=formation; } boolean get. Formation() { return formation; } void set. Formation(boolean formation) { this. formation=formation; } public String to. String() { if (formation) return super. to. String() + " a une formation"; else return super. to. String() + " n'a pas de formation"; }
![Exemple : sous-classe avec nouvel attribut class Test. Pers{ public static void main(String arg[]) Exemple : sous-classe avec nouvel attribut class Test. Pers{ public static void main(String arg[])](http://slidetodoc.com/presentation_image_h2/15803edcb7f4b962c0a245354f44f9e4/image-6.jpg)
Exemple : sous-classe avec nouvel attribut class Test. Pers{ public static void main(String arg[]) { Formateur s=new Formateur("bb", 32, false); System. out. println(s); s. set. Nom(s. get. Nom( ) + " ben"); s. set. Age(s. get. Age( ) + 2); s. set. Formation(true); System. out. println(s); } } Résultat: bb (32) n'a pas de formation bb ben (34) a une formation

Héritage de classe q Une classe hérite d'une autre classe par le biais du mot clé extends. q Une classe ne peut hériter que d'une seule et unique classe (en JAVA, pas d’héritage multiple). q La classe fille hérite de toutes les propriétés et méthodes public et protected de la classe mère. q Les méthodes et propriétés private d'une classe mère ne sont pas accessibles dans la classe fille. q On peut redéfinir ou changer tout le code d'une méthode héritée (polymorhisme). q Une méthode déclarée final est non redéfinissable. q Vous ne pouvez pas hériter d'une classe déclarée final.

Classes abstraites q Une classe abstraite est une classe qui n'est pas instanciable, elle n'aura pas d'objet. q Une classe abstraite permets de définir les caractéristiques communes de plusieurs classes d'objets. FORMES GÉOMÉTRIQUES RECTANGLE CARRÉ CERCLE

Classes abstraites abstract public class Forme. Geometrique 1 { publicclass. Rectangle 7 Cercle 7 public class Prog 50 { extends Forme. Geometrique 1 double pos. X, pos. Y; extends Forme. Geometrique 1 {{ public static main (String args[]) { doublelargeur, rayon; void deplacer (double x, double y) { double hauteur; Rectangle 7 rect; Cercle 7 (double x, double y, double r) { pos. X=x; public Rectangle 7( { Cercle 7 cerc; pos. X=x; pos. Y=y; ) rayon=r; rect = new Rectangle 7 (9, 3, 10, 20); pos. Y=y; pos. Y=0; largeur=0; hauteur=0; }pos. X=0; cerc =surface new Cercle 7 } }double ( ) { (43, 32, 100); System. out. print ("cerclex, "); return Math. PI*Math. pow(rayon, void afficher. Position ( ) { public Rectangle 7 (double 2. ); y, cerc. afficher. Position ( ); } System. out. println("position : (" double la, double lo)"); { System. out. print ("rectangle double perimetre ( ) { +pos. X+", "+pos. Y+")"); pos. X=x; pos. Y=y; largeur=la; hauteur=lo; rect. afficher. Position ( ); return 2*rayon*Math. PI; } }} cerc. deplacer (66, 88); System. out. print }double abstract double surface ( ) ; surface() { ("cercle maintenant "); cerc. afficher. Position ( ); abstract double perimetre ( ) ; return largeur * hauteur; } } Résultat: double perimetre() { cercle position : (43. 0, 32. 0) return 2*(largeur + hauteur); Cette classe est abstraite ses méthodes rectangle position : car (9. 0, 3. 0) surfacecercle et perimetre sont position abstraites, c. a. d. non définies. maintenant : }(66. 0, 88. 0) } cercle surface : 31415. 926535897932

Classes abstraites q Une classe abstraite est déclarée avec le modificateur abstract. q Une classe est abstraite si elle contient au moins une méthode abstraite ; elle ne peut pas être instanciée, mais ses sous-classes non abstraites le peuvent. q Une méthode abstraite ne contient pas de corps, mais doit être implémentée dans les sous-classes non abstraites. q Une classe abstraite peut contenir des méthodes non abstraites et des déclarations de variables ordinaires. q Une classe abstraite peut être dérivée en une sous-classe : q abstraite si une ou plusieurs méthodes ne sont pas implémentées par la classe fille. q non abstraite si toutes les méthodes abstraites sont implémentées dans la classe fille.

Interfaces q Dans une interface, toutes les méthodes sont abstraites (c. a. d. non définie), elle ne peut avoir que des variables static final (des constantes). q Une interface n'est pas instanciable, et n'est pas une classe. import java. awt. Graphics; public interface Dessinable 1 { public void dessiner(Graphics g); } public class Rectangle 8 extends Rectangle 7 implements Dessinable 1 { public Rectangle 8 (double x, double y, double la, double lo) { super (x, y, la, lo); } public void dessiner (Graphics g) { g. draw. Rect ((int)pos. X, (int)pos. Y, (int)largeur, (int)hauteur); } } import java. awt. Graphics; public class Texte 8 implements Dessinable 1 { String texte; int pos. X, pos. Y; public Texte 8 (String t, int x, int y) { texte=t; pos. X=x; pos. Y=y; } public void dessiner (Graphics g) { La classe Rectangle 8 hérite de la classe g. draw. String(texte, (int)pos. X, (int)pos. Y); Rectangle 7 et implémente l'interface } Dessinable 1. } Elle définie toutes les méthodes de l'interface.

Interfaces Forme. Geometrique 1 Dessinable 1 Rectangle 7 Rectangle 8 Texte 8 Rectangle 8 hérite de la superclasse Rectangle 7. En Java, l'héritage est simple, une classe n'hérite que d'une superclasse, l'interface permet de contourner cette limite : Rectangle 8 hérite de Rectangle 7 et implémente Dessinable 1. La technique de l'implémentation d'interface permet de réaliser un héritage multiple sans ses inconvénients. Une classe peut implémenter plusieurs interfaces, et une interface peut hériter d'une autre interface.

Interfaces q Une interface ne comporte que des constantes et des méthodes abstraites. q Elle n'est pas "classe abstraite". q Elle peut implémenter une ou plusieurs interfaces, c'est à dire définir le corps de toutes les méthodes abstraites. q C'est l'héritage multiple de Java. q Les constantes sont explicitement ou implicitement static et final.

Interfaces q Les méthodes sont explicitement ou implicitement abstraites. q Une classe qui implémente une interface doit définir le corps de toutes ses méthodes abstraites. q Les sous-classes d'une super-classe qui implémente une interface, héritent (et peuvent redéfinir) des méthodes implémentées. q Une interface peut hériter (par extends) d'une autre interface et en implémenter (par implements) d'autres.

Exemple d’interfaces en Java q public interface Comparable q L'interface Comparable modélise les objets qui possèdent un ordre total. q La seule méthode est compare. To (autre) qui renvoie un entier positif si l'objet est supérieur à l'autre, 0 s'ils sont égaux, et négatif sinon. q Cette interface permet d'utiliser des collections d'objets ordonnés comme Tree. Set. Collections en Java

Collections en Java q Une collection représente un groupe d’objets, connu par ses éléments. q Certaines collections acceptent les doublons, d'autres pas. q Certaines sont ordonnées, d'autres pas. q Certaines collections émettent quelques restrictions, comme le type ou l'interdiction de la valeur null. q Exemple de collection : q Array. List (pour les listes) : q Sous forme de tableau qui se redimensionne automatiquement. q Tree. Set (pour les ensembles) : q Contient un ensemble d'éléments ordonnés.

Tableau non trié import java. util. *; class Personne 1 { protected String nom; protected int age; public static void main(String arg[]) { Personne 1 (String nom, int age) { this. nom=nom; this. age=age; } public String to. String() { Personne 1 p 2=new Personne 1("Pierre", 45); return nom + " (" + age + ")"; } Array. List<Personne 1> liste; liste=new Array. List<Personne 1>(); Personne 1 p 1=new Personne 1("Tom", 21); Personne 1 p 3=new Personne 1("Toto", 18); Personne 1 p 4=new Personne 1("Arthur", 26); liste. add(p 1); liste. add(p 2); liste. add(p 3); liste. add(p 4); System. out. println(liste); }} Résultat: [Tom (21), Pierre (45), Toto (18), Arthur (26)]

Tableau trié import java. util. *; class Personne 1 implements Comparable { protected String nom; protected int age; public static void main(String arg[]) { Tree. Set<Personne 1> liste; liste=new Tree. Set<Personne 1>(); Personne 1 p 1=new Personne 1("Tom", 21); Personne 1 (String nom, int age) { Personne 1 p 2=new Personne 1("Pierre", 45); this. nom=nom; this. age=age; } public String to. String() { Personne 1 p 3=new Personne 1("Toto", 18); return nom + " (" + age + ")"; } public int compare. To (Object o) { Personne 1 p=(Personne 1)o; return nom. compare. To(p. nom); } Personne 1 p 4=new Personne 1("Arthur", 26); liste. add(p 1); liste. add(p 2); liste. add(p 3); liste. add(p 4); System. out. println(liste); }} Résultat: [Arthur (26), Pierre (45), Tom (21), Toto (18)]

Modificateur final q final devant une variable, empêche de changer sa valeur donc la rend constante. q Une méthode est déclarée final afin de mettre un verrou sur la méthode pour empêcher toute sous-classe de la redéfinir. q Ceci est fait pour des raisons de conception quand on veut être sûr que le comportement d’une méthode est préservé durant l’héritage et ne peut pas être redéfini. q Exemple : final boolean check. Password(). q Quand on dit qu’une classe entière est final on stipule qu’on ne veut pas hériter de cette classe ou permettre à qui que ce soit de le faire. q En d’autres mots, soit la conception de cette classe est telle qu’on n’aura jamais besoin de la modifier, soit pour des raisons de sécurité on ne veut pas qu’elle soit sous-classée.

Classe Number q public abstract class Number extends Object implements Serializable q C’est la classe mère de plusieurs classes: q Big. Decimal, Big. Integer, Byte, Double, Float, Integer, Long, Short, Character, Boolean. q Les types primitifs peuvent être "enveloppées" dans un objet provenant d'une classe prévue à cet effet et appelée Wrapper (mot anglais signifiant enveloppeur). q Les enveloppeurs sont donc des objets pouvant contenir une primitive et auxquels sont associés des méthodes permettant de les manipuler.

Enveloppeurs (Wrappers) q Enveloppeur Primitive associée q q q q q char byte boolean short float int long double aucune primitive associée, car cette classe peut contenir des valeurs décimales de précision quelconque aucune primitive associée, car cette classe peut contenir des valeurs entières de précision quelconque Character Byte Boolean Short Float Integer Long Double Big. Decimal q Big. Integer

Utilisation : conversion entre classe public class Equation 1 { private int a, b; public Equation 1(int a, int b) { this. a=a; this. b=b; } public void afficher() { System. out. println(a+" * X = "+b); } int solution() { return b/a; } public static void main(String args[]) { int valeur. A=Integer. value. Of(args[0]). int. Value(); int valeur. B=Integer. value. Of(args[1]). int. Value(); Equation 1 equa = new Equation 1(valeur. A, valeur. B); equa. afficher(); int x = equa. solution(); System. out. println("résultat : X = "+x); } } Passer des paramètres sur la ligne de commande javac Equation 1. java Equation 1 2 4 2*X=4 résultat : X = 2
![Utilisation : conversion entre classe int valeur. A=Integer. value. Of(args[0]). int. Value(); q Integer Utilisation : conversion entre classe int valeur. A=Integer. value. Of(args[0]). int. Value(); q Integer](http://slidetodoc.com/presentation_image_h2/15803edcb7f4b962c0a245354f44f9e4/image-23.jpg)
Utilisation : conversion entre classe int valeur. A=Integer. value. Of(args[0]). int. Value(); q Integer est une classe pour manipuler les entiers comme des objets et non pas uniquement comme une valeur int. q Integer. value. Of (chaine. De. Chiffres) renvoie un objet Integer ayant la valeur correspondante à la chaine de chiffres. q La méthode int. Value( ) de la classe Integer renvoie la valeur int.

Exception public class Equation 1 { private int a, b; public Equation 1(int a, int b) { java Equation 1 0 2 this. a=a; this. b=b; } 0*X=2 public void afficher() { Exception in thread "main" System. out. println(a+" * X = "+b); java. lang. Arithmetic. Exception: / by zero } at Equation 1. solution(Equation 1. java: 20) int solution() { at Equation 1. main(Equation 1. java: 10) return b/a; } public static void main(String args[]) { int valeur. A=Integer. value. Of(args[0]). int. Value(); int valeur. B=Integer. value. Of(args[1]). int. Value(); Equation 1 equa = new Equation 1(valeur. A, valeur. B); equa. afficher(); int x = equa. solution(); System. out. println("résultat : X = "+x); } }

Exception q L'instruction division entière peut lever une exception: Arithmetic. Exception (erreur d'exécution). q Une exception (générée) levée (non propagée et non capturée) finit par provoquer l'arrêt de la "méthode du programme principal". q Une exception est un message envoyé lors d'une erreur à l'exécution. q Ce message contient des informations sur l'erreur qui s'est produite. q Java stoppe l'exécution du code là où l'exception a été levée et envoie le "message" exception. q Sans capture du message exception, celui provoque l'arrêt successif des méthodes appelées jusqu'à la machine JVM qui vous indique l'erreur produite avec beaucoup de détails issus des informations du message. q Les exceptions sont organisées en classe, Java contient une classe nommée Exception, où sont répertoriés différents cas d'erreurs.

Capturer une exception public void afficher() { public class Equation 2 { System. out. println(a+" * X = "+b); private int a, b; } public static void main(String args[]) { int solution( ) { int valeur. A= int x; Integer. value. Of(args[0]). int. Value(); try { int valeur. B= x = b/a; Integer. value. Of(args[1]). int. Value(); } catch (Arithmetic. Exception e) { Equation 2 equa = x = -1; new Equation 2(valeur. A, valeur. B); q L'instruction "try. . . catch" permet de capturer des exceptions : dès } equa. afficher(); qu'une exception est levée dans le corps de try, le traitement de ce corps return x; est terminé. int x = equa. solution(); } Arithmetic. Exception capturées. q catch définit pour les System. out. println("résultat : Xle= traitement "+x); } en reprenant après le bloc try-catch. q L'exécution continue normalement } q Cea, mécanisme permet de traiter les. EXECUTION: erreurs et d'empêcher qu'elle n'arrête public Equation 2(int b) { l'application en cours. this. a=a; this. b=b; java Equation 2 0 2 q L'exception a été capturée et traitée 0: *x X == -1. 2 } résultat : X = -1
- Slides: 26