Vous êtes sur la page 1sur 201

JAVA

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 IDE :
Eclipse Netbeans JBuilder IntelliJ

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 1
public class PremierProg { public static void main (String[ ] args) { 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 types primitifs

Application 1

Application 2

Les structures de contrle


Si (condition ) alors Actions1 sinon : Action2 syntaxe Java : if (condition) { Actions1 } else { Actions2 }

Exemple :

int n = 3 ; if ( n > 2 ) { System.out.print( n est suprieur 2) ; } else { System.out.print( n est infrieur ou gal 2 ) ; }

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() { System.out.println(Grr,Grr); if (taille > 60 ) { } else if (taille >14) { System.out.println(waf,waf); System.out.println(kai,kai); } else { } } } 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() ;

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


Chien d = c ; c=b

d=c
d = null ;

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

Rfrences
Chien d = c ;

Rfrences
c=b

Rfrences
d=c

Rfrences
d = null ;

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
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 { 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 } }

taille

Exercice 1
Dfinissez une classe Point permettant de manipuler un point du plan. Cette classe contiendra : un constructeur, les mthodes d'accs et de modification des coordonnes, une mthode deplacer qui effectue une translation dfinie par les arguments une mthode afficher qui affiche les coordonnes d'un point On donnera un exemple d'utilisation avec une mthode main

Exercice 2
Dfinissez une classe Individu compose d'un nom, d'une adresse, et d'un numro de telephone. Vous crirez aussi les mthodes constructeur, affectation et consulation des champs et affichage.

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() ;

Les tableaux Multidimensionnels

Application 3

Application 4

Exercice 3

Lobjet courant
Lobjet courant est dsign par le mot cl this
Permet de dsigner lobjet dans lequel on se trouve Dsigne une rfrence particulire qui est un membre cach

Utilit de lobjet courant


Rendre explicite laccs aux propres attributs et mthodes dfinies dans la classe Passer en paramtre dune mthode la rfrence de lobjet courant

70

Lobjet courant : attributs et mthodes

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 ; } }
}

Encapsulation

Exercice 4

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 }

Super
Invoquer une mthode de la superclasse
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 } }

Exercice 5

Exercice 6

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

Application 5

Exercice 7

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.

Exercice 8

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 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( ); } }

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<Chien> ( ) ; 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

Exercice 9
Concevez un programme (une classe avec la mthode main) qui cre une liste contenant les 5 nombres entiers 10, 20, ... 50. Les entiers doivent tre dans cet ordre dans la liste (10 sera le premier lment, 20 le deuxime, etc.)

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
Une interface est un modle pour une classe
Quand toutes les mthodes dune classe sont abstraites et il ny a aucun attribut on aboutit la notion dinterface Elle dfinit la signature des mthodes qui doivent tre implmentes dans les classes qui respectent ce modle Toute classe qui implmente linterface doit implmenter toutes les mthodes dfinies par linterface Tout objet instance dune classe qui implmente linterface peut tre dclar comme tant du type de cette interface Les interfaces pourront se driver

Exemple :
Les choses Dmarrable doivent possder une mthode dmarre()

Interfaces
Mise en uvre dune interface
La dfinition dune interface se prsente comme celle dune classe. On y utilise simplement le mot cl interface la place de class
public interface NomInterface { ... }

Lorsquon dfinit une classe, on peut prciser quelle implmente une ou plusieurs interfaces donne(s) en utilisant une fois le mot cl implements
public class NomClasses implements Interface1,Interface3, ... { ... }

Si une classe hrite dune autre classe elle peut galement implmenter une ou plusieurs interfaces
public class NomClasses extends SuperClasse implements Interface1, ... {
...

Interfaces
Mise en uvre dune interface
Une interface ne possde pas dattribut Une interface peut possder des constantes
public interface NomInterface { public static final int CONST = 2; }

Une interface ne possde pas de mot cl abstract Les interfaces ne sont pas instanciables (Mme raisonnement avec les classes abstraites)
NomInterface jeTente = new NomInterface(); // Erreur!!

Interfaces

Interfaces
Tout objet instance dune classe qui implmente linterface peut tre dclar comme tant du type de cette interface
public class Test { public static void main (String[] argv) { // Dclaration dun objet de type Dmarrable Dmarrable dem1; // Cration dun objet Voiture dem1 = new Voiture();

// Dclaration et cration dun objet Personne Personne pers1 = new Personne(dem1); pers1.mettreEnRoute(); // Dclaration dun objet de type Dmarrable Dmarrable dem2; // Cration dun objet Ordinateur dem2 = new Ordinateur(); // Dclaration et cration dun objet Personne Personne pers1 = new Personne(dem2); pers2.mettreEnRoute(); } }

Une personne peut dmarrer tous les objets Dmarrable

Interfaces
Une Voiture et un Ordinateur sont des objets Dmarrable
public class Personne { private Demarrable objetDemarrable; public Personne(Demarrable dem) { objetDemarrable = dem; } public void mettreEnRoute() { objetDemarrable.demarre(); } }

Une personne peut dmarrer Voiture et Ordinateur sans connatre leur nature exacte

Interfaces
Les interfaces pourront se driver
Une interface peut hriter dune autre interface : extends

Consquences

NomInte1 << Interface >>

La dfinition de mthodes de linterface mre (NomInte1) sont reprises dans linterface fille (NomInte2). Toute classe qui implmente linterface fille doit donner une implmentation toutes les mthodes mmes celle hrites

NomInte2 << Interface >>

Utilisation
Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires

Classes abstraites versus interfaces Les classes


Elles sont compltement implmentes Une autre classe peut en hriter Les

classes abstraites

Elles sont partiellement implmentes Une autre classe peut en hriter mais doit donner une implmentation aux mthodes abstraites Elles ne peuvent pas tre instancies Les

interfaces

Elles ne sont pas implmentes Toute classe qui implmente une ou plusieurs interfaces doit implmenter toutes leurs mthodes (abstraites)

Exercice
tablissez une interface 'Car' reprsentant une voiture du monde rel, prvoyez des mthodes pour changer et accder la couleur, au nombre de roues, la vitesse courante du botier de vitesse ("gear"), la vitesse courante de dplacement ("speed"). Ecrivez ensuite la classe 'BasicCar' implmentant cette interface : vous devez dfinir les champs de la classe, les initialiser avec des valeurs par dfaut et crire le code des mthodes de l'interface. Ecrivez ensuite la classe 'BasicTruck' (camion), sous-classe de la classe 'BasicCar', rajoutant une caractristique par rapport une voiture : on est capable de spcifier son type de chargement sous la forme d'une chane de caractres et d'accder ce type (ex. vide, cailloux, beton, ...).

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

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

Prvoir les erreurs d'utilisation


Certains cas d'erreurs peuvent tre prvus l'avance par le programmeur. exemples: erreurs d'entre-sortie (I/O fichiers) erreurs de saisie de donnes par lutilisateur Le programmeur peut : Laisser planter le programme lendroit o lerreur est dtecte Tenter une correction

Notion d'exception
En Java, les erreurs se produisent lors d'une excution sous la forme d'exceptions. Une exception :
est un objet, instance d'une classe d'exception provoque la sortie d'une mthode correspond un type d'erreur contient des informations sur cette erreur

Terminologie
Une exception est un signal qui indique que quelque chose d'exceptionnel est survenu en cours d'excution. Deux solutions alors : laisser le programme se terminer avec une erreur, essayer, malgr l'exception, de continuer l'excution normale. Lever une exception consiste signaler quelque chose d'exceptionnel. Capturer l'exception consiste essayer de la traiter.

Arbre des exceptions


Throwable
String (message d'erreur)

Exception

Error OutOfMemoryError RunTimeException


Les erreurs sont graves et il est recommand de ne pas les corriger.

VosExceptions...

NullPointerException ClassCastException ... exceptions prdfinies

Nature des exceptions


En Java, les exceptions sont des objets ayant 3 caractristiques: Un type dexception (dfini par la classe de lobjet exception) Une chane de caractres (option), (hrit de la classe Throwable). Un instantan de la pile dexcution au moment de la cration. Les exceptions construites par l'utilisateur tendent la classe Exception RunTimeException, Error sont des exceptions et des erreurs prdfinies et/ou gres par Java

Quelques exceptions prdfinies en Java


Division par zro pour les entiers : ArithmeticException Rfrence nulle : NullPointerException Tentative de forage de type illgale : ClassCastException Tentative de cration d'un tableau de taille ngative : NegativeArraySizeException Dpassement de limite d'un tableau : ArrayIndexOutOfBoundsException

Capture d'une exception


Les sections try et catch servent capturer une exception dans une mthode (attraper la bulle) exemple :
public void XXX() { Si une erreur se produit try{ .. } ici. catch { } On tente de rcuprer l. }

try / catch / finally


try { ... } catch (<une-exception>) { ... } catch (<une_autre_exception>) { ... } ... finally { ... }

Autant de blocs catch que l'on veut. Bloc finally facultatif.

Traitement des exceptions (1)


Le bloc try est excut jusqu' ce qu'il se termine avec succs ou bien qu'une exception soit leve. Dans ce dernier cas, les clauses catch sont examines l'une aprs l'autre dans le but d'en trouver une qui traite cette classe d'exceptions (ou une superclasse). Les clauses catch doivent donc traiter les exceptions de la plus spcifique la plus gnrale. Si une clause catch convenant cette exception a t trouve et le bloc excut, l'excution du programme reprend son cours.

Traitement des exceptions (2)


Si elles ne sont pas immdiatement captures par un bloc catch, les exceptions se propagent en remontant la pile d'appels des mthodes, jusqu' tre traites. Si une exception n'est jamais capture, elle se propage jusqu' la mthode main(), ce qui pousse l'interprteur Java afficher un message d'erreur et s'arrter. L'interprteur Java affiche un message identifiant : l'exception, la mthode qui l'a cause, la ligne correspondante dans le fichier.

Bloc finally
Un bloc finally permet au programmeur de dfinir un ensemble d'instructions qui est toujours excut, que l'exception soit leve ou non, capture ou non. La seule instruction qui peut faire qu'un bloc finally ne soit pas excut est System.exit().

Les objets Exception


La classe Exception hrite de La classe Throwable. La classe Throwable dfinit un message de type String qui est hrit par toutes les classes d'exception. Ce champ est utilis pour stocker le message dcrivant l'exception. Il est positionn en passant un argument au constructeur. Ce message peut tre rcupr par la mthode getMessage().

Exemple
public class MonException extends Exception { public MonException() { super(); } public MonException(String s) { super(s); } }

Leve d'exceptions
Le programmeur peut lever ses propres exceptions l'aide du mot rserv throw. throw prend en paramtre un objet instance de Throwable ou d'une de ses sous-classes. Les objets exception sont souvent instancis dans l'instruction mme qui assure leur lancement.
throw new MonException("Mon exception s'est produite !!!");

Emission d'une exception


L'exception elle-mme est leve par l'instruction throw. Une mthode susceptible de lever une exception est identifie par le mot-cl throws suivi du type de l'exception

exemple :
public void ouvrirFichier(String name) throws MonException {if (name==null) throw new MonException(); else {...} }

throws (1)
Pour "laisser remonter" la mthode appelante une exception qu'il ne veut pas traiter, le programmeur rajoute le mot rserv throws la dclaration de la mthode dans laquelle l'exception est susceptible de se manifester.
public void uneMethode() throws IOException { // ne traite pas l'exception IOException // mais est succeptible de la gnrer }

throws (2)
Les programmeurs qui utilisent une mthode connaissent ainsi les exceptions qu'elle peut lever. La classe de l'exception indique peut tout fait tre une superclasse de l'exception effectivement gnre. Une mme mthode peut tout fait "laisser remonter" plusieurs types d'exceptions (spars par des ,). Une mthode doit traiter ou "laisser remonter" toutes les exceptions qui peuvent tre gnres dans les mthodes qu'elle appelle.

Rsum
Grce aux exceptions, Java possde un mcanisme sophistiqu de gestion des erreurs permettant d crire du code robuste Le programme peut dclencher des exceptions au moment opportun. Le programme peut capturer et traiter les exceptions grce au bloc dinstruction catch try finally Le programmeur peut dfinir ses propres classes d exceptions

Exercice 1

Exercice 2

Exercice 3

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;

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 ???


public void accepterAnimaux(ArrayList< ? extends Animal> animaux) { animaux.add( new Chat() ); // ne compilera pas. }

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.