Java 20102
Java 20102
Java 20102
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.
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
Application 1
Application 2
Exemple :
int n = 3 ; if ( n > 2 ) { System.out.print( n est suprieur 2) ; } else { System.out.print( n est infrieur ou gal 2 ) ; }
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() ; } }
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() ;
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() ;
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
70
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
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(); } }
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
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
Utilisation
Lorsquun modle peut se dfinir en plusieurs sous-modles complmentaires
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
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.
Exception
VosExceptions...
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().
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 !!!");
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) ;
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 ;
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
Gnriques
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 } }
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);
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(); } }
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); } } }
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.