Cours Programmation

39
1 Java Licence Professionnelle 2009-2010 Cours 7 : Classes et méthodes abstraites

description

Cours java

Transcript of Cours Programmation

  • 1JavaLicence Professionnelle 2009-2010

    Cours 7 : Classes et mthodes abstraites

  • 2Java

    Classes et mthodes abstraites- Le mcanisme des classes abstraites permet de

    dfinir des comportements (mthodes) qui devront tre implments dans les classes filles, mais sans implmenter ces comportements (cest--dire sans crire de code pour cette mthode)

    - Ainsi, on a l'assurance que les classes filles respecteront le contrat dfini par la classe mre abstraite

    - Ce contrat est une interface de programmation

  • 3Java

    Classes et mthodes abstraites- Exemple

    Soit la classe 'Humain', partir de laquelle drivent la classe 'Homme' et la classe 'Femme

    En toute logique, 'Homme' et 'Femme' sont instanciables (les objets crs ont une existence en soi), mais la classe 'Humain' sera dclare abstraite car un objet 'Humain' n'existe pas en tant que tel, puisqu'il manque l'information sur le sexe

    Ici, la classe 'Humain' servira implmenter des mthodes qui seront utilises la fois pour 'Homme' et pour 'Femme'

  • 4JavaClasses et mthodes abstraites

    Exemplepublic abstract class

    AnimalCompagnie{private String nom;public AnimalCompagnie(String n){

    nom = n;}public abstract void parler();

    }

    public class Chien extendsAnimalCompagnie{public Chien(String s) {

    super(s);}

    public void parler() {System.out.println("ouah ouah");

    }}

    public class Chat extendsAnimalCompagnie{public Chat(String s) {

    super(s);}

    public void parler() {System.out.println("miaou");

    }}

  • 5JavaClasses et mthodes abstraites

    Exemple (suite)public class TestAnimal{

    public static void main (String args[]){Chien f = new Chien("Fifi");Chat g = new Chat("Chloe");//AnimalCompagnie a = new

    //AnimalCompagnie("bob");f.parler();g.parler();AnimalCompagnie [] a = new

    AnimalCompagnie [2];a[0] = f;a[1] = g;for(int i=0; i

  • 6JavaClasses et mthodes abstraites

    Quelques rgles1. Ds quune classe comporte une mthode abstraite, elle est

    abstraite, et ce mme si on nindique pas le mot abstractclass A{public abstract void f(); //ok}

    A est considre abstraite et une expression telle que new A() sera rejete

    2. Une mthode abstraite doit obligatoirement tre dclare public, ce qui est logique car sa vocation est dtre redfinie dans une classe drive

    3. Dans lentte dune mthode abstraite, il faut mentionner les nom des arguments muetsclass A{public abstract void g(int); //erreur : nom dargument obligatoire}

  • 7JavaClasses et mthodes abstraites

    Quelques rgles (suite)4. Une classe drive dune classe abstraite na pas besoin de

    redfinir toutes les mthodes abstraite de sa classe

    abstract class A{public abstract void f1(); public abstract void f2(char c); }

    abstract class B extends A //abstract non obligatoire ici mais conseill{public abstract void f1() {}; //dfinition de f1 //pas de dfinition de f2}

    5. Une classe drive dune classe non abstraite peut tre dclare abstraite et/ou contenir des mthodes abstraites

  • 8JavaClasses et mthodes abstraites

    Intrt des classes abstraites- Le recours aux classes abstraites facilite la

    conception oriente objet On peut placer dans une classe abstraite toutes les

    fonctionnalits dont on souhaite disposer pour toutes ses descendances Soit sous forme dune implmentation complte de

    mthodes (non abstraites) et de champs (privs ou non) lorsquils sont communs toutes ses descendances

    Soit sous forme dinterface de mthodes abstraites dont on est alors sr quelles existeront dans toute classe drive instanciable

  • 9TD 7 nonc

    - Lobjectif est de crer le concept forme gomtrique et une forme doit retourner sa surface, son primtre et sa couleur

    - On doit pouvoir aussi modifier sa couleur

    - Dfinir des implmentations pour des objets rectangle, carre et cercle

  • 10

    Exemples de classes abstraites

    Classe Object- En Java, la racine de larbre dhritage des

    classes est la classe java.lang.Object Toutes les classes hritent de la classe Object

    - La classe Object na pas de variable dinstance ni de variable de classe

    - La classe Object fournit plusieurs mthodes qui sont hrites par toutes les classes sans exception

    les plus couramment utilises sont les mthodes toString() et equals()

  • 11

    Exemples de classes abstraites

    Classe Object mthode toString()- public String toString()

    renvoie une description de lobjet sous la forme dune chane de caractres

    Elle est utile pendant la mise au point des programmes pour faire afficher ltat dun objet

    La description doit donc tre concise, mais prcise

  • 12

    Exemples de classes abstraites Mthode toString() de la classe Object

    - Sans redfinition, elle renvoie le nom de la classe, suivi de @ et de la valeur de la mthode hashcode (autre mthode de Object)

    - Exemplepublic class TesttoString {

    public static void main(String[] args) {Object o = new Object(); o.toString(); System.out.println(o);

    }}Renvoie : java.lang.Object@3e25a5

  • 13

    Exemples de classes abstraites

    Autre Exemplepublic class Test {public static void main (String args[]){ Point p= new Point(3,4) ;

    System.out.println(p);}

    }

    - Affiche : Point@19821f do il est utile de la redfinir

  • 14

    Exemples de classes abstraites Mthode toString() de la classe Object

    - Si p1 est un objet, System.out.println(p1) (ou System.out.print(p1)) affiche la chane de caractres p1.toString() o toString() est la mthode de la classe de p1

    - Do lide de profiter pour associer un affichage particulier lobjet pendant la mise au point du programme

    - Exempleclass Point2{

    public Point2(int x, int y){ this.x = x ; this.y = y ;}

    public String toString(){

    return "Point : " + x + ", " + y ;}int x, y ;

    }}

    }

  • 15

    Exemples de classes abstraitespublic class Test {public static void main (String args[]){ Point2 p= new Point2(3,4) ;

    System.out.println(p); //affiche p avec les valeurs actuelles de x et de y

    }}

  • Exemple : Vehicule.javaclass Vehicule {

    private boolean moteur;private int vitesseMax;

    public Vehicule() {moteur = false;vitesseMax = 0;

    }

    public Vehicule(boolean m,int v){moteur = m;vitesseMax = v;

    }

    public String toString(){String S="\nvehicule ";if (moteur)S=S+"a moteur, ";

    elseS=S+"sans moteur, ";

    S=S+"dont la vitesse maximale est de "+vitesseMax+"km/h";return S;

    }

    public void Vmax(){System.out.println("\nvitesse max : "+vitesseMax+" km/h\n");

    }

    public boolean getMoteur () {return moteur;

    }

    public int getVitesseMax() {return vitesseMax;

    }

    public static void main(String[] args){Vehicule v1=new Vehicule(true,121);System.out.println(v1);v1.Vmax();

    }}

  • 17

    Exemples de classes abstraites

    Classe String- Cest un type dont des objets sont figs- Et dont il nest pas possible de modifier le

    contenu la classe String sera tout simplement

    instancie

  • 18

    Exemples de classes abstraites Classes String vs StringBuffer

    - La classe String correspond aux chanes de caractres Toute chane littrale telle que "Bonjour" est implante

    comme instance de cette classe - Les chanes ont la proprit d'tre constantes :

    Une fois initialis un objet de ce type ne peut tre modifi- La classe StringBuffer implante des chanes de caractres

    modifiables et de taille dynamique Automatiquement redimensionne en fonction des besoins

    - Cette classe est en particulier utilise pour implanter la concatnation de chanes (oprateur +)

  • 19

    Exemples de classes abstraites Explication

    - En fait les String sont effectivement non modifiables Cela signifie que :

    String s1 = "toto"; s1 = s1 + "encore toto";

    - instancie une chane s1 avec toto, puis instancie une autre chane qui est la concatnation de s1 et de "encore toto"

    - Cette dernire chane tant ensuite affecte s1- Donc si on fait beaucoup de concatnations, on instancie

    beaucoup de chanes et a prend du temps - D'ou le StringBuffer qui lui est modifiable (on peut ajouter

    des caractres un StringBuffer existant sans en recrer un autre)

  • 20

    Exemples de classes abstraites

    Explication (suite 1)- Dans ce cas :

    StringBuffer sb = "toto"; sb.append("encore toto"); String s1=sb.toString();

    - produira le mme rsultat que prcdemment mais diminuera le nombre d'instanciations

    - Ce qui est d'autant plus vrai que l'on effectue beaucoup de concatnations

  • 21

    Exemples de classes abstraites Explication (suite 2)

    - Ensuite, un des intrts des String est que si on a String s = "toto";

    String s2 = s; - et plus loin

    s = "toto2"; - on est sr que s2 garde la valeur "toto" puisque

    s1 rfrence une toute nouvelle chane- Cela signifie que lorsque l'on fait des copies

    d'objets (par exemple), les chanes n'ont pas besoin dtre recopies en profondeur

    - Une affectation suffit

  • public class StringTest {public static void main (String args [] ) {

    String prenom;prenom = "hazel"; //creation dun objetprenom = "sylvain"; // nouvel objetprenom = new String("hazel"); // nouvel objetString prenom2 = prenom;System.out.println(prenom2); // hazelSystem.out.println(prenom.length()); // 5System.out.println(prenom.charAt(1)); // aString nom = "everett";System.out.println(nom.compareTo(prenom)); //

  • Concernant les temps// Construction d'un tableau d'entiersint[] tab = new int[1000];for (int i = 0; i < tab.length; i++){

    tab[i] = i + 1;}

    // Avec String : prend en moyenne 47587891 nanosecondes String s = "";for (int i = 0; i < tab.length; i++){

    s += tab[i] + ", ";}

    // Avec StringBuffer : prend en moyenne 1234793 nanosecondes. On gagne plus qu'un facteur 10

    StringBuffer buffer = new StringBuffer();for (int i = 0; i < tab.length; i++){

    buffer.append (tab[i]).append (", ");}

  • 24

    Exemples de classes abstraites

    Classe StringBuffer : InsertionStringBuffer buff = new StringBuffer();buff.append ( "Hell" );buff.append ( " World " );buff.append ('!');buff.insert (4, 'o');System .out.println (buff);// Affiche Hello World !

  • 25

    Exemples de classes abstraites

    Classe StringBuffer : SuppressionStringBuffer buff = new StringBuffer ("Hellllo

    World !!");buff.delete (2, 4);buff.deleteCharAt (12);System.out.println (buff);// Affiche Hello World !

  • public class StringBufferTest {public static void main (String args [] ) {

    StringBuffer prenom;prenom = new StringBuffer("hazel");StringBuffer prenom2 = prenom;System.out.println(prenom2); // hazelSystem.out.println(prenom.length()); // 5System.out.println(prenom.charAt(1)); // aSystem.out.println(prenom.append(" everett")); // hazel everettSystem.out.println(prenom); // hazel everettSystem.out.println(prenom.insert(5," jane")); // hazel jane everettSystem.out.println(prenom2); //hazel jane everett

    }}

  • 27

    Exemples de classes abstraites Classe StringTokenizer

    - La classe StringTokenizer fait partie du package java.util- Elle permet de dcomposer une chane de caractres en une suite

    de "mots" spars par des "dlimiteurs" - Elle Fournit 3 Constructeurs

    StringTokenizer(String str, String delim, booleanreturnTokens) str est la chane analyser delim est une chane contenant les dlimiteurs reconnus : \t \n \r \f returnTokens indique si les dlimiteurs doivent tre renvoys comme

    parties de la chane StringTokenizer(String str, String delim)

    Les paramtres dfinissent la chane analyser et les dlimiteurs. Par dfaut, ceux-ci ne sont pas renvoys comme lments de la chane

    StringTokenizer(String str) str est la chane analyser; les dlimiteurs sont les caractres espace,

    tabulation, retour chariot et changement de ligne

  • 28

    Exemples de classes abstraites Utilisation

    - La classe StringTokenizer fournit deux mthodes importantes qui permettent d'obtenir les diffrentes parties d'une chane l'une aprs l'autre :

    hasMoreTokens indique s'il reste des lments extraire nextToken renvoie l'lment suivant

    - Exemple d'utilisation :StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) {

    System.out.println(st.nextToken()); }

    - Ce code fournit la sortie suivante : thisisa test

  • import java.util.*;public class StringTokenTest {

    public static void main(String args[]) {String s = "ceci est un test";StringTokenizer st = new StringTokenizer(s);System.out.println(st.countTokens());while (st.hasMoreTokens()) {

    System.out.println(st.nextToken());}st = new StringTokenizer(s,"t");while (st.hasMoreTokens()) {

    System.out.println(st.nextToken());}

    }}

    Rsultat ?

  • Rsultat ?- 4- ceci- est- un- test- ceci es- un- es

  • 31

    JavaClasses et mthodes abstraites

    Interface- On vient de voir comment une classe abstraite permettait de

    dfinir dans une classe de base des fonctionnalits communes toutes ses descendantes, tout en leur imposant de redfinir certaines mthodes

    - Si lon considre une classe abstraite nimplantant aucune mthode et aucun champ (hormis des constantes), on aboutit la notion dinterface

    - En effet, une interface dfinit les en-ttes dun certain nombre de mthodes ainsi que de constantes

  • 32

    JavaInterface

    Diffrences entre interfaces et classes abstraites :

    Une interface nimplmente aucune mthode Une classe abstraite peut implmenter plusieurs

    interfaces, mais na quune super classe (on ne peut pas faire de new), alors quune interface peut driver de plusieurs autres interfaces

    Des classes non lies hirarchiquement peuvent implmenter la mme interface

    On pourra utiliser des variables de type interface

  • 33

    JavaInterface

    En rsum- Une interface est une sorte de classe abstraite qui ne possde

    que des champs static final (constantes) et des mthodes abstraites

    - Une classe implante une interface elle fournit les implantations de toutes les mthodes dclares dans

    linterface- Toutes les mthodes sont public abstract et non static- Tous les champs sont public static final- Une interface peut tre public (partout) ou sans qualifier (mme

    package)- Une classe qui implante une interface peut dclarer ses propres

    attributs et mthodes aussi- Utilise la place dune classe abstraite quand il ny a aucune

    mthode implante

  • 34

    JavaInterface

    Dfinition dune interface- La dfinition dune interface se prsente comme celle dune

    classe- On utilise seulement le mot interface la place de class

    public interface I{void f(int n); //en-tte dune mthode f (public abstract facultatifs)void g(); //en-tte dune mthode g (public abstract facultatifs)

    }- Dans la dfinition dune interface, on ne peut trouver que des en-

    ttes de mthodes (cas des f et g) ou des constantes- Par essence, les mthodes dune interface sont abstraites et

    publiques- Par contre, il nest pas ncessaire de mentionner les mots

    abstract et public

  • 35

    JavaInterface

    Implmentation dune interface- Lorsquon dfinit une classe, on peut prciser quelle implmente une

    interface donne en utilisant le mot implementsclass A implents I{ //A doit dfinir les mthodes f et g}

    - Une mme classe peut implmenter plusieurs interfacespublic interface I1{void f(); }public interface I2{int h(); }

    class A implents I1, I2{ //A doit dfinir les mthodes f et h}

    -

  • 36

    JavaInterface

    Exempleinterface AnimalInterface{

    void parler();}

    public class Chat implements AnimalInterface{private String nom;public Chat(String s) {

    nom = s;}public void parler() {

    System.out.println("miaou");}

    }

  • 37

    JavaInterface

    public class Chien implements AnimalInterface{private String nom;public Chien(String s) {nom = s;

    }public void parler() {System.out.println("ouah ouah");

    }}

  • 38

    JavaInterface

    Utilisation dune interface- On ne peut pas crer des objets de type interface- On peut dfinir des rfrences- Elles feront rfrence une instance dune classe qui implante linterface

    public class TestAnimal{public static void main (String args[]){

    Chien f = new Chien("Fifi");Chat g = new Chat("Chloe");//AnimalCompagnie a = new AnimalCompagnie("bob");f.parler();g.parler();AnimalInterface [] a = new AnimalInterface [2];a[0] = f;a[1] = g;for(int i=0; i

  • 39

    Cours-TD7 Exercice 2

    - Le but de l'exercice est de crer une hirarchie de classes pourreprsenter les tudiants d'une universit. Il y a 3 types d'tudiants : ceux en Licence, ceux en Master, et ceux en Doctorat. Chaque tudiant a un nom, une adresse et un numro

    - Les tudiants ont un profil. Pour les tudiants en Licence on parle de parcours. Les tudiants en Master une spcialit et lestudiants en Doctorat un directeur de recherche

    1. Dfinir les classes ncessaires cette hirarchie de classes, en leurs ajoutant les membres ncessaires et les mthodes usuelles (constructeurs, toString(), get()et set() etc...).

    2. crire une application qui construit un ensemble d'tudiants (utiliser la classe Lire pour que l'utilisateur puisse saisir les donnes) affiche une liste d'tudiants dans l'ordre selon le numro

    Pour chaque tudiant, il faut afficher toutes les informations le concernant