Vous êtes sur la page 1sur 170

JAVA

Mr Chahhou Mohamed

Introduction

Java 1.02 Java 1.1 Java 2 (Versions 1.2 1.4) :


Micro Edition (J2ME) Standard Edition (J2SE) Entreprise Edition (J2EE) Devient le langage de choix pour les nouvelles applications dentreprise (Web en particulier ) et les applications mobiles.

Java 5.0 ( partir de 1.5)

Introduction

JRE : Java Runtime Environement. Dsigne la machine virtuelle et l'ensemble des outils ncessaires pour excuter une application Java sur votre machine. JDK : Java Development Kit. Ancien terme dsignant le SDK. SDK : Standard Development Kit. Dsigne l'ensemble d'outils ncessaires au dveloppeur Java. Celui-ci contient :

une JRE, les bibliothques de dveloppement, le compilateur


Eclipse Netbeans JBuilder IntelliJ

IDE :

Avantages

Robuste et sr Scuris Simple portable

Fonctionnement

(1) Crer votre document source, exemple MonProgramme.java (2) Compilation laide de linstruction javac, ex : javac MonProgramme.java. - Le compilateur recherche les erreurs et refuse de compiler tant quil nest pas sr que tout fonctionne correctement. (3) Le compilateur cre un nouveau document, MonProgramme.class, cod en bytecode java. (4) Excuter le programme en lanant la JVM avec le fichier MonProgramme.class : java MonProgramme (la commande java lance la JVM)

Exemple
public class PremierProg { public static void main (String[ ] argv) { System.out.println("Bonjour"); } }

Types primitifs

Java est un langage typage fort Il existe deux sortes de variables : les types primitifs et les rfrences aux objets. Les types primitifs contiennent des valeurs lmentaires (de simples suites de bits), dont les entiers, les boolens et les nombres en virgule flottante Exemple : int nombre

Les types primitifs

Les types primitifs


int taille = 32 ; char lettre = j ; double d = 456.54 boolean test ; test = true ; int y = x + 43 ; Vous ne pouvez pas mettre une grande valeur dans une petite tasse. int x = 24 ; byte y = x ; // ne fonctionnera pas Par contre mettre une petite tasse dans une grande tasse est possible. byte x = 24 ; Int y = x ; // fonctionne Constantes Ce sont des variables dont la valeur ne peut tre affecte qu'une fois Exemple : final int n =5 ; n = 10; // erreur : n est dclar final, ne peut plus tre modifie

Les structures de contrle


Si (condition ) alors Actions1 sinon : Action2 syntaxe Java : if (condition) { Actions1 } else { Actions2 }
int n = 3 ; if ( n > 2 ) { System.out.print( n est suprieur 2) ; } else { System.out.print( n est infrieur ou gal 2 ) ; }

Exemple :

Les structures de contrle


Boucle for for (initialisation ; condition ; modification) { Actions } Exemple : for ( int i = 0 ; i<10 ; i++) { System.out.println(i); }

int[ ] tableau = new tableau[100] ; for ( int i = 0 ; i<tableau.length ; i++) { tableau[i] = 5 ; }

Les structures de contrle

while ( condition) { Actions }

int x = 1 ; System.out.println(Avant la boucle) ; while (x < 4 ) { System.out.println(Dans la boucle) ; System.out.println( La valeur de x est : + x) ; x = x +1 ; } System.out.println(Aprs la boucle) ;

Classes et Objets

Classes et Objets

Classes et Objets

Caractristique dun attribut Variables globales de la classe Accessibles dans toutes les mthodes de la classe

Classes et Objets
Une variable locale est visible seulement lintrieur du bloc qui le dfinit :

Classes et Objets

Classes et Objets

Chaque objet qui est une instance de la classe Voiture possde ses propres valeurs dattributs Toutes les instances dune classe donne ont les mmes mthodes, mais ces mthodes peuvent se comporter diffremment selon la valeur des variables dinstance(attributs).

Classes et Objets
Class Chien { int taille ; String race ; String nom ; void aboyer() { if (taille > 60 ) { System.out.println(Grr,Grr); } else if (taille >14) { System.out.println(waf,waf); } else { System.out.println(kai,kai); } } } public class TestChien { public static void main (String[] args) { Chien monChien1 = new Chien(); Chien monChien2 = new Chien(); Chien monChien3 = new Chien(); monChien1.aboyer() ; monChien2.aboyer() ; monChien3.aboyer() ; } }

monChien1.taille = 70; monChien2.taille = 8; monChien3.taille = 35;

Classes et Objets

On peut transmettre des valeurs aux mthodes

Classes et Objets

Les mthodes peuvent retourner des valeurs. int obtenirValeur( ) { return 12 ; } Les mthodes peuvent avoir plusieurs paramtres class Test { void go( ) { Test t = new Test() ; t.addition(12,34) ; } void addition(int x, int y) { int z = x+y ; System.out.println("le total est : "+z) ; } }

Rfrences
Il nexiste pas de variables objet Il nexiste que des rfrences des objets Chien monChien = new Chien() ;

Rfrences

Chien b = new Chien() ; Chien c = new Chien() ;

Rfrences

Chien d = c ;

Rfrences

c=b

Rfrences

d=c

Rfrences

d = null ;

Tableaux

Les tableaux sont considrs comme des objets Fournissent des collections ordonnes dlments Les lments dun tableau peuvent tre - Des variables dun type primitif (int, boolean, double, char, ) - Des rfrences sur des objets Cration dun tableau : 1) Dclaration = dterminer le type du tableau 2) Dimensionnement = dterminer la taille du tableau 3) Initialisation = initialiser chaque case du tableau

Tableaux

Dclaration

int[ ] monTableau; ou int monTableau[ ];

Dimensionnement
Le nombre dlments du tableau sera dtermin quand lobjet tableau sera effectivement cr en utilisant le mot cl new La cration dun tableau par new : - Alloue la mmoire en fonction du type de tableau et de la taille - Initialise le contenu du tableau 0 pour les types simples monTableau = new int[3];

Tableaux

Initialisation
Laccs un lment dun tableau seffectue suivant cette forme : monTableau[varInt]; // varInt >= 0 et <monTableau.length monTableau.length nous donne la taille du tableau Le premier lment du tableau commence toujours lindice 0, et le dernier lment du tableau correspond lindice tailleDuTableau 1

Tableaux

Exemple Chien[] animaux = new Chien[3] animaux[0] = new Chien() ; animaux[1] = new Chien() ; animaux[2] = new Chien() ;

Encapsulation

Les mthodes get et set vous permettent daccder des valeurs de variables dinstance La mthode set permet de prendre la valeur dun argument et sen servir pour dfinir celle dune variable dinstance. class Chien { int taille ; void setTaille(uneTaille) { taille = uneTaille ; } int getTaille() { return taille ; } }

Encapsulation
protger les donnes en les rendant inaccessibles directement aux utilisateurs on utilise ce quon appelle les modificateurs daccs : public et private private taille ; monChien.taille =2 //erreur

public class Chien { private taille ; public getTaille() { return taille ; } public setTaille( int uneTaille ) { if (uneTaille > 5) { taille = une Taille ; } else { taille = 5 ; } }
}

Hritage

vous placez le code commun dans une classe En Java, nous disons que la sous-classe tend la superclasse On utilise le mot-cl extends pour indiquer quune classe hrite dune autre

Hritage
public class Docteur { boolean travailALHopital ; void traiterPatient() { //faire un bilan de sant } } public class MedecinDeFamille extends Docteur{ boolean faitDesVisites ; void donnerConseil() { //donner un simple conseil } } public class Chirurgien extends Docteur { void traiterPatient() { //oprer } void faireUneIncision() { //inciser } }

Hritage

Programme de simulation : lcher quelques animaux dans un environnement pour voir ce qui se passe liste danimaux incomplte Et nous voulons que dautres programmeurs puissent ajouter de nouvelles sortes danimaux au programme nimporte quel moment (1) Rechercher les objets qui ont des attributs et des comportements communs. (2) Crer une classe qui reprsente les tats et les comportements communs.

Hritage

Hritage

Tous les animaux mangent ils de la mme manire ? Un Chien fait-il le mme bruit quun Chat ? manger() et emettreSon() doivent tre redfinies par les sous-classes

Hritage

Loup et Chien prsentent des similitudes. Tigre et Chat aussi

Hritage

Hritage

le test EST UN

Triangle EST UNE Forme, donc Ttriangle peut hriter de Forme ; Chat EST UN Felin, donc Chat peut hriter de Felin Chirurgien EST UN Docteur, donc Chirurgien peut hriter de docteur ; Baignoire EST UNE SalleDeBain, cest faux, donc Baignoire ne peut pas hriter de SalleDeBain.

Vous pouvez concevoir les mthodes de votre superclasse de telle sorte quelles contiennent des implmentations qui fonctionneront pour toutes les sous-classes, mme sil faut rajouter du code

public void vagabonder() { super.vagabonder() ; //Ajouter ma propre faon de vagabonder }

Polymorphisme

le type de la rfrence peut tre la superclasse du type de lobjet rel

Polymorphisme
Animal[ ] animaux = new Animal[5] animaux[0] = new Chien() ; animaux[1] = new Chat()); animaux[2] = new Loup(); animaux[3] = new Hippo(); animaux[4] = new Tigre(); for (int i=0; i<animaux.length; i++ ) { animaux[i].manger(); animaux[i].vagabonder(); }

Polymorphisme
class Soin { public void soigner(Animal a) { //on soigne lanimal, puis il met un son a.emettreSon() ; } }
class ProprietaireDAnimaux { public static void main(String[] args) { Soin s = new Soin(); Chien c = new Chien(); Hippo h = new Hippo(); s.soigner(c); soigner(h);

}
}

Polymorphisme

Le polymorphisme vous permet dcrire du code qui ne change pas quand vous introduisez de nouveaux types de sous-classes dans le programme La classe Soin peut grer nimporte quelle sousclasse dAnimal Si quelquun dautre veut tirer parti de la classe Soin , il lui suffit de sassurer que ses nouveaux sous-types dAnimal tendent la classe Animal.

Classes abstraites

Classes abstraites
que se passe-t-il si on veut crire : Animal anim = new Animal(); Il nous faut la classe Animal pour les besoins de lhritage et du polymorphisme. Mais nous ne voulons pas que les programmeurs puissent crer un objet Animal

Solution : dclarer la classe abstract Une des principales raisons de lexistence de ces classes abstraites : lemployer comme argument ou comme type de retour polymorphe, ou crer un tableau polymorphe.

Classes abstraites
abstract class Canin extends Animal { public void vagabonder(); } Canin c = new Chien() // Ceci est legal Canin c = new Canin() ; // Ceci est illgal on peut galement dfinir des mthodes abstraites Une mthode abstraite na pas de corps public abstract void manger() ; Si vous dclarer une mthode abstraite, la classe doit ltre galement La premire classe concrte de la hirarchie dhritage doit implmenter toutes les mthodes abstraites.

ArrayList

Il serait intressant davoir notre disposition un tableau qui rtrcirait quand on supprime quelque chose. Et quon naurait pas besoin de parcourir pour vrifier chaque lment , mais auquel on pourrait simplement demander sil contient ce quon cherche. Et on pourrait en extraire des valeurs sans savoir exactement o elles sont add(Object element) : ajoute le paramtre de type Object la liste remove(int indice) : supprime lobjet lindice spcifi remove(Object element) : supprime cet objet sil est dans lArrayList contains(Object element) : retourne true si lobjet est dans ArrayList isEmpty() : retourne true si lobjet na plus dlments indexOf(Object element) : retourne soit lindice de lobjet, soit -1 size() : retourne le nombre dlments dans la liste get(int indice) : retourne lobjet se trouvant lindice spcifi

ArrayList

1) cration dune ArrayList : ArrayList<Chien> maListe = new ArrayList( ) ; 2) on y place quelque chose Chien monChien1 = new Chien() ; maListe.add(monChien1) ; 3) on y place autre chose Chien monChien2 = new Chien() ; maListe.add(monChien2) ; 4) savoir combien elle en contient : int taille = maListe.size() ; // retourne 2

ArrayList

5) savoir si elle contient quelque chose : boolean qqch = maListe.contains(monChien2) //LArrayList contient lobjet Chien rfrenc par monChien2 6)trouver quelque chose : int indc = maListe.indexOf(monChien2) // le premier indice dArrayList est 0 ; comme lobjet rfrenc par monChien2 est le deuxime lment de la liste, indexOf() retourne 1 7) savoir si elle est vide : boolean vide = maListe.isEmpty() ; // la liste nest pas vide, isEmpty retourne false 8) en enlever quelque chose maListe.remove(0) ; // on supprime lobjet lindice 0, et la liste rtrcit automatiquement

Classe Object

Certaines mthodes de la classe ArrayList acceptent comme paramtre un type Object. La classe Object est la mre de toutes les classes, la superclasse universelle. Toutes les classes Java tendent la classe Object. Comme toute classe Java est une sous-classe dObject, les mthodes dArrayList peuvent accepter nimporte quoi. lHritage multiple nexiste pas, la classe Chien tend dj la classe Canin, comment peut elle tendre en mme temps la clase Object

Classe Object
1) equals(Object o) : indique si 2 objets sont gaux. Chien c = new Chien() ; Chat x = new Chat() ; if (c.equals(x) ) System.out.println (Vrai) ; else System.out.println (Faux) ; 2) getClass() : indique quelle classe appartient lobjet Chat x = new Chat() ; System.out.println (x.getClass() ) ; // affiche : class Chat 3) toString() : affiche lobjet sous forme de string Chat x = new Chat() ; System.out.println (x.toString() ) ; // affiche : Chat@7d279f 4) hashCode() : donne un code de hashage On discutera de cette mthode plus loin dans le cours.

Classe Object
ArrayList<Chien> mesChiens = new ArrayList<Chien> ; Chien unChien = new Chien() ; mesChiens.add(unChien) ; Chien c = mesChiens.get(0) ; Mais que se pass-t-il si on dclare une ArrayList<Object> qui accepte nimporte quoi ?

ArrayList<Object> mesChiens = new ArrayList<Object> ; Chien unChien = new Chien() ; mesChiens.add(unChien) ; Chien c = mesChiens.get(0) ; // ???

Classe Object

Classe Object
ArrayList<Object> mesChiens = new ArrayList<Object > ; Chien unChien = new Chien() ; mesChiens.add(unChien) ; Object c = mesChiens.get(0) ; c.vagabonder() ; //impossible !! Le compilateur dcide si vous pouvez appeler une mthode en fonction du type de la rfrence et non du type de lobjet rel.

comment reconvertir une rfrence un objet dans son type rel ?

ArrayList<Object> mesChiens = new ArrayList<Object > ; Chien unChien = new Chien() ; mesChiens.add(unChien) ; Object o = mesChiens.get(0) ; Chien c = (Chien) o ; // on reconvertit lobjet o en Chien c.vagabonder() ;

Classe Object

Si on nest pas sur que lobjet est un Chien, on utilise loprateur instanceof pour vrifier.

ArrayList<Object> mesChiens = new ArrayList<Object > ; Chien unChien = new Chien() ; mesChiens.add(unChien) ; Object o = mesChiens.get(0) ; if ( o instanceof Chien ) { Chien c = (Chien) o ; // on reconvertit lobjet o en Chien c.vagabonder() ; }

Interfaces

Supposons maintenant que lon dsire amliorer notre diagramme danimaux pour lutiliser comme programme danimalerie. Certains de nos animaux devront avoir un comportement danimal de compagnie. Un compagnon aura besoin de mthodes comme etreAmical() et jouer(). Nous crons une nouvelle classe nomme Compagnon, et nous y plaons toutes les mthodes ncessaires.

Interfaces

Interfaces

Interfaces

La faon dont les interfaces esquivent le problme du losange de la mort est trs simple : rendre toutes les mthodes abstraites La sous-classe est alors oblige dimplmenter les mthodes. Au moment de lexcution, la JVM ne se demandera pas laquelle des deux versions hrites elle est cense appeler Une interface Java est une classe 100% abstraite

Interfaces

Pour dfinir une interface, on crit : public interface Compagon {.} Pour implmenter une interface : public class Chien implements Compagon {} On peut implmenter une interface et tendre une classe en mme temps, on peut aussi implmenter plusieurs interface en mme temps. public class Chien extends Canin implements Compagon {}

Interfaces
public interface Compagon { public abstract void etreAmical() ; public abstract void jouer() ; } public interface Compagon { void etreAmical() ; void jouer() ; } public class Chien extends Canin implements Compagon { public void etreAmical() { // lecher son maitre } public void jouer() { // apporter la balle } public void vagabonder() {.} public void manger() {.} }

Interfaces

Si toutes les mthodes dune interface sont abstraites, quest ce quune interface apporte rellement ? Si vous substituez des interfaces aux classes concrtes pour les arguments et les types de retour, vous pouvez transmettre nimporte quoi qui implmente cette interface Mais une autre classe peut implmenter la mme interface, tout en venant dun arbre compltement diffrent. Vous pouvez ainsi traiter un objet en fonction du rle quil joue plutt quen fonction du type de la classe partir de laquelle il a t instanci

Super

Invoquer une mthode de la superclasse

abstract class rapport { //la version de la superclasse fait un travail important qui peut tre utile aux sous-classes void execRapport() { //prparer le rapport } void imprRapport() { //impression } } class RapportFrancais extends Rapport { //appeler la version de la superclasse, puis revenir et faire le travail spcifique la sous-classe void execRapport() { super.execRapport() ; appliquerFrancais() ; imprRapport() ; } void appliquerFrancais() { //traduire } }

Packages

un package est un groupe de classes associes une fonctionnalit exemples de packages java.lang : rassemble les classes de base JAVA, Object, String, System... java.util : classes pour les collection java.awt : classes pour interfaces utilisateurs (Abstract WindowToolkit) java.awt.images : classes pour manipulation dimages bitmap ....

Modificateurs daccs

Public : visible par n'importe quelle classe du package ou extrieure au package. Private : visible que dans la classe courante. ( non visible mme des classes filles )

Modificateurs daccs

Protected : n'est utilisable que par la classe, ses sous classes du mme package ou de packages diffrents et les autres classes du package ainsi que leurs filles Friendly : n'est utilisable que par la classe et les classes du mme package.

Constructeurs
Chien monChien = new Chien() ; Il contient le code qui sexcute lorsque vous dites new Quand on crit pas de manire explicite un constructeur, le compilateur se charge de le faire notre place public class Chien public Chien() { } } il ny a pas de type de retour, et le nom du constructeur porte le mme nom que la classe.

Constructeurs

La caractristique cl dun constructeur est quil sexcute avant que lobjet ne puisse tre affect une rfrence. Cela signifie que vous avez une chance dintervenir pour rendre lobjet prt tre utilis avant quil ne soit utilis.

public class Chien public Chien( ) { System.out.println(Construction de lobjet Chien) ; } } public class UtiliserChien { public static void main(String[ ] args) { Chien c = new Chien( ); } }

Constructeurs

Le meilleur endroit o placer linitialisation est le constructeur. Il suffit de crer un constructeur avec arguments :

public class Chien int taille ; public Chien( int tailleChien ) { System.out.println(Construction de lobjet Chien) ; taille = tailleChien ; System.out.println(Le Chien mesure +taille) ; } } public class UtiliserChien { public static void main(String[] args) { Chien c = new Chien(42); } }

Constructeurs

deux constructeurs, un pour la taille par dfaut et un autre avec taille comme argument

public class Chien int taille ; public Chien( ) { taille = 27 ; } public Chien( int tailleChien ) { taille = tailleChien ; } } public class UtiliserChien {

taille }

public static void main(String[] args) { Chien c1 = new Chien(42); Chien c2 = new Chien(); //on cre un Chien dont on ne connait pas la
}

Constructeurs et hritage
public class Animal { public Animal( ) { System.out.println(Nouvel Animal) ; } } public class Chien extends Animal { public Chien( ) { super( ) ; System.out.println(Nouveau Chien) ; } } public class TestChien( ) { public static void main(String[ ] args) { Chien c = new Chien( ); } }

Static

Le comportement de la mthode max( ) de la classe Math ne varie jamais la mthode max(x,y) agit sur largument mais nest jamais affect par ltat dune variable dinstance Gaspillage despace sur le tas pour crer une instance de la classe Math seul fin dexcuter la mthode max() , min( ), abs( ) Ces mthodes nutilisent jamais la valeur dune variable dinstance Math ne possde aucune variable dinstance

Static

Java ne vous permettra pas de crer une instance de la classe Math.


Math objetMath = new Math( ) // erreur de compilation

les mthodes de la classe Math sont static, on a pas besoin dune instance de Math. On a juste besoin de la classe Math.
int x = Math.round(42.2) int y = Math.min(12,56) int z = Math.abs(-56)

Static

Le mot-cl static permet une mthode de sexcuter en labsence de toute instance de la classe. Une mthode static signifie que le comportement ne dpend pas dune variable dinstance, et donc quaucune instance, aucun objet, nest ncessaire. La classe suffit.
public static int min(int a, int b) { //retourne la plus petite valeur } et on crit : Math.min(23,56);

Static

Une classe contenant des mthodes static peut tre instancie On est donc libre de combiner mthodes static et non-static au sein dune mme classe

Static

Les mthodes static ne peuvent pas utiliser de variables dinstance non-static.

public class Chien { private int taille ;

public static void main( String[ ] args ) { System.out.println(Le chien mesure : + taille); //ne compile pas } public void setTaille(int t) { taille = t ; } public int getTaille( ) { return taille ; }
}

Static

Les mthodes static ne peuvent pas non plus utiliser des mthodes non static, parce que les mthodes non-static utilisent des variables dinstance

public class Chien {

private int taille ;


public static void main( String[] args ) { System.out.println(Le chien mesure : + getTaille); //ne compile pas } public void setTaille(int t) { taille = t ; } public int getTaille() { return taille ; }

Static

Variables static : La valeur est la mme pour toutes les instances de la classe une variable partage par toutes les instances de la classe et cest prcisment le rle des variables static, une valeur par classe et non une valeur par objet.

Static
public class Chien { private int taille ; private static int nbreChiens =0;
public Chien( ) { nbreChiens++ ; } public void setTaille(int t) { taille = t ; } public int getTaille( ) { return taille ; } }

Static

Les variables static dune classe sont initialises avant quon ne puisse crer un objet de ce type, et avant lexcution de toute mthode statique

AutoBoxing

Il se peut que vous vouliez traiter des valeurs primitives comme des objets Il existe une classe enveloppe (wrapper) pour chaque type primitif. Les classes enveloppes sont : Boolean, Character, Byte, Short, Integer, Long, Float, Double

AutoBoxing

Pour envelopper une valeur : int i = 288 ; Integer iEnv = new Integer(i) ; pour revenir au type primitive : int x = iEnv.intValue() ;

AutoBoxing

sans autoboxing ( avant Java 5.0 ) ArrayList liste = new ArrayList( ) ; liste.add( new Integer(3) ) ; Integer un = (Integer) liste.get(0); int intUn = un.intValue Avec autoboxing ArrayList<Integer> liste = new ArrayList<Integer>( ) ; liste.add(3); int num = liste.get(0);

AutoBoxing
Integer i = new Integer(42) ; i++;

Integer j = new Integer(5); Integer k = j+3;

AutoBoxing
Les classes enveloppes possdent aussi des mthodes utilitaires static Convertir une chane de caractres en type primitif :

String s = "2" int x = Integer.parseInt(s) ; double d = Double.parseDouble("456.98"); boolean b = new Boolean("true").booleanValue( ) ;

Exceptions

la gestion des exceptions est un mcanisme qui permet de traiter toutes les situations exceptionnelles qui peuvent surgir au moment de lexcution la mthode que vous appelez est risque Le compilateur doit savoir que vous savez que vous appelez une mthode risque

Exceptions

on enveloppe le code risqu dans un bloc try/catch


//methode risque } catch ( Exception ex) { //gestion de lerreur }

try {

Une exception est un objet de type Exception

Exceptions

Pour intercepter une exception, il faut dabord que quelquun la lance.

public void prendreRisque() throws MauvaiseException { if ( x<0 ) { throw new MauvaiseException() ; } } public void testerException() { try { unObjet.prendreRique() ; } catch (MauvaiseException ex) { System.out.println ("MauvaiseException intercepte") ; ex.printStackTrace() ; } }

Exceptions

Exceptions
Le bloc finally est lendroit o placer le code qui sexcute indpendamment de lexception. try {

allumerLeFour() ; x.cuire() ; } catch ( CuissonException ex ) { ex.printStackTrace() ; } finally { eteindreLeFour() }

Exceptions

Une mthode peut lancer plusieurs exceptions si elle en a besoin Le compilateur vrifiera que vous avez gr toutes les exceptions lances par la mthode que vous appelez

Exceptions
public class Lessive { public void faireLaLessive() throws PantalonException, ChaussetteException { // code pouvant lancer lune ou lautre exception } } public class Test { public static void main(String[] args ) { Lessive = new Lessive() ; try { lessive.faireLaLessive() ; } catch ( PantalonException pex ) { pex.printStackTrace() ; }catch ( ChaussetteException cex ) { cex.printStackTrace() ; } }

Exceptions

Exceptions
public void faireLaLessive() throws vetementException { .} try { lessive.faireLaLessive(); } catch ( VetementException vex ) { //. } try { lessive.faireLaLessive(); } catch ( HautException vex ) { //. }

Exceptions
Ce nest pas parce que vous POUVEZ tout intercepter avec un seul super bloc catch polymorphe que vous devez TOUJOURS le faire try { lessive.faireLaLessive() ; } catch ( Exception ex ) { // }

Exception

On peut esquiver une exception

public class Lessive() { public void faireLaLessive() throws vetementException { .} } public class MachineALaver { Lessive lessive = new Lessive( ) ; public void laver( ) throws VetementException { lessive.faireLaLessive( ) ; } public static void main (String[ ] args ) throws VetementException { MachineALaver a = new MachineALaver( ); a.laver( ); } }

Exception

Crer ses propres exception :

public class Point { int x,y ; public Point(int x, int y) throws CoordonneesInvalides { if ((x < 0) || (y < 0)) throw new CoordonneesInvalides (x,y); this.x = x ; this.y = y; } public void affiche( ) { System.out.println("Coordonnes : " + x + " " + y); } }

Exception
public class CoordonneesInvalides extends Exception { private int abs, ord; public CoordonneesInvalides (int x, int y) { this.abs = x; this.ord = y; } public int getAbs() { return this.abs; } public int getOrd() { return this.ord; } }

Exception
public class Test { public static void main(String[ ] argv) { try { Point a = new Point(1,4); a.affiche( ); a = new Point(-2, 4); a.affiche( ); } catch (CoordonneesInvalides e) { System.out.println("Erreur Construction"); System.out.println("Coordonnes: "+ e.getAbs( ) + " " + e.getOrd( ) ); } } }

Exception

Exception

Serialisation

Serialisation
1) Crer un FileOutputStream
FileOutputStream fos = new FileOutputStream(MonJeu.ser) ;

2) Crer un ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(fos) ;

3) Ecrire lobjet oos.writeObject(personnage1) ; oos.writeObject(personnage2) ;


oos.writeObject(personnage3) ;

4) Fermer lObjectOutputStream oos.close() ;

Serialisation

LAPI dE/S (entre/sortie) comprend des flots de communication et des flots de traitement qui ne fonctionnent que sils sont chans dautres flots

Serialisation

La srialisation sauvegarde la valeur des variables dinstance (attributs) Si vous voulez que vote classe soit srialisable, implmentez linterface Serializable Si vous voulez que le processus de serialisation ignore une variable dinstance, dclarez la avec le mot-cl transient.

Serialisation
public class Boite implements Serializable { private int largeur , hauteur;

public void setLargeur(int l) { largeur = l ; } public transient void setHauteur(int h) {hauteur =h ; public static void main(String[ ] args ) {

Boite maBoite = new Boite(); maBoite.setLargeur(50); maBoite.setHauteur(20); try { FileOutputStream fos = new FileOutputStream(boite.ser); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(maBoite); oos.close(); } catch (Exception ex) { ex.printStackTrace(); } }

Deserialisation
1) Crer un FileInputStream FileInputStream fis = new FileInputStream(MonJeu.ser) ; 2) Crer un ObjectInputStream ObjectInputStream ois = new ObjectInputStream(fis) 3) Lire les objets Object un = ois.readObject() ; Object deux = ois.readObject() ; 4) Convertir les objets
Personnage archer = (Personnage) un ; Personnage guerrier = (Personnage) deux ;

5) Fermer lObjectInputStream ois.close() ;

E/S
import java.io.* ; public class EcrireTexte { public static void main( String[] args) { try{ FileWriter fw = new FileWriter(texte.txt); fw.write(Bonjour); fw.close(); } catch(Exception ex) { ex.printStackTrace(); } } }

E/S
import java.io.* ; public class EcrireTexte { public static void main( String[] args) { try{ FileWriter fw = new FileWriter(texte.txt); BufferedWriter bw = new BufferedWriter(fw); bw.write(Bonjour); bw.write(le monde); bw.close(); } catch(Exception ex) { ex.printStackTrace(); } } }

E/S

La classe java.io.File reprsente un fichier sur le disque, mais elle ne reprsente pas le contenu du fichier. Vous pouvez voir un objet File plutt comme le nom de chemin dun fichier 1) Crer un objet reprsentant un fichier File f = new File (monCode.txt) ; 2) crer un repertoire File rep = new File(Chapitre2); rep.mkdir();

E/S

3) lister le contenu dun repertoire if ( rep.isDirectory() ) { String[] contenuRep = rep.list(); for ( int i=0; i< contenuRep.length; i++ ) { System.out.println(contenuRep[i]; } } 4) obtenir le chemin absolu dun fichier ou dun repertoire rep.getAbsolutePath() ; 5) Supprimer un fichier ou un rprtoire (retourne true en cas de succs ) boolean supprime = f.delete() ;

E/S lecture
import java.io.* ; public class LireTexte { public static void main( String[] args) { try{ File monFichier = new File(texte.txt);); Filereader fr = new Filereader(monFichier); BufferedReader br = new BufferedReader (fr);
String ligne = null; while ( (ligne = br.readLine() ) != null) { System.out.println(ligne); } br.close(); } catch(Exception ex) { ex.printStackTrace(); }

}
}

E/S clavier
import java.io.*;class ConsoleIO { public static void main(String[ ] args) { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader input = new BufferedReader(isr); String line; while ((line = input.readLine()) != null) { System.out.println(line); } } catch(Exception ex) { ex.printStackTrace();
}

} }

E/S clavier
import java.util.scanner; class ConsoleIO { public static void main(String[] args) {
Scanner sc = new Scanner(System.in); System.out.println("Veuillez saisir un nombre :"); int str = sc.nextInt(); System.out.println("Vous avez saisi : " + str);

}
}

Gnriques

La classe Solo travaille avec des rfrences de type String

Gnriques

Solo travaille maintenant avec des rfrences de type Object

Gnriques
public class Chien { int taille ; } public class Test { public static void main(String[] args) { Chien c1 = new Chien(); Solo val = new Solo(c1); Chien c2 = val.getValeur(); //erreur } }

Chien c2 = (Chien) val.getValeur();

Gnriques

crer une classe Solo pour chaque type dobjets, une classe SoloString pour grer les strings, une classe SoloInteger pour grer les entiers, une classe SoloChien pour grer les Chiens, etc Et cest la que la gnricit introduite avec Java 5.0, intervient. Avec la gnricit, nous crons une seule classe Solo qui peut accepter nimporte quel type.

Gnriques
public class Solo<T> { private T valeur; public Solo(){ this.valeur = null; } public Solo(T val){ this.valeur = val; } public void setValeur(T val){ this.valeur = val; } public T getValeur(){ return this.valeur; } }

Gnriques

Dans cette classe, le T n'est pas encore dfini. Vous le ferez l'instanciation de cette classe. Par contre, une fois instancie avec un type, l'objet ne pourra travailler qu'avec le type de donnes que vous lui avez spcifi.

Gnriques
public class Test { public static void main(String[] args) { Solo<Integer> val = new Solo<Integer>(12); int nbre = val.getValeur(); } } public class Test { public static void main(String[ ] args) { Chien c1 = new Chien(); Solo<Chien> val = new Solo<Chien>(c1); Chien c2 = val.getValeur(); } }

Gnriques

L avantage des generics rside dans la suppression du contrle de type lexcution. En effet, tant donn que les ventuelles erreurs de transtypage sont leves la compilation, il nest plus ncessaire de contrler le type lexcution.

Gnriques

ArrayList, vu prcdemment est aussi une classe gnrique. Si on regarde la documentation dArrayList, on va trouver :

public class ArrayList<E> extends AbstractList<E> implements List<E> { public boolean add(E o) { . } }

Gnriques

Dire quune mthode est gnrique signifie que sa signature contient un paramtre de type 1) utiliser un paramtre de type dfini dans la dclaration de la classe
public class ArrayList<E> extends AbstractList<E> implements List<E> { public boolean add(E o) { . }

Gnriques

2) utiliser un paramtre de type qui na pas t dfini dans la dclaration de la classe


public <T extends Animal> void accepter ( ArrayList<T> liste ) ;

Gnriques

Lorsque je dclare une rfrence de type Solo<Chien>, je ne peux plus la changer en un autre type. public class Test { public static void main(String[ ] args) { Chien c1 = new Chien(); Solo<Chien> val = new Solo<Chien>(c1); val = new Solo<Chat>(new Chat( ) ) ; //erreur }

Gnriques

wildcard : ?.
Chien c1 = new Chien(); Solo< ?> val = new Solo<Chien>(c1); val = new Solo<Chat>(new Chat( ) ) ; val = new Solo<Tigre>(new Tigre( ) ) ;

val = new Solo<Lion>(new Lion( ) ) ; Avec ce type de dclaration, votre objet accepte bien n'importe quel type de rfrence.

Gnriques

Inconvnient

Chien c1 = new Chien(); Solo< ?> val = new Solo<Chien>(); val.setValeur(c1) ; // erreur de compilation String s = val.getValeur() ; // erreur de compilation

le compilateur ne peut pas savoir si largument quon passe la mthode setValeur() a le bon type, puisque le type est inconnu.

Gnriques et hritage

habitants dune ville et clients dun magasin de cette ville. la classe Client hrite de la classe Habitant
ArrayList< Client> clients = new ArrayList<Client>;

ArrayList< Habitant > habitants = clients;

//erreur

Gnriques et hritage
habitants.add(new Habitant ()); Client c = clients.get(0);

nous tentons dassigner une instance de Habitant une instance de Client

mthodes gnriques
public void go() { Animal[ ] animaux = { new Chien(), new Chat(), new Chien() }; Chien[ ] chiens = { new Chien(), new Chien (), new Chien() }; accepterAnimaux(animaux); accepterAnimaux(chiens); } public void accepterAnimaux(Animal[ ] animaux) { for (int i=0 ; i<animaux.length ; i++ ) { animaux[i].manger(); } }

mthodes gnriques
public void go( ) { ArrayList<Animal> animaux = new ArrayList<Animal>( ); animaux.add(new Chien( ) );
animaux.add(new Chat( ) ); animaux.add(new Chien( ) ); accepterAnimaux(animaux);

} public void accepterAnimaux(ArrayList<Animal> animaux) { for ( Animal a : animaux) { a.manger( ); } }

mthodes gnriques
public void go( ) { ArrayList<Chien > chiens = new ArrayList<Chien >( ); chiens.add(new Chien( ) ); chiens.add(new Chien ( ) ); accepterAnimaux(chiens); //erreur de compilation } public void accepterAnimaux(ArrayList<Animal> animaux) { for ( Animal a : animaux) { a.manger( ); } }

mthodes gnriques
public void accepterAnimaux(ArrayList<Animal> animaux) { animaux.add( new Chat( ) ) ; }

On essaie de mettre un chat dans une liste de chiens

Comment faire alors si nous voulons que notre mthode accepterAnimaux(..) accepte une ArrayList de nimporte quel sous-type dAnimal. Le plus simple consiste utiliser le wildcard

mthodes gnriques
public void accepterAnimaux(ArrayList< ? extends Animal> animaux) { for ( Animal a : animaux) { a.manger(); } }

est ce quon ne retombe pas sur le mme problme ???


animaux.add( new Chat() ); // ne compilera pas. }

public void accepterAnimaux(ArrayList< ? extends Animal> animaux) {

Collections

Documentation dArrayList : ArrayList implmente linterface List

Collections

Les lments insrs dans un ArrayList restent dans lordre dans lequel ils ont t insrs. Utiliser la classe Collections pour effectuer les tris La mthode Collections.sort() trie une liste de chanes de caractres par ordre alphabtique.

Collections

Et si notre ArrayList contient des objets?? Comment trier des objets, quel est le critre de tri??

Collections

la mthode sort() naccepte que des listes dobjets Comparable Mais pourquoi est ce que a fonctionne avec des String ?

Collections

public interface Comparable<T> { int compareTo( T o ) ;

} compareTo() : retourne un entier ngatif, zro ou un entier positif selon que cet objet est infrieur, gal ou suprieur lobjet spcifi

Collections

Collections

List : collections qui reconnaissent les indices, Une List sait o se trouve quelque chose dans la liste. Vous pouvez avoir plusieurs lments rfrenant le mme objet (doublons autoriss). Set : collections qui interdisent les doublons. Un set sait quil y a dj quelque chose dans la collection. Vous ne pouvez pas avoir plus dun lment rfrenant le mme objet ( ou plus dun lment rfrenant deux objets considrs comme gaux ). Map : Pour trouver quelque chose par cl. Ce sont des collections qui utilisent des paires cl-valeur. Une map connat la valeur associe une cl donne. Vous pouvez avoir deux cls qui rfrencent la mme valeur mais vous ne pouvez avoir des cls dupliques.

Collections

Si on ne veut pas de doublons dans nos collections, il faut utiliser un Set au lieu dune List comment le HashSet peut dterminer que deux objets sont gaux ?

Collections

La mthode hashCode() est une mthode de la classe Object que vous pouvez redfinir, si vous ne la redfinissez pas, le comportement par dfaut est que chaque objet aura un numro unique. Java affecte un code de hashage en fonction de ladresse mmoire de lobjet sur le tas, si bien que deux objets ne peuvent avoir le mme

Collections

Egalit des rfrences : deux rfrences, un seul objet sur le tas

Collections

Egalit des objets : deux rfrences, deux objets sur le tas, mais les objets sont considrs comme quivalents.

Collections

Si vous voulez que deux objets soient traits comme tant gaux, il faut la fois redfinir la mthode hashCode() pour quelle soit identique et la mthode equals()

Collections

Threads

Pile, fil dexcution Cration dun Thread :


Thread t = new Thread() ; t.start() ;

Threads

Lancer un nouveau thread


Crer un objet Runnable ( la tche du thread )
Runnable threadTache = new MonRunnable() ;

public class MonRunnable implements Runnable {


public void run() { }

Threads
Crer un objet Thread ( le travailleur ) et lui passer lobjet Runnable ( la tche). Thread monThread = new Thread(threadTache) ; Lancer le thread monThread.start() ;

Threads
public class MonRunnable implements Runnable { public void run() { System.out.println(je suis la tche du thread) ; } } class TestThread { public static void main(String[ ] args) { Runnable tache = new MonRunnable(); Thread monThread = new Thread(tache); monThread.start(); } }

Threads

Les trois tats dun nouveau thread 1) NOUVEAU Thread t = new Thread(tache) ; 2) EXECUTABLE t.start() ; 3) SEXECUTANT lordonnanceur de threads permuter entre les deux tats

Threads

Ordonnanceur de threads
Slection des threads excutables Temps dactivit dun thread On peut pas y accder Imprvisibilit Solution : sommeil

Threads
class MonRunnable implements Runnable {
public void run() { for (int i = 1 ; i<100 ; i++) ;

afficher() ;
} public void afficher() {

System.out.println(je suis le nouveau thread) ; } }

public class TestThread { public static void main(String[ ] args) { Runnable tache = new MonRunnable(); Thread monThread = new Thread(tache); monThread.start(); System.out.println( je suis main); } }

Threads: sommeil
Une fois que la mthode run() dun thread est termine, il est impossible de le relancer. On utilise sleep() pour rendre notre programme plus prvisible try { Thread.sleep(2000) ; } catch ( InterruptedException ex) { ex.printStackTrace(); }

Threads

Quand le thread se rveille, il redevient excutable et attend que lordonnanceur le choisisse nouveau.

Threads
public class ExecThreads implements Runnable { public static void main(String[ ] args ) { ExecThreads exec = new ExecThreads(); Thread alpha = new Thread(exec); Thread beta = new Thread(exec); alpha.setName(le thread alpha); beta.setName(le thread beta); alpha.start(); beta.start(); } public void run() { for (int i=0; i<25; i++) { String nom = Thread.currentThread().getName(); System.out.println(nom + sexcute); } } }

Problmes daccs concurrents


1) On cre une instance de JobAnasEtRachid JobAnasEtRachid tache = new JobAnasEtRachid() ; 2) On cre deux threads avec la mme tche Thread un = new Thread(tache) ; Thread deux = new Thread(tache); 3) On nomme les threads et on les lance un.setName(Anas) ; deux.setName(rachid) ; un.start() ; deux.start() ;

Problmes daccs concurrents


4) on regarde les deux threads excuter la mthode run() Les deux threads vrifient le solde en permanence puis effectue un retrait, mais seulement si le compte est provisionn. if ( compte.getSolde() >= montant ) { try { Thread.sleep(500) ; } catch ( InterruptedException ex) { ex.printStackTrace() ; } }

Solution

Utilisation du verrou La mthode effectuerRetrait() doit sexcuter comme une entit atomique On utilise le modificateur synchronized pour quun seul thread la fois puisse accder la mthode. Les verrous ne sont pas associs une mthode mais un objet. Attention aux verrous mortels.