Académique Documents
Professionnel Documents
Culture Documents
Java
Java
Domaines de comptences
Systmes dinformations Embarqu et temps rel
www.serli.com
www.serli.com
Dans les annes 90, vers une maturit des concepts objets
Standardisation de C++ Apparition de langages comme Java ou Python
Cours POO - M. Baron - Page 5
Programmation Structure
www.serli.com
Unit logique : le module Une zone pour les variables Une zone pour les fonctions Structuration descendante du programme Chaque fonction rsout une partie du problme
Cours POO - M. Baron - Page 6
www.serli.com
tat : reprsent par des attributs (variables) qui stockent des valeurs Comportement : dfini par des mthodes (procdures) qui modifient des tats Identit : permet de distinguer un objet dun autre objet
Cours POO - M. Baron - Page 7
Principes POO Les objets communiquent entre eux par des messages
Un objet peut recevoir un message qui dclenche : une mthode qui modifie son tat et / ou une mthode qui envoie un message un autre objet
www.serli.com
dmarre
ma voiture
le moteur
Voiture
- puissance : entier
www.serli.com
Principes POO Lensemble des interactions entre les objets dfini un algorithme Les relations entre les classes refltent la dcomposition du programme
Voiture
www.serli.com
Moteur
www.serli.com
Organisation ...
Partie 1 : Introduction au langage JAVA Partie 2 : Bases du langage Partie 3 : Classes et objets Partie 4 : Hritage
www.serli.com
Dates cls
1991 : Introduction du langage Oak par James Gosling 1993 : Monte en puissance du Web grce Mosaic (lide dadapter Java au Web fait son chemin)
www.serli.com
1995 : Ralisation du logiciel HotJava en Java permettant dexcuter des applets 1996 : NetscapeTM Navigator 2 incorpore une machine virtuelle Java 1.0 en version beta 1997 : Un premier pas vers une version industrielle Java 1.1 1999 : Version industrielle de Java
Cours POO - M. Baron - Page 14
Byte-Code Java
Code objet destin tre excut sur toute Machine Virtuelle Java Provient de la compilation du code source
Programme interprtant le Byte-Code Java et fonctionnant sur un systme dexploitation particulier Conclusion : il suffit de disposer dune Machine Virtuelle Java pour pouvoir excuter tout programme Java mme s il a t compil avec un autre systme dexploitation
Cours POO - M. Baron - Page 16
Machines Virtuelles Java ... Navigateurs Web, Stations de travail, Network Computers WebPhones Tlphones portables Cartes puces
www.serli.com
...
Compilation en Byte-Code
A partir du code source Outil : compilateur Java
javac
Byte Code
Diffrentes finalits
Dans la suite du cours, on va sintresser principalement aux API fournies par Java SE
www.serli.com
SDK (Software Development Kit) fournit un compilateur et une machine virtuelle JRE (Java Runtime Environment) fournit uniquement une machine virtuelle. Idal pour le dploiement de vos applications.
www.serli.com
LAPI de Java
Packages
Java en action
Auteur : Ian F. Darwin diteur : OReilly Edition : 2002 - 836 pages - ISBN : 2841772039
www.serli.com
Ouvrages de rfrence Ouvrages thmatiques aux ditions OReilly sur une slection des Packages Java (certains traduits en Franais)
www.serli.com
String[] argv
Permet de rcuprer des arguments transmis au programme au moment de son lancement
System.out.println("Ola ")
Mthode d'affichage dans la fentre console
Cours POO - M. Baron - Page 25
Compilation
javac NomDeClasse.java ou javac *.java quand plusieurs classes Gnration dun fichier Byte-Code NomDeClasse.class
www.serli.com
Excution
java NomDeClasse Choisir la classe principale excuter
Types primitifs de Java Ne sont pas des objets !!! Occupent une place fixe en mmoire rserve la dclaration Types primitifs :
Entiers : byte (1 octet) - short (2 octets) - int (4 octets) - long (8 octets) Flottants (norme IEEE-754) : float (4 octets) - double (8 octets) Boolens : boolean (true ou false) Caractres : char (codage Unicode sur 16 bits)
www.serli.com
Chacun des types simples possde un alter-ego objet disposant de mthodes de conversion ( voir dans la partie Classes et Objets) Lautoboxing introduit depuis la version 5.0 convertit de manire transparente les types primitifs en rfrences
Cours POO - M. Baron - Page 27
Constantes
www.serli.com
Ce sont des variables dont la valeur ne peut affecte qu'une fois Elles ne peuvent plus tre modifies Elles sont dfinies avec le mot cl final
final int n = 5; final int t; ... t = 8; n = 10; // erreur : n est dclar final
Itrations
Tant que : while (condition) {} Faire jusqu : do {} while (condition)
www.serli.com
Slection borne
Selon faire : switch identificateur { case valeur0 : case valeur1 : default: } Le mot cl break demande sortir du bloc
Penser vrifier si break est ncessaire dans chaque case
Cours POO - M. Baron - Page 29
Faisons varier n :
Valeur de n : 0 nul Adios... Valeur de n : 1 petit moyen Adios...
www.serli.com
Attention : erreur
boolean t = true; if (t == true) {...}
Oprateurs comparaisons
a==b, a!=b, a>b, a<b, a>=b, a<=b
Prfrer :
boolean t = true; if (t) {...}
www.serli.com
Oprateurs logiques
Et : a && b , a & b Ou : a || b , a | b
a 1
b 2 a=b
a 2
b 2
Les tableaux en Java 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 ( voir dans la partie Classes et Objets)
www.serli.com
null
www.serli.com
www.serli.com
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
0
Cours POO - M. Baron - Page 36
1 1 1
0 2 2
0 0 3
est quivalent
monTab = new int[3]; monTab[0] = 1; monTab[1] = 2; monTab[2] = 3;
2 Dimensionnement
monTableau = new int[3];
Ou 12 et 3
int[] monTab = {1, 2, 3};
3 Initialisation
monTableau[0] = 1; monTableau[1] = 2; monTableau[2] = 3;
www.serli.com
Les tableaux en Java : Multidimensionnels Tableaux dont les lments sont eux mmes des tableaux Dclaration
type[][] monTableau; tab
null
Tableaux rectangulaires
Dimensionnement :
tab monTableau = new type[2][3]
. . null null
. .
. .
Tableaux non-rectangulaires
www.serli.com
Dimensionnement :
monTableau = new type[2]
tab
tab
. .
. . .
Mise en forme
www.serli.com
viter
Prfrer
Les objets sont des reprsentations dynamiques (instanciation), du modle dfini pour eux au travers de la classe
Une classe permet d'instancier (crer) plusieurs objets Chaque objet est instance d'une classe et une seule
Cours POO - M. Baron - Page 43
Mthodes
www.serli.com
- Slecteur - Modificateurs
Visibilit
Cours POO - M. Baron - Page 44
Attributs
Slecteur
Modificateurs
www.serli.com
Il peut exceptionnellement y avoir plusieurs classes par fichier (cas des Inner classes)
www.serli.com
Voiture
Relation dinstanciation instance of
tats des objets Chaque objet qui est une instance de la classe Voiture possde ses propres valeurs dattributs Voiture
instance of
www.serli.com
ladaBerline110
maClio
- puissance = 4 - estDmarre = true - vitesse = 179.8
205Gti
- puissance = 6 - estDmarre = true - vitesse = 250
Cours POO - M. Baron - Page 51
attributs
b a=b
Affectation et comparaison Lobjet maClio et saClio ont les mmes attributs (tats identiques) mais ont des rfrences diffrentes
maClio != saClio
Voiture
Le test de comparaison (== et !=) entre objets ne concerne que les rfrence et non les attributs!!!!
instance of
www.serli.com
saClio
- puissance = 4 - estDmarre = true - vitesse = 179.8
maClio
- puissance = 4 - estDmarre = true - vitesse = 179.8
Cours POO - M. Baron - Page 53
b recopie
www.serli.com
Structure des objets Un objet est constitu dune partie statique et dune partie dynamique Partie statique
Ne varie pas dune instance de classe une autre Permet dactiver lobjet Constitue des mthodes de la classe
www.serli.com
Partie dynamique
Varie dune instance de classe une autre Varie durant la vie dun objet Constitue dun exemplaire de chaque attribut de la classe
Cours POO - M. Baron - Page 55
Utilisation
Usage des Mthodes et des Attributs (non recommand) Les attributs de lobjet peuvent tre modifis Les attributs (ou leurs drivs) peuvent tre consults
www.serli.com
Lutilisation dun objet non construit provoque une exception de type NullPointerException
Cration dobjets : droulement La cration dun objet partir dune classe est appele une instanciation. Lobjet cr est une instance de la classe Dclaration
Dfinit le nom et le type de l objet Un objet seulement dclar vaut null (mot rserv du langage)
www.serli.com monObjet monObjet
null
attribut 1 attribut n
Cration dobjets : ralisation La cration dun objet est ralise par new Constructeur(paramtres)
Il existe un constructeur par dfaut qui ne possde pas de paramtre (si aucun autre constructeur avec paramtre nexiste)
Dclaration
www.serli.com
public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture; maVoiture = new Voiture(); // Dclaration et cration en une seule ligne Voiture maSecondeVoiture = new Voiture(); } }
Dclaration
// Dclaration dune deuxime voiture Voiture maVoitureCopie; // Attention!! pour linstant maVoitureCopie vaut null
www.serli.com
// Cration par affectation dune autre rfrence maVoitureCopie = maVoiture // maVoitureCopie possde la mme rfrence que maVoiture } ... }}
www.serli.com
private boolean estDemarree; private double vitesse; public Voiture(int p) { puissance = p; estDemaree = false; vitesse = 0; } ... }
Dclaration
www.serli.com
Voiture maSecVoiture; // Sous entendu quil existe // explicitement un constructeur : Voiture(int) maSecVoiture = new Voiture(); // Erreur
public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture; maVoiture = new Voiture(7); Voiture maSecVoiture; maSecVoiture = new Voiture(); // OK
www.serli.com
Accs aux attributs Pour accder aux donnes dun objet on utilise une notation pointe
identificationObjet.nomAttribut
public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration Voiture v1 = new Voiture(); Voiture v2 = new Voiture(); // Accs aux attributs en criture v1.puissance = 110; www.serli.com // Accs aux attributs en lecture System.out.println("Puissance de v1 = " } }
+ v1.puissance);
Envoi de messages : appel de mthodes Pour demander un objet deffectuer un traitement il faut lui envoyer un message Un message est compos de trois parties
Une rfrence permettant de dsigner lobjet qui le message est envoy Le nom de la mthode ou de lattribut excuter Les ventuels paramtres de la mthode
www.serli.com identificationObjet.nomDeMethode( Paramtres ventuels )
public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration Voiture maVoiture = new Voiture(); www.serli.com // La voiture dmarre maVoiture.demarre(); if (maVoiture.deQuellePuissance() == 4) { System.out.println("Pas trs Rapide"); } // La voiture acclre maVoiture.acclre(123.5); } }
Les objets
Leur rfrence est recopie et non pas les attributs Leur modification dans la mthode entrane celle de loriginal!!!
Cours POO - M. Baron - Page 68
Lobjet courant : attributs et mthodes Dsigne des variables ou des mthodes dfinies dans une classe
public class Voiture { ... private boolean estDemarree; private double vitesse; public int deQuellePuissance() { ... } public void accelere(double vitesse) { if (estDemarree) { this.vitesse = this.vitesse + vitesse; } } }
www.serli.com
this nest pas ncessaire lorsque les identificateurs de variables ne prsentent aucun quivoque
Cours POO - M. Baron - Page 71
www.serli.com
Conducteur
Agrgation
4..5 1 0..1
Roue
Moteur
Galerie
Cours POO - M. Baron - Page 72
Codage de l'association : composition L'objet de classe Voiture peut envoyer des messages l'objet de classe Moteur : Solution 1
Attribut qui stocke la rfrence du moteur
Voiture
public class Voiture { private Moteur leMoteur; ... public Voiture(int p) { leMoteur = new Moteur(p); ... } ... }
www.serli.com
Moteur
Codage de l'association : composition L'objet de classe Moteur n'envoie pas de message l'objet de classe Voiture : Solution 1
Attribut qui stocke la puissance
Voiture
public class Moteur { private int puissance; ... public Moteur(int p) { puissance = p; ... } ... }
www.serli.com
Moteur
Codage de l'association : composition Il peut tre ncessaire que les deux objets en composition s'changent des messages : Solution 2
Lobjet Voiture voit lobjet Moteur Attribut qui stocke la rfrence du Moteur
Voiture
private Moteur leMoteur; ... public Voiture(int p) { leMoteur = new Moteur(p,this); ... } ... }
www.serli.com
Moteur
Codage de l'association : composition Il peut tre ncessaire que les deux objets en composition s'changent des messages : Solution 2
Lobjet Moteur voit lobjet Voiture Attribut qui stocke la puissance
Voiture
private int puissance; private Voiture laVoiture; ... public Moteur(int p, Voiture v) { puissance = p; laVoiture = v; ... } ... }
www.serli.com
Moteur
Codage de lassociation : agrgation L'objet de classe Galerie nenvoie pas de message lobjet de classe Voiture
Attribut qui stocke une rfrence de Galerie
Voiture
public class Voiture { private Galerie laGalerie; ... public Voiture(Galerie g) { laGalerie = g; ... } ... }
www.serli.com
0..1
Galerie
Destruction et ramasse-miettes La destruction des objets se fait de manire implicite Le ramasse-miettes ou Garbage Collector se met en route
Automatiquement : Si plus aucune variable ne rfrence lobjet Si le bloc dans lequel il tait dfini se termine Si lobjet a t affect null Manuellement : Sur demande explicite du programmeur par linstruction System.gc()
www.serli.com
Un pseudo-destructeur protected void finalize() peut tre dfini explicitement par le programmeur
Il est appel juste avant la libration de la mmoire par la machine virtuelle, mais on ne sait pas quand. Conclusion : pas trs sr!!!!
Prfrer dfinir une mthode et de linvoquer avant que tout objet ne soit plus rfrenc : detruit()
Destruction et ramasse-miettes
public class Voiture { private boolean estDemarree; ...
protected void finalize() { estDemarree = false; System.out.println("Moteur arrt"); } public class TestMaVoiture { ... }
Pour tre sr que finalize s'excute il faut absolument appeler explicitement System.gc()
public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); maVoiture.demarre(); // maVoiture ne sert plus rien maVoiture = null; // Appel explicite du garbage collector System.gc(); // Fin du programme System.exit(0); System.out.println("Message non visible"); } }
Gestion des objets Afficher son type et son emplacement mmoire : System.out.println()
System.out.println(maVoiture) // Voiture@119c082
www.serli.com
ou
if (maVoiture.getClass() == Voiture.class) {...} // C est vrai galement
Surcharge La surcharge (overloading) nest pas limite aux constructeurs, elle est possible galement pour nimporte quelle mthode Possibilit de dfinir des mthodes possdant le mme nom mais dont les arguments diffrent Quand une mthode surcharge est invoque le compilateur slectionne automatiquement la mthode dont le nombre est le type
www.serli.com
des arguments correspondent au nombre et au type des paramtres passs dans lappel de la mthode
Des mthodes surcharges peuvent avoir des types de retour diffrents condition quelles aient des arguments diffrents
Cours POO - M. Baron - Page 81
Surcharge Exemple
public class Voiture { private double vitesse; ... public void accelere(double vitesse) { if (estDemarree) { this.vitesse = this.vitesse + vitesse; } } public void acelere(int vitesse) { if (estDemaree) { this.vitesse = this.vitesse + (double)vitesse; public class TestMaVoiture { } } public static void main (String[] argv) { ...} // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); // Acclration 1 avec un double maVoiture.accelere(123.5); // Acclration 2 avec un entier maVoiture.accelere(124); }}
www.serli.com
Constructeurs multiples : le retour Appel explicite dun constructeur de la classe lintrieur dun autre constructeur
Doit se faire comme premire instruction du constructeur Utilise le mot-cl this(paramtres effectifs)
public class Voiture { ...
Exemple
Implantation du constructeur
www.serli.com
public Voiture() { this(7, new Galerie()); } public Voiture(int p) { this(p, new Galerie()); } public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ...
Encapsulation Possibilit daccder aux attributs dune classe Java mais pas recommand car contraire au principe dencapsulation
Les donnes (attributs) doivent tre protgs et accessibles pour lextrieur par des slecteurs
Possibilit d agir sur la visibilit des membres (attributs et mthodes) dune classe vis vis des autres classes Plusieurs niveaux de visibilit peuvent tre dfinis en prcdant dun modificateur la dclaration dun attribut, mthode ou constructeur
private public protected A revoir dans la partie suivante
Cours POO - M. Baron - Page 84
www.serli.com
- private
Utilisable uniquement par les classes dfinies lintrieur dune autre classe. Une classe prive nest utilisable que par sa classe englobante
classe
attribut
www.serli.com
Attribut accessible partout o sa classe est accessible. Nest pas recommand du point de vue encapsulation
mthode
Encapsulation Exemple
public class Voiture { private int puissance; ... public void demarre() { ... } private void makeCombustion() { ... public class TestMaVoiture { } } www.serli.com public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(); // Dmarrage de maVoiture maVoiture.demarre(); maVoiture.makeCombustion(); // Erreur } }
Une mthode prive ne peut plus tre invoque en dehors du code de la classe o elle est dfinie
Les chanes de caractres String Ce sont des objets traits comme des types simples... Initialisation
String maChaine = "Bonjour!"; // Cela ressemble un type simple
Longueur
maChaine.length(); // Avec les parenthses car c'est une mthode
Comparaison
www.serli.com maChaine.equals("Bonjour!"); // Renvoi vrai
Concatnation
String essai = "ess" + "ai"; String essai = "ess".concact("ai");
Les Chanes modifiables StringBuffer Elles sont modifiables par insertion, ajouts, conversions, etc On obtient une StringBuffer avec ses constructeurs
StringBuffer mCM = new StringBuffer(int length); StringBuffer mCM = new StringBuffer(String str);
www.serli.com
Les chanes dcomposables StringTokenizer Elles permettent la dcomposition en mots ou lments suivant un dlimiteur
this is a test => this is a test
Un exemple :
www.serli.com StringTokenizer st = new StringTokenizer("Bonjour, le monde|de|Java",", |"); while(st.hasMoreElements()) System.out.println("Element : " + st.nextElement());
Variables de classe Il peut tre utile de dfinir pour une classe des attributs indpendamment des instances : nombre de Voitures cres Utilisation des Variables de classe comparables aux variables globales Usage des variables de classe
www.serli.com
Variables dont il nexiste quun seul exemplaire associ sa classe de dfinition Variables existent indpendamment du nombre dinstances de la classe qui ont t crs Variables utilisables mme si aucune instance de la classe nexiste
Cours POO - M. Baron - Page 90
Variables de classe Elles sont dfinies comme les attributs mais avec le mot-cl static
public static int nbVoitureCreees;
Pour y accder, il faut utiliser non pas un identificateur mais le nom de la classe
Voiture.nbVoitureCreees = 3; www.serli.com
Il nest pas interdit dutiliser une variable de classe comme un attribut (au moyen d un identificateur) mais fortement dconseill
www.serli.com
Pour y accder, il faut utiliser non pas un identificateur d objet mais le nom de la classe (idem variables de classe)
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX) {...}
} www.serli.com
public Voiture(int poids, ...) { this.poids = poids; nbVoitureCrees++; ... public class TestMaVoiture { } public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(2500); ... System.out.println("Poids maxi:" + Voiture.PTAC_MAX); System.out.println(Voiture.nbVoitureCreees); ... } }
Elles sont dfinies comme les mthodes d'instances, mais avec le mot cl static
www.serli.com public static double vitesseMaxToleree() { return vitesseMaxAutorisee*1.10; }
Pour y accder, il faut utiliser non pas un identificateur d'objet mais le nom de la classe (idem variables de classe)
Voiture.vitesseMaxToleree()
www.serli.com
public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration de maVoiture Voiture maVoiture = new Voiture(2500); ... System.out.println("Nbre Instance :" + Voiture.getNbVoitureCreees()); } }
Erreur : Utilisation d'un attribut non statique dans une zone statique
Cours POO - M. Baron - Page 96
Mthodes de classe Rappel : chacun des types simples (int, double, boolean, char) possde un alter-ego objet disposant de mthodes de conversion Par exemple la classe Integer encapsule le type int
Constructeur partir dun int ou dune chane de caractres
public Integer(int value); public Integer(String s);
Des mthodes de classe trs utiles qui permettent partir dune chane de caractres de transformer en type simple ou type object
String maValueChaine = new String("12313"); int maValuePrimitif = Integer.parseInt(maValueChaine);
Attention aux erreurs de conversion. Retour dune exception. Voir dans la dernire partie du cours
2 Dimensionnement
monTableau = new Voiture[3];
Ou 12 et 3
Voiture[] monTab = { new Voiture(5), new Voiture(7), new Voiture(8) };
3 Initialisation
monTableau[0] = new Voiture(5); monTableau[1] = new Voiture(7); monTableau[2] = new Voiture(8);
www.serli.com
Intrts
Spcialisation, enrichissement : une nouvelle classe rutilise les attributs et les oprations d une classe en y ajoutant et/ou des oprations particulires la nouvelle classe
www.serli.com
Redfinition : une nouvelle classe redfinit les attributs et oprations dune classe de manire en changer le sens et/ou le comportement pour le cas particulier dfini par la nouvelle classe Rutilisation : vite de rcrire du code existant et parfois on ne possde pas les sources de la classe hriter
Cours POO - M. Baron - Page 100
Spcialisation de la classe Voiture Un vhicule prioritaire est une voiture avec un gyrophare
Un vhicule prioritaire rpond aux mmes messages que la Voiture On peut allumer le gyrophare dun vhicule prioritaire
Une voiture lectrique est une voiture dont lopration de dmarrage est diffrente
Une voiture lectrique rpond aux mme messages que la Voiture On dmarre une voiture lectrique en activant un disjoncteur
Voiture Voiture
www.serli.com
+ dmarre()
Relation dhritage
VehiculePrioritaire - gyrophare : boolen + allumeGyrophare() VoitureElectrique - disjoncteur : boolen + dmarre()
Cours POO - M. Baron - Page 101
Classes et sous-classes Un objet de la classe VehiculePrioritaire ou VoitureElectrique est aussi un objet de la classe Voiture donc il dispose de tous les attributs et oprations de la classe Voiture
VehiculePrioritaire - gyrophare : boolen + allumeGyrophare()
Hrit de Voiture
www.serli.com - puissance : entier - estDmarre : boolean - vitesse : flottant + deQuellePuissance() : entier + dmarre() + acclre(flottant)
Hrit de Voiture
Attention
www.serli.com
Un objet de la classe VehiculePrioritaire ou VoitureElectrique est forcment un objet de la classe Voiture Un objet de la classe Voiture nest pas forcment un objet de la classe VehiculePrioritaire ou VoitureElectrique
Cours POO - M. Baron - Page 103
Gnralisation et Spcialisation La gnralisation exprime une relation est-un entre une classe et sa super-classe
Raffinement
Voiture
Super-classe
VehiculePrioritaire
Sous-classe
www.serli.com
Lhritage permet
de gnraliser dans le sens abstraction de spcialiser dans le sens raffinement
Abstraction
Ctac
Humain
www.serli.com
Baleine
Dauphin
Etudiant
Enseignant
Mobi Dick
Ecco
Raoul
Mickal
Cours POO - M. Baron - Page 105
Voiture
www.serli.com
Nessayez pas dhriter de plusieurs classes (extends Voiture, Sante, ) a ne fonctionne pas
Cours POO - M. Baron - Page 106
Voiture + dmarre()
VehiculePrioritaire + allumeGyrophare()
public class VehiculePrioritaire extends Voiture { ... public void allumeGyrophare() { ... } } public class Ambulance extends VehiculePrioritaire { private String malade; ... public void chercher(String ma) { ... } }
www.serli.com
Ambulance
Rappel de la surcharge : possibilit de dfinir des mthodes possdant le mme nom mais dont les arguments (paramtres et valeur de retour) diffrent
www.serli.com
Des mthodes surcharges peuvent avoir des types de retour diffrents condition quelles aient des arguments diffrents
Redfinition (overriding) : lorsque la sous-classe dfinit une mthode dont le nom, les paramtres et le type de retour sont identiques
Cours POO - M. Baron - Page 108
Surcharge et redfinition Une voiture lectrique est une voiture dont lopration de dmarrage est diffrente
Une voiture lectrique rpond aux mme messages que la Voiture On dmarre une voiture lectrique en activant un disjoncteur
Voiture + dmarre()
public class VoitureElectrique extends Voiture { private boolean disjoncteur; ... public void demarre() { disjoncteur = true; } ... }
www.serli.com
Redfinition de la mthode
Cours POO - M. Baron - Page 109
Surcharge et redfinition
public class Voiture { ... public void demarre() { ... } }
Ne pas confondre surcharge et redfinition. Dans le cas de la surcharge la sous-classe ajoute des mthodes tandis que la redfinition spcialise des mthodes existantes
Redfinition
Surcharge
www.serli.com
public class VoitureElectrique extends Voiture { ... public void demarre() { ... } }
public class VehiculePrioritaire extends Voiture { ... public void demarre(int code) { ... } }
public class VoitureElectrique extends Voiture { private boolean disjoncteur; ... public void demarre() { disjoncteur = true; super.demarre(); } ... }
public class TestMaVoiture { public static void main (String[] argv) { // Dclaration puis cration VehiculeElectrique laRochelle = new VehiculeElectrique(...); laRochelle.demarre(); } }
Usage des constructeurs : suite Possibilit comme les mthodes de rutiliser le code des constructeurs de la super-classe Appel explicite dun constructeur de la classe mre lintrieur dun constructeur de la classe fille
Utilise le mot-cl super
www.serli.com
super(paramtres du constructeur);
Appel implicite d'un constructeur de la classe mre est effectu quand il n'existe pas d'appel explicite. Java insre implicitement l'appel super()
Cours POO - M. Baron - Page 113
www.serli.com
public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; public class VoiturePrioritaire ... extends Voiture { } ... private boolean gyrophare; }
Usage des constructeurs : suite Rappel : si une classe ne dfinit pas explicitement de constructeur, elle possde alors un constructeur par dfaut
Sans paramtre Qui ne fait rien Inutile si un autre constructeur est dfini explicitement
public class A { public A() { public void afficherInformation() { super(); System.out.println("Des Informations..."); } } } public class B { private String pInfo; public B(String pInfo) { this.pInfo = pInfo; } } public class Test { public static void main (String[] argv) { new B("Message du main"); } } Cours POO - M. Baron - Page 116 super();
www.serli.com
La classe Object : le mystre rsolu La classe Object est la classe de plus haut niveau dans la hirarchie d'hritage
Toute classe autre que Object possde une super-classe Toute classe hrite directement ou indirectement de la classe Object Une classe qui ne dfinit pas de clause extends hrite de la classe Object
Object
public class Voiture extends Object { ... public Voiture(int p, Galerie g) { puissance = p; moteur = new Moteur(puissance); galerie = g; ... } ... }
www.serli.com
+ Class getClass() + String toString() + boolean equals(Object) + int hashCode() Il n'est pas ncessaire d'crire explicitement extends Object
Cours POO - M. Baron - Page 118
Aprswww.serli.com redfinition
.ln(maVoiture.toString()); public class Test { public static void main (String[] argv) { public String toString() { Voiture maVoiture = new Voiture(3); return("Puissance:" + p); System.out.println(maVoiture); } } }
Droits daccs aux attributs et mthodes Exemple de la Voiture : les limites rsoudre
La mthode dmarre() est disponible dans la classe VehiculePrioritaire Cest--dire que lon peut dmarrer sans donner le code !!! Solution : protger la mthode dmarre() de la classe Voiture
Ralisation
Utilisation du mot-cl protected devant la dfinition des mthodes et/ou attributs Les membres sont accessibles dans la classe o ils sont dfinis, dans toutes ses sous-classes
Voiture
www.serli.com
# dmarre()
VehiculeElectrique + dmarre()
Cours POO - M. Baron - Page 120
Rappel
voitureLarochelle est une instance de la classe VoitureElectrique
www.serli.com
Mais aussi
voitureLarochelle est une instance de la classe Voiture
Voiture
www.serli.com
Remarque : Quel code va tre effectivement excut lorsque le message demarre() est envoy voitureLarochelle ??
+ dmarre()
voitureLarochelle
voitureLarochelle.demarre() www.serli.com
VoitureElectrique
Constat : Cest la mthode dmarre() de VoitureElectrique qui est appele. Puis elle appelle (par super) la mthode de la superclasse
Point
Pointcol
www.serli.com
public class Test { public static void main (String[] argv) Point p = new Point(23,45); p.affiche(); Pointcol pc = new Pointcol(5,5,(byte)12); p = pc; p.affiche(); p = new Point(12,45); p.affiche(); } }
Point
Pointcol
www.serli.com
public class Test { public static void main (String[] argv) Point p = new Point(23,45); p.affiche(); Pointcol pc = new Pointcol(5,5,(byte)12); p = pc; p.affiche(); p = new Point(12,45); p.affiche(); } }
On parle de liaison tardive, lien dynamique, dynamic binding, late-binding ou run-time binding
Surclassement (compilation)
Une variable maVoit est dclare comme tant une rfrence vers un objet de la classe Voiture Un objet de la classe VoitureElectrique est cr Pour le compilateur maVoit reste une rfrence dun objet de la classe Voiture, et il empche daccder aux mthodes spcifiques VoitureElectrique
www.serli.com
Dveloppement plus rapide Plus grande simplicit et meilleure organisation du code Programmes plus facilement extensibles Maintenance du code plus aise
Cours POO - M. Baron - Page 133
www.serli.com
Si une nouveau type de Forme est dfini, le code de la classe Stockage nest pas modifi
www.serli.com
public class Test { public static void main (String[] argv) { public void afficherForme() { Stockage monStock = new Stockage(10); for (int i = 0; i < taille; i++) { liste[i].afficher(); monStock.ajouter(new Cercle(...)); } monStock.ajouter(new Rectangle(...));
} }
Rectangle monRect = new Rectangle(...); Forme tonRect = new Rectangle(...); monStock.ajouter(monRect); monStock.ajouter(tonRect); } }
ClasseA
Pour que le cast fonctionne, il faut qu lexcution le type effectif de monObj soit compatible avec le type ClasseB
www.serli.com
ClasseB
Attention si la compatibilit est fausse et si le cast est effectu une exception de type ClassCastException est leve
La mthode equals() Deux possibilits pour comparer des objets dune classe
Crer une mthode ad-hoc public boolean comparer(MaClasse c) {} qui compare les attributs Redfinir la mthode public boolean equals(Object o) pour garder la compatibilit avec les autres classes de Java. Re-implmenter la mthode public boolean equals(Object o) en comparant les attributs (en utilisant une conversion de type explicite)
Object + boolean equals(Object)
www.serli.com
La mthode equals()
public class Voiture extends Object { public boolean equals(Object o) { if (!o instanceof Voiture) { return false; }
Voiture maVoit = (Voiture)o; return this.puissance == maVoit.puissance && this.estDmarre == maVoit.estDmarre && this.vitesse == maVoit.vitesse; } ... }
Attention : lgalit de rfrence == vrifie si les rfrences sont les mmes, cela ne compare pas les attributs
Classes abstraites : intrts On ne connat pas toujours le comportement par dfaut dune opration commune plusieurs sous-classes
Exemple : toit dune voiture dcapotable. On sait que toutes les dcapotables peuvent ranger leur toit, mais le mcanisme est diffrent dune dcapotable lautre Solution : on peut dclarer la mthode abstraite dans la classe mre et ne pas lui donner dimplantation par dfaut Mthode abstraite et consquences : 3 rgles retenir
www.serli.com
Si une seule des mthodes dune classe est abstraite, alors la classe devient aussi abstraite On ne peut pas instancier une classe abstraite car au moins une de ses mthodes na pas dimplmentation Toutes les classes filles hritant de la classe mre abstraite doivent implmenter toutes ses mthodes abstraites ou sinon elles sont aussi abstraites
Cours POO - M. Baron - Page 140
Classes abstraites et Java On utilise le mot cl abstract pour spcifier abstraite une classe Une classe abstraite se dclare ainsi :
public abstract class NomMaClasse { ... }
Pour crer une mthode abstraite, on dclare sa signature (nom et paramtres) sans spcifier le corps et en ajoutant le mot cl abstract
Classe abstraite
Mthode abstraite
} www.serli.com
public class C3Pluriel extends VoitureDecapotable { private boolean arceauxRetirs; public void replieLeToit() { this.toitReplie = true; this.arceauxRetirs = true; } }
public abstract class Forme { private int positionx, positiony; public void deplacer(double dx, double dy){ x += dx; y += dy; } public abstract double primtre(); public abstract double surface();
www.serli.com
Pas dimplmentation !!
Exemple :
Les choses Dmarrable doivent possder une mthode dmarre()
Voiture Dmarrable << Interface >> + dmarre Ordinateur
Cours POO - M. Baron - Page 146
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, ... { ... }
www.serli.com
Si une classe hrite dune autre classe elle peut galement implmenter une ou plusieurs interfaces
public class NomClasses extends SuperClasse implements Interface1, ... { ... }
Les interfaces ne sont pas instanciables (Mme raisonnement avec les classes abstraites)
NomInterface jeTente = new NomInterface(); // Erreur!!
Notion dinterface et Java Toute classe qui implmente linterface doit implmenter toutes les mthodes dfinies par linterface
Voiture Dmarrable << Interface >> + dmarre
public interface Dmarrable { public void dmarre(); }
Ordinateur
www.serli.com
public class Voiture implements Dmarrable { ... public void dmarre() { estDemarree = true } }
public class Ordinateur implements Dmarrable { ... public void dmarre() { estDemarree = true } }
Notion dinterface et Java 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(); www.serli.com // 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(); } }
Notion dinterface et Java 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(); } }
www.serli.com
Une personne peut dmarrer Voiture et Ordinateur sans connatre leur nature exacte
Cours POO - M. Baron - Page 151
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
www.serli.com
Elles ne peuvent pas tre instancies mais peuvent avoir un constructeur Les interfaces Elles ne sont pas implmentes Toute classe qui implmente une ou plusieurs interfaces doit implmenter toutes leurs mthodes (abstraites)
Cours POO - M. Baron - Page 153
recopie
Utiliser linterface Cloneable pour garder la compatibilit avec les autres classes de Java
www.serli.com
Sont des instanciations de classes et des implmentations dune classe abstraite ou dune interface La ou les mthodes abstraites doivent tre implmentes au moment de linstanciation
Les classes anonymes sont trs utilises pour le dveloppement dIHM avec Java/Swing
Classe interne
Les fichiers .class qui possdent dans leur nom un $ ne sont pas des fichiers temporaires!!!
Cours POO - M. Baron - Page 156
Les packages Le langage Java propose une dfinition trs claire du mcanisme dempaquetage qui permet de classer et de grer les API externes Les API sont constitues :
API
0..*
Paquetage
0..*
Classe
0..*
Mthode Attribut
0..* 0..*
Interface
www.serli.com
Un package est donc un groupe de classes associes une fonctionnalit Exemples de packages
java.lang : rassemble les classes de base Java (Object, String, System, ) java.util : rassemble les classes utilitaires (Collections, Date, ) java.io : lecture et criture
Cours POO - M. Baron - Page 158
Les packages : ok, mais pourquoi faire? Lutilisation des packages permet de regrouper les classes afin dorganiser des libraires de classes Java Exemple : la classe Date est dfinie deux fois
Les packages : utilisation des classes Lorsque, dans un programme, il y a une rfrence une classe, le compilateur la recherche dans le package par dfaut (java.lang) Pour les autres, il est ncessaire de fournir explicitement linformation pour savoir o se trouve la classe :
Utilisation dimport (classe ou paquetage)
import mesclasses.Point; import java.lang.String; // Ne sert rien puisque par dfaut import java.io.ObjectOutput;
ou
www.serli.com import mesclasses.*; import java.lang.*; // Ne sert rien puisque par dfaut import java.io.*;
Les packages : leur existence physique A chaque classe Java correspond un fichier A chaque package (sous-package) correspond un rpertoire
Package Exemple : mesclassses.Voiture Voiture.java mesclasses Classe
Le nom des packages est toujours crit en minuscules
Des classes ou des interfaces Un autre package (sous-package) Package (mesclasses) Sous-package (ex1) Classe (Voiture.java)
Cours POO - M. Baron - Page 161
Les packages : hirarchie de packages A une hirarchie de packages correspond une hirarchie de rpertoires dont les noms concident avec les composants des noms de package Exemple : la classe String
java
Bibliothque pure Java Les sources (*.java) se trouvent dans le rpertoire src du rpertoire Java Les bytecodes (*.class) se trouvent dans larchive rt.jar du rpertoire Java
String.java
lang www.serli.com
util
math
Les packages : cration et conseils Quand vous crer un projet (TP par exemple) nommez le package de plus haut (voiture par exemple) niveau au nom du projet (Voiture par exemple)
Sources
Package voiture :
voiture
www.serli.com
Vos packages. A la racine de Voiture vous pouvez y placer des informations daides lutilisation de votre package. (Fichier de lancement par exemple)
modele
test
VoitureElectrique.java
Voiture.java
Test.java
Les packages : cration et conseils Pour spcifier une classe quelle appartient une classe utiliser le mot cl package Le mot cl package est
toujours plac en premire package voiture.modele; public class VoitureElectrique { instruction dune classe ... } package voiture.modele; public class Voiture { ... } package voiture.test; import voiture.modele.VoitureElectrique; import voiture.modele.Voiture; import ...
www.serli.com public class Test1 { public static void main(String[] argv) { ... } }
Ne confondez pas hritage et package. Pas la mme chose. VoitureElectrique est dans le mme package que Voiture
Les packages : compilation et excution tre plac dans la racine du rpertoire Voiture
Voiture
www.serli.com
java voiture.test.Test
Les packages : visibilit Linstruction import nomPackage.* ne concerne que les classes du package indiqu. Elle ne sapplique pas aux classes des sous-packages
Packages diffrents
import java.util.zip.*; import java.util.*;
Essai utilise les classes Date du package java.util et ZipFile du package java.util.zip
public class Essai { ... www.serli.com public Essai() { Date myDate = new Date(...); ZipFile myZip = new ZipFile(...); ... } ... }
et
*/ /**
Utilisation
Lentit documente est prcde par son commentaire Suivre la prsentation de description des mthodes, classes, prcdente
www.serli.com
Utilisation de tags dfinit par javadoc permettant de typer certaines informations (utilisation possible de balise html)
@author @version @param @since @return @throws @deprecated @see Nom du ou des auteurs Identifiant de version Nom et signification de largument (mthodes uniquement) Version du JDK o cest apparu (utilis par SUN) Valeur de retour Classe de lexception et conditions de lancement Provoque les avertissements de dsapprobation Rfrence croise Cours POO - M. Baron - Page 168
www.serli.com
Javadoc et les commentaires Exemple de laperu html de la description de la classe Object gnre avec javadoc
www.serli.com
www.serli.com
MANIFEST.MF
Exception Dfinition
Une exception est un signal qui indique que quelque chose dexceptionnel (comme une erreur) sest produit. Elle interrompt le flot dexcution normal du programme
A quoi a sert
Grer les erreurs est indispensable : Mauvaise gestion peut avoir des consquences catastrophiques (Ariane 5) Mcanisme simple et lisible : Regroupement du code rserv au traitement des erreurs (pas de mlange avec lalgorithme) Possibilit de rcuprer une erreur plusieurs niveaux dune application (propagation dans la pile des appels de mthodes)
www.serli.com
Vocabulaire
Lancer ou dclencher (throw) une exception consiste signaler les erreurs Capturer ou attraper (catch) une exception permet de traiter les erreurs
Cours POO - M. Baron - Page 173
www.serli.com
Mthode n
bloc 1 bloc 1.1
Mthode 2
appel de mthode transmission d'exception
bloc 2.1.1
bloc 2.1.2
Mthode n
bloc 2.2
Exception : lancer ou dclencher Une mthode dclare quelle peut lancer une exception par le mot cl throws
public Point(int x, int y) throws ErrConst { ... }
Soit la mthode lance une exception, en crant une nouvelle valeur (un objet) dexception en utilisant le mot cl throw
public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; }
www.serli.com
Exception : capturer ou attraper On parle ici de gestionnaire dexception. Il sagit de traiter par des actions la situation exceptionnelle On dlimite un ensemble dinstructions susceptibles de dclencher une exception par des blocs try {}
try { Point a = new Point(1,4); a.affiche(); a = new Point(-2, 4); a.affiche(); }
www.serli.com
Ces blocs permettent de capturer les exceptions dont le type est spcifi et dexcuter des actions adquates
Cours POO - M. Baron - Page 177
www.serli.com
} ... } }
Puis, il y a poursuite de lexcution en dehors du bloc try catch Remarque : si erreur le programme sarrte (System.exit(-1))
Exception : modlisation Les exceptions en Java sont considres comme des objets Toute exception doit tre une instance dune sous-classe de la classe java.lang.Throwable
Erreurs non rcuprables. Plantage de lapplication
Throwable
Error
www.serli.com
Exception
ErrConst
Exception : modlisation Les exceptions sont des objets nous pouvons donc dfinir
Des attributs particuliers Des mthodes
Exception - message : String
Renvoie le message derreur dcrivant lexception Contient un message derreur dcrivant lexception Constructeur avec ou sans argument
www.serli.com
Affiche sur la sortie erreur standard la liste des appels de mthodes ayant conduit lexeception
ErrConst
public class Test { public static void main(String[] argv) { try { ... } catch (ErrConst e) { System.out.println("Erreur Construction"); System.out.println(e.getMessage()); e.printStackTrace(); System.exit(-1);
Affichage de lerreur
www.serli.com
} ... } }
Exception : attraper les tous Il est possible de capturer plus dune exception. Un bloc try et plusieurs blocs catch
public class Point { public void deplace(int dx, int dy) throws ErrDepl { if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl(); x += dx ; y +=dy; } public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; } ... public class Test { public static void main(String[] argv) { try { ... // Bloc dans lequel on souhaite dtecter les exceptions ErrConst et ErrDepl } catch (ErrConst e) { System.out.println("Erreur Construction"); System.exit(-1); } catch (ErrDepl e) { System.out.println("Erreur Dplacement"); System.exit(-1); } } }
www.serli.com
Exception : attrapez les tous Toute mthode susceptible de lever une exception doit :
Soit lattraper (bloc try catch) Soit dclarer explicitement quelle peut lancer une exception (mot cl throws)
Les exceptions leves dans des mthodes (checkXYValue) appeles par la mthode (Point) et non attrapes par celle-ci
public Point(int x, int y) throws ErrConst { checkXYValue(x,y); this.x = x ; this.y = y; } private void checkXYValue(in x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); }
public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(); this.x = x ; this.y = y; }
Exception : attrapez les tous Il faut sassurer que les exceptions sont sous contrle
public class Point { public void deplace(int dx, int dy) throws ErrDepl { if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl(); x += dx ; y +=dy; } public class ErrDepl extends Exception { public ErrDepl() { public void transformer() { ... ... } this.deplace(...); } } }
www.serli.com
Ne pas oublier de traiter une exception sinon le compilateur ne vous loupe pas!!!!
Exception : attrapez les tous Pour garantir une bonne compilation deux solutions
public class Point { public void deplace(int dx, int dy) throws ErrDepl { if (((x+dx) < 0) || ((y+dy) <0)) throw new ErrDepl(); x += dx ; y +=dy; } public void transformer() { ... this.deplace(...); } }
www.serli.com
Soit en ajoutant explicitement linstruction throws la mthode transformer de faon rediriger lerreur
public void transformer() throws ErrDepl { ... this.deplace(...); }
Soit en entourant dun bloc try catch la mthode qui peut poser problme
public void transformer() { try { ... this.deplace(...); } catch (ErrDepl e) { e.printStackTrace(); } }
Exception : transmission dinformation Possibilit denrichir la classe ErrConst en ajoutant des attributs et des mthodes de faon communiquer ErrConst
- abs, ord : int + ErrConst(x,y) + getAbs : int + getOrd : int
public class Point { public Point(int x, int y) throws ErrConst { if ((x < 0) || (y < 0)) throw new ErrConst(x,y); this.x = x ; this.y = y; } public class ErrConst extends Exception { ... private int abs, ord; } public ErrConst(int x, int y) { this.abs = x; this.ord = y; }
public int getAbs() { return this.abs; } public int getOrd() { return this.ord; } } public class Test { public static void main(String[] argv) { try { ... a = new Point(-2, 4); } catch (ErrConst e) { System.out.println("Erreur Construction point"); System.out.println("Coordonnes souhaites : " + e.getAbs() + " " + e.getOrd()); System.exit(-1); } ...
www.serli.com
ErrConst permet de connatre les valeurs qui ont fait chouer la construction de Point
Exception : finally Bloc finally : cest une instruction optionnelle qui peut servir de nettoyage . Elle est excute quelle que soit le rsultat du bloc try (cest--dire quil ait dclench une exception ou non) Permet de spcifier du code dont lexcution est garantie quoi quil arrive Intrt double :
www.serli.com
Rassembler dans un seul bloc un ensemble dinstructions qui autrement auraient du tre dupliques Effectuer des traitements aprs le bloc try, mme si une exception a t leve et non attrape par les blocs catch
Cours POO - M. Baron - Page 187
Exception : finally
public class Test { public static void main(String[] argv) { try { ... // Bloc dans lequel on souhaite dtecter les exceptions ErrConst et ErrDepl } catch (ErrConst e) { System.out.println("Erreur Construction"); System.out.println("Fin du programme"); System.exit(-1); } catch (ErrDepl e) { System.out.println("Erreur Dplacement"); System.out.println("Fin du programme"); System.exit(-1); } } public class Test { } public static void main(String[] argv) { try { ... // Bloc dans lequel on souhaite dtecter les exceptions ErrConst et ErrDepl } catch (ErrConst e) { System.out.println("Erreur Construction"); } catch (ErrDepl e) { System.out.println("Erreur Dplacement"); } finally { System.out.println("Fin du programme"); System.exit(-1); } } }
www.serli.com
www.serli.com
www.serli.com
Exception : les exceptions courantes Java fournit de nombreuses classes prdfinies drives de la classe Exception Ces exceptions standards se classent en deux catgories
Les exceptions explicites (celles que nous avons tudies), mentionnes par le mot cl throws Les exceptions implicites qui ne sont pas mentionnes par le mot cl throws
ArithmeticException (division par zro) NullPointerException (rfrence non construite) ClassCastException (problme de cast) IndexOutOfBoundsException (problme de dpassement dindex dans tableau)
Cours POO - M. Baron - Page 191
Les flux Pour obtenir des donnes, un programme ouvre un flux de donnes sur une source de donnes (fichier, clavier, mmoire, etc) De la mme faon pour crire des donnes dans un fichier, un programme ouvre un flux de donnes
www.serli.com
Java fournit un paquetage java.io qui permet de grer les flux de donnes en entre et en sortie, sous forme de caractres (exemple fichiers textes) ou sous forme binaire (octets, byte)
Cours POO - M. Baron - Page 192
Les flux En Java, le nombre de classes intervenant dans la manipulation des flux est important (plus de 50) Java fournit quatre hirarchies de classes pour grer les flux de donnes
Pour les flux binaires : La classe InputStream et ses sous-classes pour lire des octets (FileInputStream) La classe OuputStream et ses sous-classes pour crire des octets (FileOuputStream)
www.serli.com
Pour les flux de caractres : La classe Reader et ses sous-classes pour lire des caractres (BufferedReader, FileReader) La classe Writer et ses sous-classes (BufferedWriter, FileWriter)
Cours POO - M. Baron - Page 193
public class TestIO { public static void main(String[] argv) { FileWriter myFile = new FileWriter("a_ecrire.txt"); myFile.write("Voil ma premire ligne dans un fichier"); myFile.close(); } www.serli.com }
www.serli.com
Chane saisie
Cours POO - M. Baron - Page 195
www.serli.com
La classe File Java dispose dune classe File qui offre des fonctionnalits de gestion de fichiers La cration dun objet de type File
File monFichier = new File("truc.dat");
File - name : String + File(String nf) + createNewFile() + delete() : boolen + exists() : boolen + getName() : String + isFile() : boolen +
www.serli.com
Les collections Pour linstant nous avons tudi le tableau pour structurer les donnes
Taille statique Lent pour la recherche dlments particuliers Impossibilit dutiliser un pattern de dplacement dans les lments
Java propose depuis la version 2 des classes permettant de manipuler les principales structures de donnes
www.serli.com
Les tableaux dynamiques implmentes par ArrayList et Vector Les listes implmentes par LinkedList Les ensembles implmentes par HashSet et TreeSet
Cours POO - M. Baron - Page 199
Les collections Ces classes implmentent toutes indirectement une mme interface Collection quelles compltent de fonctionnalits propres
Collection << Interface >> LinkedList
HashSet
www.serli.com
Depuis la version 5 de Java, possibilit dutiliser les gnriques pour typer le contenu des Collections
Avant : Voiture maVoiture = (Voiture)myList.get(2) Maintenant : Voiture maVoiture = myList.get(2)
Plus de problme de conversion explicite
Efficacit des oprations sur des collections Oprations communes toutes les collections : les collections que nous allons tudier implmentent toutes au minimum linterface Collection, de sorte quelle disposent de fonctionnalits communes
Cours POO - M. Baron - Page 201
Les collections : les gnriques Java Avec la version 5 de Java possibilit dexploiter les gnriques dans les collections et pour dautres aspects du langage galement Une syntaxe particulire a t rajoute de manire prendre en considration les gnriques
< ? > : signale quil faut prciser le type de la classe < ? , ? > : signale quil faut prciser deux types
Avec les gnriques il va tre possible de fixer la construction de la collection le type du contenu stock dans les collections
www.serli.com
Avanages
Toutes les mthodes accesseurs et modifieurs qui manipulent les lments dune collection sont signs suivant le type dfini la construction de la collection Vrification des types pendant le dveloppement (avant problme de CastClassException)
Cours POO - M. Baron - Page 202
Les collections : Iterator Les itrateurs permettent de parcourir les lments dune collection sans connaissance prcise du type de la collection : Polymorphisme Il existe deux familles ditrateurs :
monodirectionnels Le parcours de la collection se fait dun dbut vers une fin; on ne passe quune seule fois sur chacun des lments bidirectionnels
www.serli.com
Le parcours de la collection peut se faire dans les deux sens ; on peut avancer et reculer sa guise dans la collection
La notion dIterator fait partie de lensemble des Design Patterns
Iterator << Interface >> + hasNext() : boolen + next() : < ? > + remove()
c est une collection et on rcupre son Iterator On rcupre lobjet courant puis on passe au suivant
Cours POO - M. Baron - Page 204
Ajoute ou modifie la position courante un lment de la collection c est une collection et on rcupre son ListIterator Initialise en dbut de liste
www.serli.com
Les collections : LinkedList Cette classe permet de manipuler des listes dites doublement chanes . A chaque lment de collection, on associe implicitement deux informations qui sont les rfrences llment prcdent et suivant
c a c a b a b
www.serli.com
Les collections : LinkedList Possibilit dutiliser les collections (ici LinkedList est un exemple) sans les itrateurs mais moins performant !!!
LinkedList<String> l1 = new LinkedList<String>(); l1.add("Bonjour"); l1.add("Coucou"); for (int i = 0; i < l1.size(); i++) { String o = l1.get(i); System.out.println(o); } www.serli.com
Ne pas modifier la collection (add de LinkedList) pendant quon utilise litrateur (next())
Cours POO - M. Baron - Page 207
Les collections : ArrayList La classe ArrayList est une encapsulation du tableau avec la possibilit de le rendre dynamique en taille Possibilit dutiliser des ListIterator mais on prfre son utilisation un lment de rang donn
ArrayList<Object> myArrayList = new ArrayList<Object>(); myArrayList.add("Coucou"); myArrayList.add(34); for (int i = 0; i < myArrayList.size(); i++) { Object myObject = myArrayList.get(i); if (myObject instanceof String) { System.out.println("Chane:" + ((String)myObject)); } if (my_object instanceof Integer) { System.out.println("Integer:" + ((Integer)myObject)); } } Prfrer lutilisation de la classe ArrayList au lieu de la classe Vector
www.serli.com
Les collections : HashSet La classe HashSet permet de grer les ensembles. Deux lments ne peuvent tre identiques Il faut prvoir deux choses dans vos classes :
La redfinition de la mthode hashCode() qui est utilise pour ordonnancer les lments dun ensemble (calcul la table de hachage dun objet) La redfinition de la mthode equals(Object) qui compare des objets de mme classe pour connatre lappartenance dun lment lensemble
public class TestHashSet { public static void main(String[] argv) { Point p1 = new Point(1,3), p2 = new Point(2,2); Point p3 = new Point(4,5), p4 = new Point(1,8); Point p[] = {p1, p2, p1, p3, p4, p3} HashSet<Point> ens = new HashSet<Point>(); for (int i = 0; i<p.length; i++) { System.out.println("Le Point ") ; p[i].affiche(); boolean ajoute = ens.add(p[i]); if (ajoute) System.out.println(" a t ajout"); else System.out.println("est dj prsent"); System.out.print("Ensemble = "); affiche(ens); } } } public static void affiche(HashSet ens) { Iterator iter = ens.iterator(); while(iter.hasNext()) { Point p = iter.next(); p.affiche(); } System.out.println(); }
www.serli.com
www.serli.com