badr benmammar [email protected] programmation objet avec java partie 2

26
Badr Benmammar [email protected] Programmation objet avec JAVA Partie 2

Upload: alain-rolland

Post on 04-Apr-2015

115 views

Category:

Documents


1 download

TRANSCRIPT

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

Badr Benmammar

[email protected]

Programmation objet avec JAVA

Partie 2

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

Plan

Héritage

Classes abstraites

Interfaces

Modificateur final

Exception

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

Héritage de classe

public class Rectangle4 { double x, y, largeur, hauteur; Rectangle4 ( ) { x = 0; y = 0; largeur = 0; hauteur = 0; } Rectangle4 (double valX, double

valY, double valL, double

valH) { x = valX; y = valY; largeur = valL; hauteur = valH; } double surface() { return largeur * hauteur; } double perimetre() { return 2*(largeur + hauteur); }}

public class Carre4 extends Rectangle4 { Carre4(double valX, double valY, double valCote) { x = valX; y = valY; largeur = valCote; hauteur = valCote; } double surface() { return Math.pow(largeur, 2); } double diagonale() { return largeur * Math.sqrt(2); }}

La classe Carre4 (fille ou sous-classe) hérite les attributs et les méthodes de la classe Rectangle4 (mère ou superclasse).

La méthode surface est re-définie dans Carre4 et donc masque la définition de surface de Rectangle4.

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

Héritage de classe

public class Prog35 { public static void main (String args[]) { Carre4 c; c = new Carre4(40,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());

}}

Résultat:surface de c : 10000.0perimetre de c : 400.0diagonale de c : 141.4213562373095

A l'appel de la méthode surface, celle-ci est d'abord recherchée dans la classe Carre4 où se trouve une (re)définition.

A l'appel de la méthode perimetre, celle-ci est d'abord recherchée dans la classe Carre4 : pas de définition; puis elle est recherchée dans sa superclasse où se trouve une définition.

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

class Personne {protected String nom;protected int age;Personne (String nom, int

age) {this.nom=nom;this.age=age;}void setNom (String nom) {this.nom=nom;}void setAge (int age) {this.age=age;}String getNom ( ) {return nom;}int getAge ( ) {return age;}public String toString( ) {return nom + " (" + age + ")";

}}

Exemple : sous-classe avec nouvel attribut

class Formateur extends Personne {private boolean formation;Formateur (String nom, int age,boolean

formation) {super (nom,age);this.formation=formation;}boolean getFormation() {return formation;}void setFormation(boolean formation) {this.formation=formation;}public String toString() {if (formation)return super.toString() + " a une

formation";elsereturn super.toString() + " n'a pas de

formation";}

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

Exemple : sous-classe avec nouvel attribut

class TestPers{public static void main(String arg[]) {Formateur s=new Formateur("bb",32, false);

System.out.println(s);s.setNom(s.getNom( ) + " ben");

s.setAge(s.getAge( ) + 2);s.setFormation(true);System.out.println(s);}}

Résultat:bb (32) n'a pas de formationbb ben (34) a une formation

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

Héritage de classe

Une classe hérite d'une autre classe par le biais du mot clé extends.

Une classe ne peut hériter que d'une seule et unique classe (en JAVA, pas d’héritage multiple).

La classe fille hérite de toutes les propriétés et méthodes public et protected de la classe mère.

Les méthodes et propriétés private d'une classe mère ne sont pas accessibles dans la classe fille.

On peut redéfinir ou changer tout le code d'une méthode héritée (polymorhisme).

Une méthode déclarée final est non redéfinissable.

Vous ne pouvez pas hériter d'une classe déclarée final.

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

Classes abstraites

Une classe abstraite est une classe qui n'est pas instanciable, elle n'aura pas d'objet.

Une classe abstraite permets de définir les caractéristiques communes de plusieurs classes d'objets.

FORMES GÉOMÉTRIQUES

RECTANGLE CARRÉ CERCLE

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

abstract public class FormeGeometrique1 {

double posX, posY; void deplacer (double x, double

y) { posX=x; posY=y; } void afficherPosition ( ) { System.out.println("position : ("

+posX+","+posY+")"); } abstract double surface ( ) ; abstract double perimetre ( ) ;}

public class Rectangle7 extends FormeGeometrique1

{ double largeur, hauteur; public Rectangle7( ) { posX=0; posY=0; largeur=0;

hauteur=0; } public Rectangle7 (double x, double y, double la, double lo) { posX=x; posY=y; largeur=la;

hauteur=lo; } double surface() { return largeur * hauteur; } double perimetre() { return 2*(largeur + hauteur); }}

Classes abstraites

Cette classe est abstraite car ses méthodes surface et perimetre sont abstraites, c.a.d. non définies.

public class Cercle7 extends FormeGeometrique1 { double rayon; Cercle7 (double x, double y, double r) { posX=x; posY=y; rayon=r; } double surface ( ) { return Math.PI*Math.pow(rayon, 2.); } double perimetre ( ) { return 2*rayon*Math.PI; }}

public class Prog50 { public static void main (String args[]) { Rectangle7 rect; Cercle7 cerc; rect = new Rectangle7 (9,3,10,20); cerc = new Cercle7 (43,32,100); System.out.print ("cercle "); cerc.afficherPosition ( ); System.out.print ("rectangle "); rect.afficherPosition ( ); cerc.deplacer (66,88); System.out.print ("cercle maintenant "); cerc.afficherPosition ( ); }}

Résultat:cercle position : (43.0,32.0)rectangle position : (9.0,3.0)cercle maintenant position : (66.0,88.0)cercle surface : 31415.926535897932

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

Une classe abstraite est déclarée avec le modificateur abstract.

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.

Une méthode abstraite ne contient pas de corps, mais doit être

implémentée dans les sous-classes non abstraites.

Une classe abstraite peut contenir des méthodes non abstraites

et des déclarations de variables ordinaires.

Une classe abstraite peut être dérivée en une sous-classe :

abstraite si une ou plusieurs méthodes ne sont pas

implémentées par la classe fille.

non abstraite si toutes les méthodes abstraites sont

implémentées dans la classe fille.

Classes abstraites

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

Interfaces 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).

Une interface n'est pas instanciable, et n'est pas une classe.

import java.awt.Graphics; public interface Dessinable1 {public void dessiner(Graphics g);}

public class Rectangle8 extends Rectangle7 implements Dessinable1 { public Rectangle8 (double x, double y, double la, double lo) { super (x,y,la,lo); } public void dessiner (Graphics g) { g.drawRect ((int)posX, (int)posY, (int)largeur, (int)hauteur); } }

La classe Rectangle8 hérite de la classe Rectangle7 et implémente l'interface Dessinable1. Elle définie toutes les méthodes de l'interface.

import java.awt.Graphics; public class Texte8 implements Dessinable1 { String texte; int posX, posY; public Texte8 (String t, int x, int y) { texte=t; posX=x; posY=y; } public void dessiner (Graphics g) { g.drawString(texte,(int)posX,(int)posY); } }

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

Interfaces

FormeGeometrique1

Rectangle8

Rectangle7Dessinable1

Texte8

Rectangle8 hérite de la superclasse Rectangle7. En Java, l'héritage est simple, une classe n'hérite que d'une superclasse, l'interface permet de contourner cette limite : Rectangle8 hérite de Rectangle7 et implémente Dessinable1.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.

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

Interfaces

Une interface ne comporte que des constantes et des méthodes

abstraites.

Elle n'est pas "classe abstraite".

Elle peut implémenter une ou plusieurs interfaces, c'est à dire

définir le corps de toutes les méthodes abstraites.

C'est l'héritage multiple de Java.

Les constantes sont explicitement ou implicitement static et final.

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

Interfaces

Les méthodes sont explicitement ou implicitement abstraites.

Une classe qui implémente une interface doit définir le corps de

toutes ses méthodes abstraites.

Les sous-classes d'une super-classe qui implémente une

interface, héritent (et peuvent redéfinir) des méthodes

implémentées.

Une interface peut hériter (par extends) d'une autre interface et

en implémenter (par implements) d'autres.

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

Exemple d’interfaces en Java

public interface Comparable

L'interface Comparable modélise les objets qui possèdent un

ordre total.

La seule méthode est compareTo (autre) qui renvoie un entier

positif si l'objet est supérieur à l'autre, 0 s'ils sont égaux, et

négatif sinon.

Cette interface permet d'utiliser des collections d'objets

ordonnés comme TreeSet.Collections en Java

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

Collections en Java Une collection représente un groupe d’objets, connu par ses

éléments.

Certaines collections acceptent les doublons, d'autres pas.

Certaines sont ordonnées, d'autres pas.

Certaines collections émettent quelques restrictions, comme

le type ou l'interdiction de la valeur null.

Exemple de collection :

ArrayList (pour les listes) :

Sous forme de tableau qui se redimensionne

automatiquement.

TreeSet (pour les ensembles) :

Contient un ensemble d'éléments ordonnés.

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

Tableau non trié

import java.util.*;class Personne1 {protected String nom;protected int age;

Personne1 (String nom, int age)

{this.nom=nom;this.age=age;}public String toString() {

return nom + " (" + age + ")";

}

public static void main(String arg[]) {

ArrayList<Personne1> liste;

liste=new ArrayList<Personne1>();

Personne1 p1=new Personne1("Tom",21);

Personne1 p2=new Personne1("Pierre",45);

Personne1 p3=new Personne1("Toto",18);

Personne1 p4=new Personne1("Arthur",26);

liste.add(p1);liste.add(p2);liste.add(p3);liste.add(p4);System.out.println(liste);}}

Résultat:[Tom (21), Pierre (45), Toto (18), Arthur (26)]

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

Tableau trié import java.util.*;class Personne1 implements

Comparable {protected String nom;protected int age;

Personne1 (String nom, int age) {

this.nom=nom;this.age=age;}public String toString() {

return nom + " (" + age + ")";

}public int compareTo (Object o)

{Personne1 p=(Personne1)o;return nom.compareTo(p.nom);}

public static void main(String arg[]) {

TreeSet<Personne1> liste;

liste=new TreeSet<Personne1>();

Personne1 p1=new Personne1("Tom",21);

Personne1 p2=new Personne1("Pierre",45);

Personne1 p3=new Personne1("Toto",18);

Personne1 p4=new Personne1("Arthur",26);

liste.add(p1);liste.add(p2);liste.add(p3);liste.add(p4);System.out.println(liste);}}

Résultat:[Arthur (26), Pierre (45), Tom (21), Toto (18)]

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

Modificateur final

final devant une variable, empêche de changer sa valeur donc la

rend constante.

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.

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.

Exemple : final boolean checkPassword().

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.

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.

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

Classe Number

public abstract class Number extends Object implements

Serializable

C’est la classe mère de plusieurs classes:

BigDecimal, BigInteger, Byte, Double, Float, Integer, Long,

Short, Character, Boolean.

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).

Les enveloppeurs sont donc des objets pouvant contenir une

primitive et auxquels sont associés des méthodes permettant de

les manipuler.

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

Enveloppeurs (Wrappers)

Enveloppeur Primitive associée Character char Byte byte Boolean boolean Short short Float float Integer int Long long Double double BigDecimal aucune primitive associée, car cette

classe peut contenir des valeurs décimales de précision quelconque

BigInteger aucune primitive associée, car cette classe peut contenir des valeurs entières de précision quelconque

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

Utilisation : conversion entre classe

public class Equation1 { private int a, b; public Equation1(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 valeurA=Integer.valueOf(args[0]).intValue(); int valeurB=Integer.valueOf(args[1]).intValue(); Equation1 equa = new Equation1(valeurA,valeurB); equa.afficher(); int x = equa.solution(); System.out.println("résultat : X = "+x); }}

Passer des paramètres sur la ligne de commande

javac Equation1.javajava Equation1 2 4

2 * X = 4résultat : X = 2

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

Utilisation : conversion entre classe

int valeurA=Integer.valueOf(args[0]).intValue();

Integer est une classe pour manipuler les entiers comme des objets et non pas uniquement comme une valeur int.

Integer.valueOf (chaineDeChiffres) renvoie un objet Integer ayant la valeur correspondante à la chaine de chiffres.

La méthode intValue( ) de la classe Integer renvoie la valeur int.

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

Exception

public class Equation1 { private int a, b; public Equation1(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 valeurA=Integer.valueOf(args[0]).intValue(); int valeurB=Integer.valueOf(args[1]).intValue(); Equation1 equa = new Equation1(valeurA,valeurB); equa.afficher(); int x = equa.solution(); System.out.println("résultat : X = "+x); }}

java Equation1 0 20 * X = 2Exception in thread "main" java.lang.ArithmeticException: / by zero at Equation1.solution(Equation1.java:20) at Equation1.main(Equation1.java:10)

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

Exception

L'instruction division entière peut lever une exception:

ArithmeticException (erreur d'exécution) .

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".

Une exception est un message envoyé lors d'une erreur à l'exécution.

Ce message contient des informations sur l'erreur qui s'est produite.

Java stoppe l'exécution du code là où l'exception a été levée et envoie

le "message" exception.

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.

Les exceptions sont organisées en classe, Java contient une classe

nommée Exception, où sont répertoriés différents cas d'erreurs.

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

Capturer une exception

public class Equation2 { private int a, b;

public static void main(String args[]) {

int valeurA=

Integer.valueOf(args[0]).intValue();

int valeurB=

Integer.valueOf(args[1]).intValue();

Equation2 equa =

new Equation2(valeurA,valeurB);

equa.afficher();

int x = equa.solution();

System.out.println("résultat : X = "+x);

}

public Equation2(int a, int b) {

this.a=a; this.b=b;

}

public void afficher() { System.out.println(a+" * X = "+b); } int solution( ) { int x; try { x = b/a; } catch (ArithmeticException e) { x = -1; } return x; }}

EXECUTION:java Equation2 0 20 * X = 2résultat : X = -1

L'instruction "try ... catch" permet de capturer des exceptions : dès qu'une exception est levée dans le corps de try, le traitement de ce corps est terminé. catch définit le traitement pour les ArithmeticException capturées. L'exécution continue normalement en reprenant après le bloc try-catch. Ce mécanisme permet de traiter les erreurs et d'empêcher qu'elle n'arrête l'application en cours. L'exception a été capturée et traitée : x = -1.