Vous êtes sur la page 1sur 216

Programmation Orientée Objet application au langage

Java

Version Août 2009

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Licence

Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
keulkeul.blogspot.com

http://creativecommons.org/licenses/by-sa/2.0/fr

Cours Java - M. Baron - Page 2


Rapide historique concernant la POO

h La POO a une « longue » histoire


h POO ? : Programmation Orientée Objet

h Début en Norvège à la fin des années 60

h Simula, programmation des simulations par événements discrets

h Programmation structurée pas adaptée

h Dans les années 70


h Développement par Xérox du premier système Fenêtres, Icônes
keulkeul.blogspot.com

et Souris

h SmallTalk, « archétype » des langages objets

h Développement par Apple des premiers Mac


Cours Java - M. Baron - Page 3
Rapide historique concernant la POO

h Au cours des années 80


h Développement des ordinateurs personnels

h Intérêt pour les interfaces graphiques

h Apparition de nouveaux langages

h Eiffel, fortement typé, entièrement OO

h C++, extension de C, pas totalement OO

h Object Pascal (Delphi) développé par Borland


keulkeul.blogspot.com

h Dans les années 90, vers une maturité des concepts objets
h Standardisation de C++

h Apparition de langages comme Java ou Python


Cours Java - M. Baron - Page 4
Programmation Structurée VS POO

h Objectifs de la POO
h Facilité la réutilisation de code, encapsulation et abstraction
h Facilité de l’évolution du code
h Améliorer la conception et la maintenance des grands systèmes
h Programmation par « composants ». Conception d’un logiciel à la
manière de la fabrication d’une voiture

h Programmation Structurée
h Unité logique : le module
keulkeul.blogspot.com

h Une zone pour les variables


h Une zone pour les fonctions
h Chaque fonction résout une partie du problème
h Structuration « descendante » du programmeCours Java - M. Baron - Page 5
Principes POO : programmation par objets

h Unité logique : l’objet

h Objet est défini par maVoiture


h un état - couleur = bleue
h un comportement - vitesse = 100
h une identité

h État : représenté par des attributs (variables) qui stockent


des valeurs

h Comportement : défini par des méthodes (procédures) qui


keulkeul.blogspot.com

modifient des états

h Identité : permet de distinguer un objet d’un autre objet


Cours Java - M. Baron - Page 6
Principes POO

h Les objets communiquent entre eux par des messages

h Un objet peut recevoir un message qui déclenche


h une méthode qui modifie son état

et / ou

h une méthode qui envoie un message à un autre objet

demarre
keulkeul.blogspot.com

ma voiture le moteur

Cours Java - M. Baron - Page 7


Principes POO : notion de classe

h Les objets qui ont les mêmes états et les mêmes comporte-
ments sont regroupés : c’est une classe
h Les classes servent de « moules » pour la création des objets
Un objet est une instance d’une classe
h Un programme OO est constitué de classes qui permettent
de créer des objets qui s’envoient des messages
Voiture
Nom de la classe
- puissance : entier

Attributs - estDemarree : booléen


keulkeul.blogspot.com

- vitesse : réel
+ deQuellePuissance() : entier
Méthodes
- Sélecteur + demarre()

- Modificateurs + accélère (réel)

Visibilité Cours Java - M. Baron - Page 8


Principes POO

h L’ensemble des interactions entre les objets défini un


algorithme

h Les relations entre les classes reflètent la décomposition


du programme

Voiture Moteur
keulkeul.blogspot.com

Cours Java - M. Baron - Page 9


Déroulement du cours

h Structuration du cours
h Présentation des concepts
h Illustration avec de nombreux exemples
h Des bulles d’aide tout au long du cours :

Ceci est une alerte Ceci est une astuce

h Mise en place du cours


h Cours de Francis Jambon (ancien MdC à l’Université de Poitiers)
h Livre : Programmer en Java 2ème édition – Claude Delannoy - Eyrolles
h Internet : www.developpez.com
keulkeul.blogspot.com

h Remerciements pour les relectures


h Laurent Guittet, ENSMA, Futuroscope de Poitiers
h Developpez.com : Jérémie Habasque, Néo Kimz
Cours Java - M. Baron - Page 10
Organisation ...

h Partie 1 : Introduction au langage JAVA

h Partie 2 : Bases du langage

h Partie 3 : Classes et objets

Disponible également en version


h Partie 4 : Héritage espagnole à l’adresse :
mbaron.developpez.com/javase/java

h Partie 5 : Héritage et polymorphisme


keulkeul.blogspot.com

h Partie 7 : Les indispensables : package,collections

et exception Cours Java - M. Baron - Page 11


Programmation Orientée Objet application au langage
Java

Introduction au langage Java

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Rapide historique de Java

h Origine
h Créé par Sun Microsystems
h Cible : les systèmes embarqués (véhicules, électroménager, etc)
utilisant des langages dédiés incompatibles entre eux
h Dates clés
h 1991 : Introduction du langage « Oak » par James Gosling
h 1993 : Montée en puissance du Web grâce à Mosaic (l’idée d’adapter
Java au Web fait son chemin)
h 1995 : Réalisation du logiciel HotJava en Java permettant d’exécuter
des applets
keulkeul.blogspot.com

h 1996 : NetscapeTM Navigator 2 incorpore une machine virtuelle


Java 1.0 en version « beta »
h 1997 : Un premier pas vers une version industrielle Java 1.1
h 1999 : Version industrielle de Java Cours Java - M. Baron - Page 13
Sun voit Java comme ...

h Références
h WikiPedia : fr.wikipedia.org/wiki/java_%28technologie%29
h White papers : java.sun.com/docs/white/index.html

h Sun définit le langage Java comme

h Simple h Sûr

h Orienté objet h Portable

h Réparti h Performant
keulkeul.blogspot.com

h Interprété h Multitâches

h Robuste h Dynamique ...


Cours Java - M. Baron - Page 14
Principe de fonctionnement de Java

h Source Java
h Fichier utilisé lors de la phase de programmation
h Le seul fichier réellement intelligible par le programmeur!

h Byte-Code Java
h Code objet destiné à être exécuté sur toute « Machine Virtuelle »
Java
h Provient de la compilation du code source

h Machine Virtuelle Java


h Programme interprétant le Byte-Code Java et fonctionnant sur un
keulkeul.blogspot.com

système d’exploitation particulier


h Conclusion : il suffit de disposer d’une « Machine Virtuelle » Java
pour pouvoir exécuter tout programme Java même s ’il a été
compilé avec un autre système d’exploitation Cours Java - M. Baron - Page 15
Machines Virtuelles Java ...

h Navigateurs Web, Stations de travail, Network Computers

h WebPhones

h Téléphones portables

h Cartes à puces

h ...
keulkeul.blogspot.com

Cours Java - M. Baron - Page 16


Principales étapes d’un développement

h Création du code source


Codes Sources
h A partir des spécifications (par exemple en UML)
MonProgramme.java
h Outil : éditeur de texte, IDE

h Compilation en Byte-Code javac

h A partir du code source


h Outil : compilateur Java
Byte Code
h Diffusion sur l’architecture cible
MonProgramme.class
h Transfert du Byte-Code seul
java
h Outils : réseau, disque, etc
keulkeul.blogspot.com

h Exécution sur la machine cible


h Exécution du Byte-Code MonProgramme
h Outil : Machine Virtuelle Java
Cours Java - M. Baron - Page 17
Java et ses versions ...

h Différentes versions de la machine virtuelle


h Java 2 Micro Edition (Java ME) qui cible les terminaux portables
h Java 2 Standard Edition (Java SE) qui vise les postes clients
h Java 2 Enterprise Edition (Java EE) qui définit le cadre d’un serveur
d’application Dans la suite du cours, on va
s’intéresser principalement aux
h Différentes finalités API fournies par Java SE
h SDK (Software Development Kit) fournit un compilateur et une
machine virtuelle
h JRE (Java Runtime Environment) fournit uniquement une machine
keulkeul.blogspot.com

virtuelle. Idéal pour le déploiement de vos applications.

h Version actuelle de Java


h Actuellement « Java SE 6.0 » ou encore appelée « JDK 5.0 »
h Bientôt Java SE 7.0 (nom de code Dolphin) Cours Java - M. Baron - Page 18
Les outils ...

h Simples éditeurs ou environnements de développement


h Eclipse
h NetBeans
h JBuilder
h IntelliJ
h…
h Les ressources sur Java
h Site de Java chez Sun : java.sun.com
keulkeul.blogspot.com

h API (référence) : java.sun.com/j2se/1.5.0


h Tutorial de Sun : java.sun.com/doc/bookstutorial
h Cours et exemples : java.developpez.com
h Forum : fr.comp.lang.java Cours Java - M. Baron - Page 19
L’API de Java

Packages

Description
Attributs
Méthodes
Classes
keulkeul.blogspot.com

Cours Java - M. Baron - Page 20


Ouvrages d’initiation

h Programmer en Java (2ème édition)


h Auteur : Claude Delannoy
h Éditeur : Eyrolles
h Edition : 2002 - 661 pages - ISBN : 2212111193

h Java en action
h Auteur : Ian F. Darwin
h Éditeur : O’Reilly
h Edition : 2002 - 836 pages - ISBN : 2841772039

h Apprendre Java et C++ en parallèle


keulkeul.blogspot.com

h Auteur : Jean-Bernard Boichat


h Éditeur : Eyrolles
h Edition : 2003 - 742 pages - ISBN : 2212113277
Cours Java - M. Baron - Page 21
Ouvrages de référence

h Ouvrages thématiques aux éditions O’Reilly sur une sélection


des Packages Java (certains traduits en Français)

h Ouvrages de référence de SUN aux éditions Paperback


(en anglais uniquement)
keulkeul.blogspot.com

Cours Java - M. Baron - Page 22


Programmation Orientée Objet application au langage
Java

Bases du langage

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Premier exemple de programme en Java

public class PremierProg {

public static void main (String[] argv) {


System.out.println("Ola, mon Premier Programme");
}
}

h public class PremierProg


h Nom de la classe

h public static void main


h La fonction principale équivalent à la fonction main du C/C++

h String[] argv
keulkeul.blogspot.com

h Permet de récupérer des arguments transmis au programme au


moment de son lancement
h System.out.println("Ola … ")
h Méthode d'affichage dans la fenêtre console Cours Java - M. Baron - Page 24
Mise en œuvre

h Pas de séparation entre définition et codage des opérations


h Un seul fichier « NomDeClasse.java »

h Pas de fichier d’en tête comme C/C++

h Compilation Nom de la classe = Nom du fichier java

h javac NomDeClasse.java ou javac *.java quand plusieurs classes

h Génération d’un fichier Byte-Code « NomDeClasse.class »

h Pas d’édition de liens (seulement une vérification)


keulkeul.blogspot.com

h Exécution Ne pas mettre l’extension .class


pour l’exécution
h java NomDeClasse

h Choisir la classe principale à exécuter


Cours Java - M. Baron - Page 25
Types primitifs de Java

h Ne sont pas des objets !!!


h Occupent une place fixe en mémoire réservée à la déclaration
h Types primitifs
h Entiers : byte (1 octet) - short (2 octets) - int (4 octets) - long
(8 octets)
h Flottants (norme IEEE-754) : float (4 octets) - double (8 octets)
h Booléens : boolean (true ou false)
h Caractères : char (codage Unicode sur 16 bits)
h Chacun des types simples possède un alter-ego objet
disposant de méthodes de conversion (à voir dans la partie
keulkeul.blogspot.com

Classes et Objets)
h L’autoboxing introduit depuis la version 5.0 convertit de
manière transparente les types primitifs
en références Cours Java - M. Baron - Page 26
Initialisation et constantes

h Initialisation
h Une variable peut recevoir une valeur au moment de sa déclaration :
Penser à l’initialisation
int n = 15;
boolean b = true;
au risque d’une erreur de
h Cette instruction joue le même rôle : compilation
int n;
int n; System.out.println(" n = " + n);
n = 15;
boolean b;
b = true;

h Constantes
h Ce sont des variables dont la valeur ne peut affectée qu'une fois
keulkeul.blogspot.com

h Elles ne peuvent plus être modifiées


h Elles sont définies avec le mot clé final
final int n = 5;
final int t;
...
t = 8;
n = 10; // erreur : n est déclaré final Cours Java - M. Baron - Page 27
Structure de contrôle

h Choix
Il n’y a pas de mot-
h Si alors sinon : « if condition {…} else {…} » clé « then » dans la
structure Choix
h Itérations
h Boucle : « for (initialisation ; condition ; modification) { … } »

h Boucle (for each) : « for (Type var : Collection) { … } »

h Tant que : « while (condition) { … } »


Nouveauté Java 5
h Faire jusqu’à : « do { … } while (condition) »

h Sélection bornée
keulkeul.blogspot.com

h Selon faire : « switch ident { case valeur0 : … case valeur1 : …


default: …} » Penser à vérifier si break est
nécessaire dans chaque case
h Le mot clé break demande à sortir du bloc Cours Java - M. Baron - Page 28
Structure de contrôle

h Exemple : structure de contrôle


h Faisons varier n
public class SwitchBreak {

public static void main (String[] argv) { Valeur de n : 0


int n = ...; nul
System.out.println("Valeur de n :" + n); Adios...
switch(n) {
case 0 : System.out.println("nul");
Valeur de n : 1
break; petit
case 1 :
moyen
case 2 : System.out.println("petit");
Adios...
case 3 :
case 4 :
case 5 : System.out.println("moyen"); Valeur de n : 6
break; grand
default : System.out.println("grand"); Adios...
keulkeul.blogspot.com

}
System.out.println("Adios...");
}
}
Se demander si
break est nécessaire

Cours Java - M. Baron - Page 29


Opérateurs sur les types primitifs

h Opérateurs arithmétiques
h Unaires : « +a, -b »
h Binaires : « a+b, a-b, a*b, a%b »
h Incrémentation et décrémentation : « a++, b-- »
h Affectation élargie : « +=, -=, *=, /= »

h Opérateurs comparaisons Attention : erreur


h « a==b, a!=b, a>b, a<b, a>=b, a<=b » boolean t = true;
if (t == true) {...}

h Opérateurs logiques Préférer :


boolean t = true;
h Et : « a && b », « a & b »
keulkeul.blogspot.com

if (t) {...}

h Ou : « a || b », « a | b »

h Conversion de type explicite (cast)


h « (NouveauType)variable »
Cours Java - M. Baron - Page 30
Opérateurs sur les types primitifs

h Exemple : simulation du Loto


h Pas optimisé mais montre l’utilisation des concepts précédents
public class ExempleTypesPrimitifs {

public static void main (String[] argv) {


int compteur = 0;
A voir plus tard…
while(compteur != 100) {
// Prend un nombre aléatoire
double nbreAleatoir = Math.random() * 1000;

// Etablie un index de 0 à 10
int index = compteur % 10;

// Construction de l’affichage
System.out.println("Index:" + index +
keulkeul.blogspot.com

"Nbre Aléatoir:" + (int)nbreAleatoir);

// Incrémentation de la boucle
compteur+= 1;
}
}
}

Cours Java - M. Baron - Page 31


Affectation, recopie et comparaison

h Affecter et recopier un type primitif


h « a=b » signifie a prend la valeur de b

h a et b sont distincts

h Toute modification de a n’entraîne pas celle de b

h Comparer un type primitif


h « a == b » retourne « true » si les valeurs de a et b sont identiques

a b a b
keulkeul.blogspot.com

1 2 a=b 2 2

Cours Java - M. Baron - Page 32


Les tableaux en Java

h Les tableaux sont considérés comme des objets

h Fournissent des collections ordonnées d’éléments

h Les éléments d’un tableau peuvent être

h Des variables d’un type primitif (int, boolean, double, char, …)

h Des références sur des objets (à voir dans la partie Classes et Objets)

h Création d’un tableau


keulkeul.blogspot.com

1 Déclaration = déterminer le type du tableau

2 Dimensionnement = déterminer la taille du tableau

3 Initialisation = initialiser chaque case du tableau


Cours Java - M. Baron - Page 33
Les tableaux en Java : Déclaration

1 Déclaration
h La déclaration précise simplement le type des éléments du tableau

int[] monTableau; monTableau null

h Peut s’écrire également

int monTableau[];

Attention : une déclaration de tableau ne doit


keulkeul.blogspot.com

pas préciser de dimensions


int monTableau[5]; // Erreur

Cours Java - M. Baron - Page 34


Les tableaux en Java : Dimensionnement

2 Dimensionnement
h Le nombre d’éléments du tableau sera déterminé quand l’objet
tableau sera effectivement créé en utilisant le mot clé new
h La taille déterminée à la création du tableau est fixe, elle ne pourra
plus être modifiée par la suite
h Longueur d’un tableau : « monTableau.length »

int[] monTableau; // Déclaration


monTableau = new int[3]; // Dimensionnement

h La création d’un tableau par new


h Alloue la mémoire en fonction du type de tableau et de la taille
keulkeul.blogspot.com

h Initialise le contenu du tableau à 0 pour les types simples

monTableau 0 0 0
Cours Java - M. Baron - Page 35
Les tableaux en Java : Initialisation

3 Initialisation
h comme en C/C++ les indices commencent à zéro
h l’accès à un élément d’un tableau s’effectue suivant cette forme

monTab[varInt]; // varInt >= 0 et <monTab.length

h Java vérifie automatiquement l’indice lors de l’accès (exception levée)


monTab[0] = 1; monTableau 1 0 0
monTab[1] = 2; monTableau 1 2 0
monTab[2] = 3; monTableau 1 2 3
h Autre méthode : en donnant explicitement la liste de ses éléments
keulkeul.blogspot.com

entre {…}
int[] monTab = {1, 2, 3}
h est équivalent à
monTab = new int[3];
Cours Java - M. Baron - Page 36
monTab[0] = 1; monTab[1] = 2; monTab[2] = 3;
Les tableaux en Java : Synthèse

1 Déclaration
int[] monTableau;

2 Dimensionnement Ou 12 et 3
monTableau = new int[3]; int[] monTab = {1, 2,
3};
3 Initialisation
monTableau[0] = 1;
monTableau[1] = 2;
monTableau[2] = 3;
keulkeul.blogspot.com

for (int i = 0; i < monTableau.length; i++) {


System.out.println(monTableau[i]);
}

for (int current : monTableau) { Même chose avec


System.out.println(curent); l’utilisation du for each
}
Cours Java - M. Baron - Page 37
Les tableaux en Java : Multidimensionnels

h Tableaux dont les éléments sont eux mêmes des tableaux


h Déclaration
type[][] monTableau; tab null
h Tableaux rectangulaires
h Dimensionnement :
tab . . .
monTableau = new type[2][3]
. . .
h Tableaux non-rectangulaires
h Dimensionnement :
tab null
keulkeul.blogspot.com

monTableau = new type[2]


null
monTableau[0] = new type[2]
monTableau[1] = new type[3]
tab . .
. . .
Cours Java - M. Baron - Page 38
Petite précision du « System.out.println(…) »

h Usages : affichage à l’écran


h « System.out.println(…) » : revient à la ligne
h « System.out.print(…) » : ne revient pas à la ligne

h Différentes sorties possibles


h « out » sortie standard
h « err » sortie en cas d’erreur (non temporisée)

h Tout ce que l’on peut afficher…


h Objets, nombres, booléens, caractères, …
keulkeul.blogspot.com

h Tout ce que l ’on peut faire …


h Concaténation sauvage entre types et objets avec le « + »
System.out.println("a=" + a + "donc a < 0 est " + a < 0);

Cours Java - M. Baron - Page 39


Commentaires et mise en forme

h Documentation des codes sources


h Utilisation des commentaires
// Commentaire sur une ligne complète
int b = 34; // Commentaire après du code

/* Le début du commentaire
** Je peux continuer à écrire …
Jusqu’à ce que le compilateur trouve cela */

h Utilisation de l’outil Javadoc (à voir dans la partie les Indispensables)


h Mise en forme if (b == 3) {
if (cv == 5) {
if (b == 3) {
if (cv == 5) {
if (q) { if (q) {
h Facilite la relecture ... ...
keulkeul.blogspot.com

} else { } else {...}


... ...
h Crédibilité assurée !!!! } }
... ...
h Indentation à chaque
} }
...
} Éviter
niveau de bloc
Préférer Cours Java - M. Baron - Page 40
Programmation Orientée Objet application au langage
Java

Classes et Objets

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Classe et définition

h Une classe est constituée


h Données ce qu'on appelle des attributs

h Procédures et/ou des fonctions ce qu'on appelle des méthodes

h Une classe est un modèle de définition pour des objets


h Ayant même structure (même ensemble d'attributs)

h Ayant même comportement (même méthodes)

h Ayant une sémantique commune

h Les objets sont des représentations dynamiques, du modèle


keulkeul.blogspot.com

défini pour eux au travers de la classe (instanciation)


h Une classe permet d'instancier (créer) plusieurs objets

h Chaque objet est instance d'une classe et une seule


Cours Java - M. Baron - Page 42
Classe et notation UML

Voiture
Nom de la classe
- puissance : entier
Attributs - estDemarree : booléen

- vitesse : réel
+ deQuellePuissance(): entier
Méthodes
- Sélecteur + demarre()
keulkeul.blogspot.com

- Modificateurs
+ accélère (réel)

Visibilité
Cours Java - M. Baron - Page 43
Codage de la classe « Voiture »
Nom de la classe
public class Voiture {

private int puissance;


private boolean estDemarree;
Attributs private double vitesse;

public int deQuellePuissance() {


return puissance;
}

Sélecteur public void demarre() {


estDemarree = true;
}

public void accelere(double v) {


keulkeul.blogspot.com

if (estDemarree) {
Modificateurs }
vitesse = vitesse + v

}
}

Cours Java - M. Baron - Page 44


Classe et visibilité des attributs

h Caractéristique d’un attribut


h Variables « globales » de la classe
h Accessibles dans toutes les méthodes de la classe
public class Voiture {

private int puissance;


private boolean estDemarree;
private double vitesse;
Attributs visibles
public int deQuellePuissance() { dans les méthodes
return puissance;
}

public void demarre() {


estDemarree = true;
keulkeul.blogspot.com

public void accelere(double v) {


if (estDemarree) {
vitesse = vitesse + v
}
}
}
Cours Java - M. Baron - Page 45
Distinction entre attributs et variables

h Caractéristique d’une variable


h Visible à l’intérieur du bloc qui le définit
public class Voiture {

private int puissance;


private boolean estDemarree;
private double vitesse; Variable visible uniquement
public int deQuellePuissance() { dans cette méthode
return puissance;
}

public void demarre() {


estDemarree = true; Variable peut être définie
} n’importe où dans un bloc
public void accelere(double v) {
keulkeul.blogspot.com

if (estDemarree) {
double avecTolerance;
avecTolerance = v + 25;
vitesse = vitesse + avecTolerance
}
}
}
Cours Java - M. Baron - Page 46
Conventions en Java : de la rigueur et de la classe …

h Conventions de noms
h CeciEstUneClasse
h celaEstUneMethode(…)
h jeSuisUneVariable
h JE_SUIS_UNE_CONSTANTE

h Un fichier par classe, une classe par fichier


h Classe « Voiture » décrite dans le fichier Voiture.java
h Il peut exceptionnellement y avoir plusieurs classes par fichier
keulkeul.blogspot.com

(cas des Inner classes)

Respecter les minuscules et


les majuscules des noms
Cours Java - M. Baron - Page 47
Objet et définition

h Un objet est instance d’une seule classe

h Se conforme à la description que celle-ci fournit

h Admet une valeur propre à l’objet pour chaque attribut déclaré dans
la classe

h Les valeurs des attributs caractérisent l’état de l’objet

h Possibilité de lui appliquer toute opération (méthode) définie dans la


classe
keulkeul.blogspot.com

h Tout objet est manipulé et identifié par sa référence


h Utilisation de pointeur caché (plus accessible que le C++)

h On parle indifféremment d’instance, de référence ou d’objet


Cours Java - M. Baron - Page 48
Objet et notation UML

h maClio est une instance de la classe Voiture

Représentation Voiture
explicite de la classe
Relation d’instanciation
« instance of »

Nom de l’objet, référence


ou de l’instance

maClio
- puissance = 4 Valeurs des
keulkeul.blogspot.com

attributs qui
- estDemarrée = true caractérisent
l’état de l’objet
- vitesse = 179.8 maClio

Cours Java - M. Baron - Page 49


États des objets

h Chaque objet qui est une instance de la classe Voiture


possède ses propres valeurs d’attributs

Voiture

« instance of »

ladaBerline110 maClio 205Gti


keulkeul.blogspot.com

- puissance = 6 - puissance = 4 - puissance = 6

- estDemarree = false - estDemarree = true - estDemarree = true

- vitesse = 0 - vitesse = 179.8 - vitesse = 250

Cours Java - M. Baron - Page 50


Affectation et comparaison

h Affecter un objet
h « a = b » signifie a devient identique à b
h Les deux objets a et b sont identiques et toute modification de a
entraîne celle de b

h Comparer deux objets


h « a == b » retourne « true » si les deux objets sont identiques
h C’est-à-dire si les références sont les mêmes, cela ne compare pas
les attributs
a b a b
keulkeul.blogspot.com

a=b

∑ ∏ ∏
Cours Java - M. Baron - Page 51
Affectation et comparaison

h L’objet maClio et saClio ont les mêmes attributs (états


identiques) mais ont des références différentes
h maClio != saClio
Voiture
Le test de comparaison
(== et !=) entre objets
ne concerne que les
référence et non les « instance of »
attributs!!!!

saClio maClio
keulkeul.blogspot.com

- puissance = 4 - puissance = 4

- estDemarree = true - estDemarree = true

- vitesse = 179.8 - vitesse = 179.8

Cours Java - M. Baron - Page 52


Affectation et comparaison

h Recopier les attributs d’un objet « clone() »


h Les deux objets a et b sont distincts
h Toute modification de a n’entraîne pas celle de b
a b a b
recopie

∑ ∏ ∏ ∏

h Comparer le contenu des objets : « equals(Object o) »


h Renvoyer « true » si les objets a et b peuvent être considérés
keulkeul.blogspot.com

comme identique au vu de leurs attributs

Recopie et comparaison dans


les parties suivantes
Cours Java - M. Baron - Page 53
Structure des objets

h Un objet est constitué d’une partie « statique » et d’une


partie « dynamique »

h Partie « statique »
h Ne varie pas d’une instance de classe à une autre

h Permet d’activer l’objet

h Constituée des méthodes de la classe

h Partie « dynamique »
keulkeul.blogspot.com

h Varie d’une instance de classe à une autre

h Varie durant la vie d’un objet

h Constituée d’un exemplaire de chaque attribut de la classe


Cours Java - M. Baron - Page 54
Cycle de vie d’un objet

h Création
h Usage d’un Constructeur
h L’objet est créé en mémoire et les attributs de l’objet sont initialisés
h Utilisation
h Usage des Méthodes et des Attributs (non recommandé)
h Les attributs de l’objet peuvent être modifiés
h Les attributs (ou leurs dérivés) peuvent être consultés

L’utilisation d’un objet non


construit provoque une exception
de type NullPointerException
keulkeul.blogspot.com

h Destruction et libération de la mémoire lorsque


h Usage (éventuel) d’un Pseudo-Destructeur
h L’objet n’est plus référencé, la place mémoire occupée est récupérée
Cours Java - M. Baron - Page 55
Création d’objets : déroulement

h La création d’un objet à partir d’une classe est appelée une


instanciation

h L’objet créé est une instance de la classe monObjet

null
h Déclaration
h Définit le nom et le type de l ’objet
h Un objet seulement déclaré vaut « null » monObjet
(mot réservé du langage)

h Création et allocation de la mémoire


h Appelle de méthodes particulières : les constructeurs attribut 1
keulkeul.blogspot.com

h La création réserve la mémoire et initialise les attributs



attribut n
h Renvoi d’une référence sur l’objet maintenant créé
h monObjet != null
Cours Java - M. Baron - Page 56
Création d’objets : réalisation

h La création d’un nouvel objet est obtenue par l’appel à


new Constructeur(paramètres)
h Il existe un constructeur par défaut qui ne possède pas de paramètre
(si aucun autre constructeur avec paramètre n’existe)

Les constructeurs portent le


même nom que la classe

public class TestMaVoiture {

Déclaration public static void main (String[] argv) {

// Déclaration puis création


Voiture maVoiture;
keulkeul.blogspot.com

Création et maVoiture = new Voiture();


allocation
// Déclaration et création en une seule ligne
mémoire Voiture maSecondeVoiture = new Voiture();
}
}

Cours Java - M. Baron - Page 57


Création d’objets : réalisation

h Exemple : construction d’objets


public class TestMaVoiture {

public static void main (String[] argv) {

// Déclaration puis création


Voiture maVoiture;
maVoiture = new Voiture(); Déclaration
// Déclaration d’une deuxième voiture
Voiture maVoitureCopie;
// Attention!! pour l’instant maVoitureCopie vaut null

// Test sur les références.


Affectation par
if (maVoitureCopie == null) { référence
keulkeul.blogspot.com

// Création par affectation d’une autre référence


maVoitureCopie = maVoiture;
// maVoitureCopie possède la même référence que maVoiture
}
...
}}

Cours Java - M. Baron - Page 58


Le constructeur de « Voiture »

h Actuellement
h On a utilisé le constructeur par défaut sans paramètre

h On ne sait pas comment se construit la « Voiture »

h Les valeurs des attributs au départ sont indéfinies et identique pour


chaque objet (puissance, etc.) Les constructeurs portent le
même nom que la classe et n’ont
h Rôle du constructeur en Java pas de valeur de retour

h Effectuer certaines initialisations nécessaires pour le nouvel objet créé

h Toute classe Java possède au moins un constructeur


keulkeul.blogspot.com

h Si une classe ne définit pas explicitement de constructeur, un


constructeur par défaut sans arguments et qui n’effectue aucune
initialisation particulière est invoquée
Cours Java - M. Baron - Page 59
Le constructeur de « Voiture »

h Le constructeur de Voiture
h Initialise vitesse à zéro

h Initialise estDemaree à faux

h Initialise puissance à la valeur passée en paramètre du constructeur


public class Voiture {

private int puissance;

Constructeur private boolean estDemarree;

avec un private double vitesse;


paramètre
public Voiture(int p) {
keulkeul.blogspot.com

puissance = p;
estDemaree = false;
vitesse = 0;
}
...
}

Cours Java - M. Baron - Page 60


Construire une « Voiture » de 7 CV

h Création de la Voiture
h Déclaration de la variable maVoiture
h Création de l’objet avec la valeur 7 en paramètre du constructeur

public class TestMaVoiture {

public static void main(String[] argv) {


Déclaration
// Déclaration puis création
Voiture maVoiture;

maVoiture = new Voiture(7);

Création et Voiture maSecVoiture;


// Sous entendu qu’il existe
keulkeul.blogspot.com

allocation // explicitement un constructeur : Voiture(int)


mémoire
maSecVoiture = new Voiture(); // Erreur
avec Voiture(int) }
}

Cours Java - M. Baron - Page 61


Constructeur sans arguments

h Utilité
h Lorsque l’on doit créer un objet sans pouvoir décider des valeurs de
ses attributs au moment de la création
h Il remplace le constructeur par défaut qui est devenu inutilisable dès
qu’un constructeur (avec paramètres) a été défini dans la classe
public class Voiture {

private int puissance;


private boolean estDemarree; public class TestMaVoiture {
private double vitesse;
public static void main (String[] argv) {
public Voiture() {
puissance = 4; // Déclaration puis création
estDemaree = false; Voiture maVoiture;
keulkeul.blogspot.com

vitesse = 0; maVoiture = new Voiture(7);


} Voiture maSecVoiture;
public Voiture(int p) { maSecVoiture = new Voiture(); // OK
puissance = p; }
estDemaree = false; }
vitesse = 0;
}...
}
Cours Java - M. Baron - Page 62
Constructeurs multiples

h Intérêts
h Possibilité d’initialiser un objet de plusieurs manières différentes
h On parle alors de surchage (overloaded)
h Le compilateur distingue les constructeurs en fonction
h de la position des arguments
h du nombre
public class Voiture {
...
public Voiture() {
h du type puissance = 4; ...
}

public Voiture(int p) {
keulkeul.blogspot.com

puissance = p; ...
}
Chaque constructeur
possède le même nom public Voiture(int p, boolean estDemaree) {
...
(le nom de la classe) }
}

Cours Java - M. Baron - Page 63


Accès aux attributs

h Pour accéder aux données d’un objet on utilise une notation


pointée
identificationObjet.nomAttribut

public class TestMaVoiture {

public static void main (String[] argv) {

// Déclaration puis création


Voiture v1 = new Voiture();
Voiture v2 = new Voiture();

// Accès aux attributs en écriture


v1.puissance = 110;

// Accès aux attributs en lecture


keulkeul.blogspot.com

System.out.println("Puissance de v1 = " + v1.puissance);


}
}

Il n’est pas recommandé


d’accéder directement aux
attributs d’un objet
Cours Java - M. Baron - Page 64
Envoi de messages : appel de méthodes

h Pour « demander » à un objet d’effectuer un traitement il


faut lui envoyer un message

h Un message est composé de trois parties


h Une référence permettant de désigner l’objet à qui le message est
envoyé

h Le nom de la méthode ou de l’attribut à exécuter

h Les éventuels paramètres de la méthode

identificationObjet.nomDeMethode(« Paramètres éventuels »)


keulkeul.blogspot.com

h Envoi de message similaire à un appel de fonction


h Le code défini dans la méthode est exécuté

h Le contrôle est retourné au programme appelant


Cours Java - M. Baron - Page 65
Envoi de messages : appel de méthodes

Voiture
Ne pas oublier les - …
parenthèses pour les + deQuellePuissance() : entier
appels aux méthodes
+ demarre()
+ accélère (réel)
public class TestMaVoiture { + …
public static void main (String[] argv) {

// Déclaration puis création


Envoi d’un message à
Voiture maVoiture = new Voiture(); l’objet maVoiture
// La voiture démarre Appel d’un modificateur
maVoiture.demarre();

if (maVoiture.deQuellePuissance() == 4) {
keulkeul.blogspot.com

System.out.println("Pas très Rapide…"); Envoi d’un message à


l’objet maVoiture
}

// La voiture accélère
maVoiture.accélère(123.5);
Appel d’un sélecteur
}
}
Cours Java - M. Baron - Page 66
Envoi de messages : passage de paramètres

h Un paramètre d’une méthode peut être


h Une variable de type simple
h Une référence d’un objet typée par n’importe quelle classe

h En Java tout est passé par valeur


h Les paramètres effectifs d’une méthode
h La valeur de retour d’une méthode (si différente de void)

h Les types simples


h Leur valeur est recopiée
h Leur modification dans la méthode n’entraîne pas celle de l’original
keulkeul.blogspot.com

h Les objets
h Leur modification dans la méthode entraîne celle de l’original!!!
h Leur référence est recopiée et non pas les attributs
Cours Java - M. Baron - Page 67
Envoi de messages : passage de paramètres

h Exemple : passage de paramètres


public class TestMaVoiture {

public static void main (String[] argv) {

// Déclaration puis création 1


Voiture maVoiture = new Voiture();

// Déclaration puis création 2


Voiture maSecondeVoiture = new Voiture();
Référence comme
// Appel de la méthode compare(voiture) qui paramètre
// retourne le nombre de différence
int p = maVoiture.compare(maSecondeVoiture);

System.out.println("Nbre différence :" + p);


}
Voiture
keulkeul.blogspot.com

}
- …
+ accélère (réel)
Appel d’un sélecteur avec
+ compare (Voiture) : entier
passage d’une référence
+ …
Cours Java - M. Baron - Page 68
L’objet « courant »

h L’objet « courant » est désigné par le mot clé this


h Permet de désigner l’objet dans lequel on se trouve
h self ou current dans d’autres langages
h Désigne une référence particulière qui est un membre caché

Ne pas tenter d’affecter une


nouvelle valeur à this !!!!
this = ... ; // Ne pas y penser

h Utilité de l’objet « courant »


keulkeul.blogspot.com

h Rendre explicite l’accès aux propres attributs et méthodes définies


dans la classe
h Passer en paramètre d’une méthode la référence de l’objet courant
Cours Java - M. Baron - Page 69
L’objet « courant » : attributs et méthodes

h Désigne des variables ou méthodes définies dans une classe


public class Voiture {

...
private boolean estDemarree;
private double vitesse;

public int deQuellePuissance() {


...
}

public void accelere(double vitesse) { Désigne la variable


if (estDemarree) { vitesse
this.vitesse = this.vitesse + vitesse;
}
}
}
keulkeul.blogspot.com

this n’est pas nécessaire


Désigne l’attribut lorsque les identificateurs de
vitesse variables ne présentent
Désigne l’attribut aucun équivoque
demarree
Cours Java - M. Baron - Page 70
Le retour d’UML…

h Association : les objets sont sémantiquement liés


h Exemple : une Voiture est conduite par un Conducteur

h Agrégation : cycle de vie indépendant


Les losanges sont
h Exemple : une Voiture et une Galerie attachés à la classe
qui contient
h Composition : cycle de vie identiques
h Exemple : voiture possède un moteur qui dure la vie de la voiture
Association
Composition
0..1 0..1
Voiture Conducteur
keulkeul.blogspot.com

Agrégation
4..5 1 0..1

Roue Moteur Galerie


Cours Java - M. Baron - Page 71
Codage de l'association : composition

h L'objet de classe Voiture peut envoyer des messages à


l'objet de classe Moteur : Solution 1
Attribut qui stocke la
référence du moteur
Voiture
public class Voiture {

private Moteur leMoteur;


...

public Voiture(int p) {
leMoteur = new Moteur(p);
1
...
Moteur }
...
keulkeul.blogspot.com

A discuter : si le moteur }

d’une voiture est « mort »,


il y a la possibilité de le Création de l'objet
changer Moteur

Cours Java - M. Baron - Page 72


Codage de l'association : composition

h 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;
1 ...
}
Moteur ...
keulkeul.blogspot.com

La puissance est donnée


lors de la construction

Cours Java - M. Baron - Page 73


Codage de l'association : composition

h Il peut être nécessaire que les deux objets en composition


s'échangent des messages : Solution 2
h L’objet Voiture « voit » l’objet Moteur Attribut qui stocke la
référence du Moteur

public class Voiture {


Voiture
private Moteur leMoteur;
...

public Voiture(int p) {
leMoteur = new Moteur(p,this);
...
}
1
...
keulkeul.blogspot.com

}
Moteur
Transmission de la
Création de
référence de l’objet
l’objet Moteur
courant
Cours Java - M. Baron - Page 74
Codage de l'association : composition

h Il peut être nécessaire que les deux objets en composition


s'échangent des messages : Solution 2
h L’objet Moteur « voit » l’objet Voiture
Attribut qui stocke la
puissance
public class Moteur {

Voiture private int puissance;


private Voiture laVoiture;
...

public Moteur(int p, Voiture v) {


puissance = p;
laVoiture = v;
...
keulkeul.blogspot.com

}
1
...
Moteur }

La puissance est Référence d’un objet


donnée lors de la Voiture en paramètre
construction Cours Java - M. Baron - Page 75
Codage de l’association : agrégation

h L'objet de classe Galerie n’envoie pas de message à l’objet


de classe Voiture
Attribut qui stocke une
référence de Galerie

public class Voiture {


Voiture
private Galerie laGalerie;
...

public Voiture(Galerie g) {
laGalerie = g;
...
}
0..1 ...
keulkeul.blogspot.com

Galerie }

Un objet Galerie est transmis


au moment de la
construction de Voiture
Cours Java - M. Baron - Page 76
Destruction et ramasse-miettes

h La destruction des objets se fait de manière implicite


h Le ramasse-miettes ou Garbage Collector se met en route
h Automatiquement
Préférer définir une
h Si plus aucune variable ne référence l’objet méthode et de
l’invoquer avant que
h Si le bloc dans lequel il est défini se termine tout objet ne soit
h Si l’objet a été affecté à « null » plus référencé :
detruit()
h Manuellement :
h Sur demande explicite par l’instruction « System.gc() »

h Un pseudo-destructeur « protected void finalize() » peut être


keulkeul.blogspot.com

défini explicitement par le programmeur


h Il est appelé juste avant la libération de la mémoire par la machine
virtuelle, mais on ne sait pas quand
h Conclusion : pas très sûr!!!!
Cours Java - M. Baron - Page 77
Destruction et ramasse-miettes

public class Voiture {

private boolean estDemarree; Pour être sûr que finalize


...
s'exécute il faut absolument
protected void finalize() { appeler explicitement
estDemarree = false; System.gc()
System.out.println("Moteur arrêté");
}
... public class TestMaVoiture {
}
public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture();
Force le programme à maVoiture.demarre();
se terminer // maVoiture ne sert plus à rien
maVoiture = null;

// Appel explicite du garbage collector


keulkeul.blogspot.com

System.gc();

// Fin du programme
System.exit(0);
System.out.println("Message non visible");
}
}
Cours Java - M. Baron - Page 78
Gestion des objets

h Afficher son type et sa place mémoire : System.out.println()

System.out.println(maVoiture) // Voiture@119c082

h Récupérer son type : méthode « Class getClass() »

maVoiture.getClass(); // Retourne un objet de type Class


Class classVoiture = maVoiture.getClass(); // Class est une classe!!!

h Tester son type : opérateur « instanceof » mot clé « class »


keulkeul.blogspot.com

if (maVoiture instanceof Voiture) {...} // C’est vrai

ou
if (maVoiture.getClass() == Voiture.class) {...} // C ’est vrai
// également

Cours Java - M. Baron - Page 79


Surcharge

h La surcharge overloading n’est pas limitée aux constructeurs,


elle est possible également pour n’importe quelle méthode

h Possibilité de définir des méthodes possédant le même nom


mais dont les arguments diffèrent

h Quand une méthode surchargée est invoquée le compilateur


sélectionne automatiquement la méthode dont le nombre est
le type des arguments correspondent au nombre et au type
keulkeul.blogspot.com

des paramètres passés dans l’appel de la méthode


Des méthodes surchargées peuvent avoir
des types de retour différents à condition
qu’elles aient des arguments différents
Cours Java - M. Baron - Page 80
Surcharge

h Exemple : une voiture surchargée


public class Voiture {
private double vitesse;
...

public void accelere(double vitesse) {


if (estDemarree) {
this.vitesse = this.vitesse + vitesse;
}
}
public void accelere(int vitesse) {
if (estDemaree) {
this.vitesse = this.vitesse +
(double)vitesse; public class TestMaVoiture {
}
}
public static void main (String[] argv) {
...} // Déclaration puis création de maVoiture
keulkeul.blogspot.com

Voiture maVoiture = new Voiture();

// Accélération 1 avec un double


maVoiture.accelere(123.5);
// Accélération 2 avec un entier
maVoiture.accelere(124);
}}

Cours Java - M. Baron - Page 81


Constructeurs multiples : le retour

h Appel explicite d’un constructeur de la classe à l’intérieur


d’un autre constructeur
h Doit se faire comme première instruction du constructeur
h Utilise le mot-clé this(paramètres effectifs)
public class Voiture {
...
h Exemple public Voiture() {
this(7, new Galerie());
h Implantation du constructeur }

sans paramètre de Voiture


public Voiture(int p) {
this(p, new Galerie());
}
à partir du constructeur avec
keulkeul.blogspot.com

public Voiture(int p, Galerie g) {


paramètres puissance = p;
moteur = new Moteur(puissance);
galerie = g;
...
}
...

Cours Java - M. Baron - Page 82


Encapsulation

h Possibilité d’accéder aux attributs d’une classe Java mais


pas recommandé car contraire au principe d’encapsulation
h Les données (attributs) doivent être protégés et accessibles pour
l’extérieur par des sélecteurs

h Possibilité d’agir sur la visibilité des membres (attributs et


méthodes) d’une classe vis à vis des autres classes
h Plusieurs niveaux de visibilité peuvent être définis en
précédant d’un modificateur la déclaration d’un attribut,
méthode ou constructeur
keulkeul.blogspot.com

h private
h public A revoir dans la
partie suivante
h protected
Cours Java - M. Baron - Page 83
Encapsulation : visibilité des membres d’une classe

+ public - private

Utilisable uniquement par les classes


La classe peut être utilisée définies à l’intérieur d’une autre
classe par n’importe quelle classe.
classe Une classe privée n’est utilisable que
par sa classe englobante

Attribut accessible partout où


attribut sa classe est accessible. N’est Attribut restreint à la classe
pas recommandé du point de où est faite la déclaration
vue encapsulation
keulkeul.blogspot.com

Méthode accessible partout Méthode accessible à


méthode l’intérieur de la définition de
où sa classe est accessible.
la classe

Cours Java - M. Baron - Page 84


Encapsulation

h Exemple : encapsulation
public class Voiture {

private int puissance;


Une méthode privée ne peut plus
... être invoquée en dehors du code
de la classe où elle est définie
public void demarre() {
...
}

private void makeCombustion() {


...
} public class TestMaVoiture {
}
public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture();
keulkeul.blogspot.com

// Démarrage de maVoiture
maVoiture.demarre();

maVoiture.makeCombustion(); // Erreur
}
}

Cours Java - M. Baron - Page 85


Les chaînes de caractères « String »

h Ce sont des objets traités comme des types simples ...

h Initialisation
String maChaine = "Bonjour!"; // Cela ressemble à un type simple

h Longueur
maChaine.length(); // Avec les parenthèses car c'est une méthode

h Comparaison
maChaine.equals("Bonjour!"); // Renvoi vrai
keulkeul.blogspot.com

h Concaténation Faites attention à la comparaison


de chaînes de caractères.
String essai = "ess" + "ai"; maChaine == "toto";
String essai = "ess".concat("ai");
Comparaison sur les références !!

Cours Java - M. Baron - Page 86


Les Chaînes modifiables « StringBuffer »

h Elles sont modifiables par insertion, ajouts, conversions, etc

h On obtient une « StringBuffer » avec ses constructeurs


StringBuffer mCM = new StringBuffer(int length);
StringBuffer mCM = new StringBuffer(String str);

h On peut les transformer en chaînes normales String


String s = mCM.toString();

h On peut leur ajouter n’importe (surcharge) quoi


mCM.append(...); // String, int, long, float, double, boolean,
keulkeul.blogspot.com

char

h On peut leur insérer n’importe (surcharge) quoi


mCM.insert(int offset, ...); // String, int, long, float, double,
boolean, char
Cours Java - M. Baron - Page 87
Les chaînes décomposables « StringTokenizer »

h Elles permettent la décomposition en mots ou éléments


suivant un délimiteur
this is a test => this
is
a
test

h On obtient une « StringTokenizer » avec ses constructeurs


StringTokenizer mCM = new StringTokenize(String str); // Délimiteur = blanc
StringTokenizer rMCM = new StringTokenizer(String str, String delim);

h Un exemple
keulkeul.blogspot.com

StringTokenizer st =
new StringTokenizer("Bonjour,
le monde|de|Java",", |");

while(st.hasMoreElements())
System.out.println("Element : " + st.nextElement());

Cours Java - M. Baron - Page 88


Variables de classe

h Il peut être utile de définir pour une classe des attributs


indépendamment des instances : nombre de Voitures
créées

h Utilisation des Variables de classe comparables aux


« variables globales »

h Usage des variables de classe


h Variables dont il n’existe qu’un seul exemplaire associé à sa classe
de définition
keulkeul.blogspot.com

h Variables existent indépendamment du nombre d’instances de la


classe qui ont été créés

h Variables utilisables même si aucune instance de la classe n’existe


Cours Java - M. Baron - Page 89
Variables de classe

h Elles sont définies comme les attributs mais avec le mot-clé


static
Attention à l’encapsulation. Il
est dangereux de laisser cette
public static int nbVoitureCreees; variable de classe en public.

h Pour y accéder, il faut utiliser non pas un identificateur mais


le nom de la classe
Voiture.nbVoitureCreees = 3;
keulkeul.blogspot.com

Il n’est pas interdit d’utiliser une


variable de classe comme un attribut
(au moyen d ’un identificateur) mais
fortement déconseillé

Cours Java - M. Baron - Page 90


Constantes de classe

h Usage
h Ce sont des constantes liées à une classe
h Elles sont écrites en MAJUSCULES Une constante de classe
est généralement
toujours visible

h Elles sont définies (en plus) avec le mot-clé final


public class Galerie {
public static final int MASSE_MAX = 150;
}
keulkeul.blogspot.com

h Pour y accéder, 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) {...}

Cours Java - M. Baron - Page 91


Variables et Constantes de classe

h Exemple : constantes de classe


public class Voiture {

public static final int PTAC_MAX = 3500;


private int poids;
Dangereux car
public static int nbVoitureCreees; possibilité de
...
modification
public Voiture(int poids, ...) { extérieure...
this.poids = poids;
nbVoitureCrees++;
...
public class TestMaVoiture {
}
}
public static void main (String[] argv) {
// Déclaration puis création de maVoiture
Voiture maVoiture = new Voiture(2500);
...
Utilisation de
keulkeul.blogspot.com

System.out.println("Poids maxi:" +
Variables et Voiture.PTAC_MAX);
Constantes de classe System.out.println(Voiture.nbVoitureCreees);
par le nom de la
...
}
classe Voiture }

Cours Java - M. Baron - Page 92


Méthodes de classe

h Usage
h Ce sont des méthodes qui ne s'intéressent pas à un objet particulier
h Utiles pour des calculs intermédiaires internes à une classe
h Utiles également pour retourner la valeur d'une variable de classe
en visibilité private

h Elles sont définies comme les méthodes d'instances, mais


avec le mot clé static
public static double vitesseMaxToleree() {
return vitesseMaxAutorisee*1.10;
}
keulkeul.blogspot.com

h Pour y accéder, il faut utiliser non pas un identificateur


d'objet mais le nom de la classe (idem variables de classe)
Voiture.vitesseMaxToleree()

Cours Java - M. Baron - Page 93


Méthodes de classe

h Exemple : méthode de classe


public class Voiture {
Déclaration d'une
private static int nbVoitureCreees; variable de classe
...
privée. Respect des
public static int getNbVoitureCreees(){ principes
d'encapsulation.
return Voiture.nbVoitureCreees;
}
}

Déclaration d'une public class TestMaVoiture {


méthode de classe
public static void main (String[] argv) {
pour accéder à la // Déclaration puis création de maVoiture
valeur de la variable Voiture maVoiture = new Voiture(2500);
keulkeul.blogspot.com

de classe.
...

System.out.println("Nbre Instance :" +


Voiture.getNbVoitureCreees());
}
}

Cours Java - M. Baron - Page 94


Méthodes de classe : erreur classique

h Exemple (suite) : méthode de classe


public class Voiture {

private Galerie laGalerie; Déclaration d'un objet


... Galerie non statique
public Voiture(Galerie g) {
laGalerie = g;
...
}

public static boolean isGalerieInstall() {


return (laGalerie != null)
}
}

Erreur : Utilisation d'un


keulkeul.blogspot.com

attribut non statique


On ne peut pas utiliser de
dans une zone statique
variables d'instance dans une
méthode de classe!!!!

Cours Java - M. Baron - Page 95


Méthodes de classe

h Rappel : les types simples (int, double, etc.) possède un


alter-ego objet disposant de méthodes de conversion
h Par exemple la classe Integer « encapsule » le type int
h Constructeur à partir d’un int ou d’une chaîne de caractères
public Integer(int value);
public Integer(String s);
h Disponibilité de méthodes qui permettent la conversion en type simple
Integer valueObjet = new Integer(123);
int valuePrimitif = valueObjet.intValue();
Ou
int valuePrimitif = valueObjet; (AutoBoxing)
h Des méthodes de classe très utiles qui permettent à partir d’une
keulkeul.blogspot.com

chaîne de caractères de transformer en type simple ou type object


String maValueChaine = new String("12313");
int maValuePrimitif = Integer.parseInt(maValueChaine);

Attention aux erreurs de conversion. Retour d’une


exception. Voir dans la dernière partie du cours
Cours Java - M. Baron - Page 96
Les tableaux en Java : application Objets

1 Déclaration
Voiture[]
monTableau;

2 Dimensionnement Ou 12 et 3
monTableau = new Voiture[3]; Voiture[] monTab = {
new Voiture(5),
3 Initialisation new Voiture(7),
new Voiture(8)
monTableau[0] = new Voiture(5); };
monTableau[1] = new Voiture(7);
monTableau[2] = new Voiture(8);
keulkeul.blogspot.com

for (int i = 0; i < monTableau.length; i++) {


System.out.println(monTableau[i].demarre());
}

Cours Java - M. Baron - Page 97


Varargs : passage de paramètres en nombre indéfini

h Varargs est une nouveauté Java 5 permettant de passer en

paramètre un nombre indéfini de valeurs de même type

h Pour ceux qui ont connu le langage Turbo Pascal, l’équivalent

du System.out.println() le permettait déjà

h Avant la version Java 5, il fallait passer en paramètre un

tableau d’un type donné pour réaliser la même chose


keulkeul.blogspot.com

public ajouterPassager(String[] tab)

h La syntaxe de varargs est la suivante : utilisation de « … »


public ajouterPassager(String... tab)
Cours Java - M. Baron - Page 98
Varargs : passage de paramètres en nombre indéfini

h Du côté de la méthode où le varargs est défini, les données


sont manipulées comme un tableau
public ajouterPassager(String... tab) {
for (String current : tab) {
System.out.println(current)
}
}

h Du côté client qui fait un appel à la méthode, les données


peuvent être envoyées comme un
h Tableau
String passagers = {"Tony", "Luck",
"John"};
keulkeul.blogspot.com

maVoiture.ajouterPassager(passagers);
h Ensemble de paramètres

maVoiture.ajouterPassager("Tony", "Luck", "John");

Cours Java - M. Baron - Page 99


Varargs : passage de paramètres en nombre indéfini

h Comme un varargs est considéré comme un tableau le


contenu peut être vide
public Voiture(int... carac) {
...
}
public static void main(String[] argv) {
new Voiture();
}

h Si un varargs est accompagné d’un ou plusieurs autres para-


mètres, le varargs doit obligatoirement être placé en dernier
public Voiture(String mod, int... carac) {
keulkeul.blogspot.com

...
}

public Voiture(int... Carac, String mod) {


...
}
Cours Java - M. Baron - Page 100
Varargs : passage de paramètres en nombre indéfini

h Problématiques liées à la surcharge d’une méthode utilisant


un varargs
h Dans le cas de la surcharge d’une méthode la méthode contenant le
varargs a la priorité la plus faible

public class Voiture {


public Voiture(int... carac) {
}

public Voiture(int caract1, int caract2) {


...
}
keulkeul.blogspot.com

public static void main(String[] argv) {


new Voiture(12, 23);
new Voiture(12);
}
}

Cours Java - M. Baron - Page 101


Programmation Orientée Objet application au langage
Java

Héritage

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Définition et intérêts

h Héritage
h Technique offerte par les langages de programmation pour
construire une classe à partir d’une (ou plusieurs) autre classe en
partageant ses attributs et opérations

h Intérêts
h Spécialisation, enrichissement : une nouvelle classe réutilise les
attributs et les opérations d ’une classe en y ajoutant et/ou des
opérations particulières à la nouvelle classe
h Redéfinition : une nouvelle classe redéfinit les attributs et
keulkeul.blogspot.com

opérations d’une classe de manière à en changer le sens et/ou le


comportement pour le cas particulier défini par la nouvelle classe
h Réutilisation : évite de réécrire du code existant et parfois on ne
possède pas les sources de la classe à hériter Cours Java - M. Baron - Page 103
Spécialisation de la classe « Voiture »

h Un véhicule prioritaire est une voiture avec un gyrophare


h Un véhicule prioritaire répond aux mêmes messages que la Voiture
h On peut allumer le gyrophare d’un véhicule prioritaire
h Une voiture électrique est une voiture dont l’opération de
démarrage est différente
h Une voiture électrique répond aux même messages que la Voiture
h On démarre une voiture électrique en activant un disjoncteur
Voiture
Voiture + demarre()

Relation d’héritage
keulkeul.blogspot.com

VehiculePrioritaire VoitureElectrique

- gyrophare : booléen - disjoncteur : booléen

+ allumeGyrophare() + demarre()

Cours Java - M. Baron - Page 104


Classes et sous-classes

h Un objet de la classe VehiculePrioritaire ou VoitureElectrique

est aussi un objet de la classe Voiture donc il dispose de

tous les attributs et opérations de la classe Voiture

VehiculePrioritaire VoitureElectrique
- gyrophare : booléen - disjoncteur : booléen
+ allumeGyrophare() + demarre()
- puissance : entier
Hérité de Voiture

- puissance : entier

Hérité de Voiture
- estDemarree : boolean - estDemarree : boolean
keulkeul.blogspot.com

- vitesse : flottant - vitesse : flottant


+ deQuellePuissance() : entier + deQuellePuissance() : entier
+ demarre() + demarre()
+ accelere(flottant) + accelere(flottant)

Cours Java - M. Baron - Page 105


Classes et sous-classes : terminologie

h Définitions

h La classe VehiculePrioritaire hérite de la classe Voiture

h Voiture est la classe mère et VehiculePrioritaire la classe fille

h Voiture est la super-classe de la classe VehiculePrioritaire

h VehiculePrioritaire est une sous-classe de Voiture

h Attention

h Un objet de la classe VehiculePrioritaire ou VoitureElectrique est


keulkeul.blogspot.com

forcément un objet de la classe Voiture

h Un objet de la classe Voiture n’est pas forcément un objet de la


classe VehiculePrioritaire ou VoitureElectrique
Cours Java - M. Baron - Page 106
Généralisation et Spécialisation

h La généralisation exprime une relation « est-un » entre une


classe et sa super-classe

Voiture

Raffinement
Abstraction
Super-classe

VehiculePrioritaire
Sous-classe

VehiculePrioritaire est
h L’héritage permet
keulkeul.blogspot.com

une Voiture
h de généraliser dans le sens abstraction
h de spécialiser dans le sens raffinement

Cours Java - M. Baron - Page 107


Exemple d’héritage

h Exemple : espèces
Mammifère

Cétacé Humain

Baleine Dauphin Etudiant Enseignant


keulkeul.blogspot.com

Mobi Dick Ecco Raoul Mickaël

Cours Java - M. Baron - Page 108


Héritage et Java

h Héritage simple
h Une classe ne peut hériter que d’une seule autre classe

h Dans certains autres langages (ex : C++) possibilité d’héritage multiple

h Utilisation du mot-clé extends après le nom de la classe


public class VehiculePrioritaire extends Voiture {

private boolean gyrophare;


...
Voiture
public void allumeGyrophare() {
gyrophare = true;
}
...
VehiculePrioritaire }
keulkeul.blogspot.com

- gyrophare : booléen
+ allumeGyrophare() N’essayez pas d’hériter de plusieurs
classes (extends Voiture, Sante, …)
ça ne fonctionne pas

Cours Java - M. Baron - Page 109


Héritage à plusieurs niveaux

public class Voiture {


...
Voiture public void demarre() {
+ demarre()
...
}
}

public class VehiculePrioritaire


extends Voiture { Ambulance am =
VehiculePrioritaire ... new Ambulance(...);
public void allumeGyrophare() { am.demarre();
+ allumeGyrophare() ... am.allumeGyrophare();
} am.chercher("Raoul");
}

public class Ambulance


keulkeul.blogspot.com

extends VehiculePrioritaire {
Ambulance
private String malade;
- malade : String ...
public void chercher(String ma) {
+ chercher(String)
...
}
}

Cours Java - M. Baron - Page 110


Surcharge et redéfinition

h L’héritage
h Une sous-classe peut ajouter des nouveaux attributs et/ou méthodes
à ceux qu’elle hérite (surcharge en fait partie)
h Une sous-classe peut redéfinir (redéfinition) les méthodes à ceux dont
elle hérite et fournir des implémentations spécifiques pour celles-ci

h Rappel de la surcharge : possibilité de définir des méthodes


possédant le même nom mais dont les arguments
(paramètres et valeur de retour) diffèrent
Des méthodes surchargées peuvent
avoir des types de retour différents à
keulkeul.blogspot.com

condition qu’elles aient des


arguments différents

h Redéfinition (overriding) : lorsque la sous-classe définit une


méthode dont le nom, les paramètres et le type de retour
sont identiques Cours Java - M. Baron - Page 111
Surcharge et redéfinition

h Une voiture électrique est une voiture dont l’opération de


démarrage est différente
h Une voiture électrique répond aux même messages que la Voiture
h On démarre une voiture électrique en activant un disjoncteur

Voiture public class VoitureElectrique extends Voiture {


+ demarre()
private boolean disjoncteur;
...

public void demarre() {


disjoncteur = true;
VoitureElectrique }
keulkeul.blogspot.com

- disjoncteur : ...
}
booléen
+ demarre()
Redéfinition de la
méthode
Cours Java - M. Baron - Page 112
Surcharge et redéfinition

public class Voiture {


... Ne pas confondre surcharge et redéfinition.
public void demarre() {
Dans le cas de la surcharge la sous-classe
...
} ajoute des méthodes tandis que la redéfinition
} « spécialise » des méthodes existantes

Redéfinition Surcharge

public class VoitureElectrique public class VehiculePrioritaire


extends Voiture { extends Voiture {
... ...
public void demarre() { public void demarre(int code) {
... ...
} }
keulkeul.blogspot.com

} }

VoitureElectrique possède VehiculePrioritaire possède


« au plus » une méthode de « au plus » une méthode de
moins que VehiculePrioritaire plus que VoitureElectrique
Cours Java - M. Baron - Page 113
Redéfinition avec réutilisation

h Intérêt
h La redéfinition d’une méthode cache le code de la méthode héritée

h Réutiliser le code de la méthode hérité par le mot-clé super

h super permet ainsi la désignation explicite de l’instance d’une


classe dont le type est celui de la classe mère

h Accès aux attributs et méthodes redéfinies par la classe courante


mais que l’on désire utiliser

super.nomSuperClasseMethodeAppelee(...);
keulkeul.blogspot.com

h Exemple de la Voiture : les limites à résoudre


h L’appel à la méthode demarre de VoitureElectrique ne modifie que
l’attribut disjoncteur
Cours Java - M. Baron - Page 114
Redéfinition avec réutilisation

h Exemple : réutilisation de méthode


public class Voiture { La position de super
n’a ici aucune
private boolean estDemarree;
...
importance

public void demarre() { public class VoitureElectrique extends Voiture {


estDemarree = true;
} private boolean disjoncteur;
} ...

Mise à jour de l’attribut public void demarre() {


estDemarree disjoncteur = true;
super.demarre();
}
...
}
public class TestMaVoiture {
keulkeul.blogspot.com

public static void main (String[] argv) {


// Déclaration puis création Envoi d’un message par
appel de demarre
VoitureElectrique laRochelle =
new VoitureElectrique(...);
laRochelle.demarre();
}
}
Cours Java - M. Baron - Page 115
Usage des constructeurs : suite

h Possibilité comme les méthodes de réutiliser le code des

constructeurs de la super-classe

h Appel explicite d’un constructeur de la classe mère à

l’intérieur d’un constructeur de la classe fille


L’appel au constructeur de la super-
h Utilise le mot-clé super classe doit se faire absolument en
première instruction
super(paramètres du constructeur);
keulkeul.blogspot.com

h Appel implicite d'un constructeur de la classe mère est

effectué quand il n'existe pas d'appel explicite. Java insère

implicitement l'appel super() Cours Java - M. Baron - Page 116


Usage des constructeurs : suite

h Exemple : constructeurs voiture


public class Voiture { L’appel au constructeur de
...
la super-classe doit se
public Voiture() { faire absolument en
this(7, new Galerie()); première instruction
}

Implantation du constructeur
public Voiture(int p) {
this(p, new Galerie());
} de VoiturePrioritaire à partir
public Voiture(int p, Galerie g) {
de Voiture
puissance = p;
moteur = new Moteur(puissance);
galerie = g; public class VoiturePrioritaire
... extends Voiture {
}
keulkeul.blogspot.com

... private boolean gyrophare;


}
public VoiturePrioritaire(int p, Galerie g) {
super(p, null);
this.gyrophare = false;
}}

Cours Java - M. Baron - Page 117


Usage des constructeurs : suite

h Exemple : chaînage des constructeurs


public class A {
public A() {
System.out.println("Classe A");
}
}

public class B extends A {


public B(String message) {
super(); // Appel implicite
System.out.println("Classe B");
System.out.println(message);
}
}

public class C extends B {


public C(String debut) {
keulkeul.blogspot.com

super("Message issu C" + debut);


System.out.println("Classe C");
System.out.println("Fin");
}
public class Test {
}
public static void main (String[] argv) {
new C(" et Message du main");
}
} Cours Java - M. Baron - Page 118
Usage des constructeurs : suite

h Rappel : si une classe ne définit pas explicitement de


constructeur, elle possède alors un constructeur par défaut
h Sans paramètre
h Qui ne fait rien
h Inutile si un autre constructeur est défini explicitement
public class A { public A() {
public void afficherInformation() { super();
System.out.println("Des Informations..."); }
}
}

public class B extends A {


private String pInfo;
super();
public B(String pInfo) {
keulkeul.blogspot.com

this.pInfo = pInfo;
}
}
public class Test {
public static void main (String[] argv) {
new B("Message du main");
}
}
Cours Java - M. Baron - Page 119
Usage des constructeurs : suite

h Exemple : constructeur explicite


public class Voiture {
... Constructeurs explicites
public Voiture(int p) { désactivation du
this(p, new Galerie());
} constructeur par défaut
public Voiture(int p, Galerie g) {
puissance = p;
moteur = new Moteur(puissance); Erreur : il n'existe pas dans
galerie = g; Voiture de constructeur sans
...
paramètre
}
...
}
public class VoiturePrioritaire
extends Voiture {
keulkeul.blogspot.com

private boolean gyrophare; super();

public VoiturePrioritaire(int p, Galerie g) {


this.gyrophare = false;
}
}

Cours Java - M. Baron - Page 120


La classe Object : le mystère résolu

h La classe Object est la classe de plus haut niveau dans la


hiérarchie d'héritage
h Toute classe autre que Object possède une super-classe
h Toute classe hérite directement ou indirectement de la classe Object
h Une classe qui ne définit pas de clause extends hérite de la classe
Object Object
+ Class getClass()
public class Voiture extends Object { + String toString()
... + boolean equals(Object)
+ int hashCode()
public Voiture(int p, Galerie g) {

keulkeul.blogspot.com

puissance = p;
moteur = new Moteur(puissance);
galerie = g;
... Il n'est pas nécessaire
} d'écrire explicitement
... extends Object
}
Cours Java - M. Baron - Page 121
La classe Object : le mystère résolu
Avant redéfinition
public class Voiture { public class Test {
... public static void main (String[] argv) {
public Voiture(int p) { Voiture maVoiture = new Voiture(5);
this(p, new Galerie()); System.out.println(maVoiture);
} }
} public Sring toString()} {
return (this.getClass().getName() +
"@" + this.hashCode());
}

public class Voiture {


...
public Voiture(int p) {
Après redéfinition

this(p, new Galerie());


.ln(maVoiture.toString());
}
public class Test {
public String toString() { public static void main (String[] argv) {
keulkeul.blogspot.com

return("Puissance:" + p); Voiture maVoiture = new Voiture(5);


} System.out.println(maVoiture);
} }
}
Redéfinition de la méthode
String toString()
Cours Java - M. Baron - Page 122
Droits d’accès aux attributs et méthodes

h Exemple de la Voiture : les limites à résoudre


h demarre() est disponible dans la classe VehiculePrioritaire
C’est-à-dire que l’on peut démarrer sans donner le code !!!
h Solution : protéger la méthode demarre() de la classe Voiture

h Réalisation
h Utilisation du mot-clé protected devant la définition des méthodes
et/ou attributs
h Les membres sont accessibles dans la classe où ils sont définis, dans
toutes ses sous-classes Voiture
# demarre()
keulkeul.blogspot.com

demarre() n’est pas accessible


« publiquement » dans un
objet VehiculePrioritaire
VehiculePrioritaire VehiculeElectrique
+ demarre(int code) + demarre()

Cours Java - M. Baron - Page 123


Droits d’accès aux attributs et méthodes

h Exemple : accès aux méthodes


public class VoiturePrioritaire
public class Voiture { extends Voiture {

private boolean estDemarree; private int codeVoiture;


...
public void demarre(int code) {
protected void demarre() { if (codeVoiture == code) {
estDemarree = true; super.demarre();
} };
} }
}

public class TestMaVoiture {

public static void main (String[] argv) {


// Déclaration puis création de maVoiture
keulkeul.blogspot.com

VehiculeElectrique laRochelle = new VehiculeElectrique(...);


larochelle.demarre(); // Appel le demarre de VehiculeElectrique

VehiculePrioritaire pompier = new VehiculePrioritaire(...);


pompier.demarre(1234); // Appel le demarre VoiturePrioritaire
pompier.demarre(); // Erreur puisque demarre n’est pas public
}}

Cours Java - M. Baron - Page 124


Méthodes et classes finales

h Définition
h Utilisation du mot-clé final
h Méthode : interdire une éventuelle redéfinition d’une méthode

public final void demarre();

h Classe : interdire toute spécialisation ou héritage de la classe


concernée

public final class VoitureElectrique extends Voiture {


...
keulkeul.blogspot.com

La classe String par


exemple est finale
Cours Java - M. Baron - Page 125
Programmation Orientée Objet application au langage
Java

Héritage et Polymorphisme

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Définition du polymorphisme

h Définition
h Un langage orienté objet est dit polymorphique, s’il offre la possibilité
de pouvoir percevoir un objet en tant qu’instance de classes variées,
selon les besoins
h Une classe B qui hérite de la classe A peut être vue comme un
sous-type du type défini par la classe A
Voiture
+ demarre() h Rappel
h voitureLarochelle est une instance de la
classe VoitureElectrique
keulkeul.blogspot.com

VoitureElectrique h Mais aussi


+ demarre() h voitureLarochelle est une instance de la
+ getVoltage() : int
classe Voiture

voitureLarochelle Cours Java - M. Baron - Page 127


Polymorphisme et Java : surclassement

h Java est polymorphique


h A une référence de la classe Voiture, possible d’affecter une valeur qui
est une référence vers un objet de la classe VoitureElectrique
h On parle de surclassement ou upcasting
h A une référence d’un type donné, soit A, il est possible d’affecter une
valeur qui correspond à une référence vers un objet dont le type
effectif est n’importe quelle sous classe directe ou indirecte de A
Voiture
+ demarre() Objet de type sous-classe
directe de Voiture
public class Test {
keulkeul.blogspot.com

VoitureElectrique public static void main (String[] argv) {

+ demarre() Voiture voitureLarochelle =


+ getVoltage() : int new VoitureElectrique(...);
}
}

voitureLarochelle
Cours Java - M. Baron - Page 128
Polymorphisme et Java : surclassement

h A la compilation
h Lorsqu’un objet est « surclassé », il est vu par le compilateur comme
un objet du type de la référence utilisée pour le désigner
h Ses fonctionnalités sont alors restreintes à celles proposées par la
classe du type de la référence
public class Test {
public static void main (String[] argv) {

// Déclaration et création d’un objet Voiture


Voiture voitureLarochelle = new VoitureElectrique(...);

// Utilisation d’une méthode de la classe Voiture


voitureLarochelle.demarre();

// Utilisation d’une méthode de la classe VoitureElectrique


keulkeul.blogspot.com

System.out.println(voitureLarochelle.getVoltage()); // Erreur
}
}

La méthode getVoltage() n’est pas


Examiner le type de disponible dans la classe Voiture!!!
la référence
Cours Java - M. Baron - Page 129
Polymorphisme et Java : surclassement

h Exemple : surclassement
public class Test {
public static void main (String[] argv) {
// Déclaration et création d’un objet Voiture
Voiture voitureLarochelle = new VoitureElectrique(...);

// Utilisation d’une méthode de la classe Voiture


voitureLarochelle.demarre();

// Utilisation d’une méthode de la classe VoitureElectrique


System.out.println(voitureLarochelle.getVoltage());
}
}

Voiture
keulkeul.blogspot.com

+ demarre()
Remarque : Quel code va être
effectivement exécuté lorsque le message
demarre() est envoyé à voitureLarochelle ?? voitureLarochelle

Cours Java - M. Baron - Page 130


Polymorphisme et Java : lien dynamique

public class Test {


public static void main (String[] argv) {
L’objet voitureLarochelle
Voiture voitureLarochelle = initialise les attributs de la
new VoitureElectrique(...); classe VoitureElectrique
voitureLarochelle.demarre();
}
Voiture
}
+ demarre() {
estDemarre = true;
}

voitureLarochelle.demarre()
keulkeul.blogspot.com

VoitureElectrique
+ demarre() {
Constat : C’est la méthode demarre() super.demarre();
de VoitureElectrique qui est appelée. disjoncteur = true;
Puis elle appelle (par super…) la
}

méthode de la super-classe
Cours Java - M. Baron - Page 131
Polymorphisme et Java : lien dynamique

h Exemple : lien dynamique


public class Point {
private int x,y;
public Point(int x, int y) { this.x = x; this.y = y; }
public void deplace(int dx, int dy) { x += dx; y+=dy; } Point
public void affiche() { System.out.println("Je suis en "+ x + " " +
y);}
}
public class Pointcol extends Point {
private byte couleur;
public Pointcol(int x, int y, byte couleur) {
super(x,y);
this.couleur = couleur;
}
public void affiche() { Pointcol
super.affiche();
System.out.println("et ma couleur est : " + couleur);
}
}

public class Test {


keulkeul.blogspot.com

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();
}
} Cours Java - M. Baron - Page 132
Polymorphisme et Java : lien dynamique
public class Point {
private int x,y;
public Point(int x, int y) { this.x = x; this.y = y; }
public void deplace(int dx, int dy) { x += dx; y+=dy; }
public void affiche() { Point
this.identifie();
System.out.println("Je suis en "+ x + " " + y);
}
public void identifie() {System.out.println("Je suis un point");}
}

public class Pointcol extends Point {


private byte couleur;
public Pointcol(int x, int y, byte couleur) {...}
public void affiche() {
super.affiche(); Pointcol
System.out.println("et ma couleur est : " + couleur);
}
public void identifie() {System.out.println("Je suis un point coloré");}
}

public class Test {


keulkeul.blogspot.com

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();
}
} Cours Java - M. Baron - Page 133
Polymorphisme et Java : lien dynamique

h A l’exécution

h Lorsqu’une méthode d’un objet est accédée au travers d’une référence

« surclassée », c’est la méthode telle qu’elle est définie au niveau de

la classe effective de l’objet qui est invoquée et exécutée

h La méthode à exécuter est déterminée à l’exécution et non pas à la

compilation
keulkeul.blogspot.com

h On parle de liaison tardive, lien dynamique, dynamic binding,

latebinding ou run-time binding


Cours Java - M. Baron - Page 134
Polymorphisme et Java : bilan

public class Test {


public static void main (String[] argv) {
Voiture maVoit = new VoitureElectrique(...);
maVoit.demarre();
} Voiture
} + demarre() {

h Surclassement (compilation)
estDemarre = true;
}

h Une variable maVoit est déclarée comme étant


une référence vers un objet de la classe Voiture
h Un objet de la classe VoitureElectrique est créé
h Pour le compilateur maVoit reste une référence VoitureElectrique
d’un objet de la classe Voiture, et il empêche + demarre() {
d’accéder aux méthodes spécifiques à super.demarre();
keulkeul.blogspot.com

VoitureElectrique }
disjoncteur = true;

h Liaison dynamique (exécution)


h Une variable maVoit est bel et bien une référence
vers un objet de la classe VoitureElectrique
Cours Java - M. Baron - Page 135
Polymorphisme : ok, mais pourquoi faire ?

h Que des avantages …


h Plus besoin de distinguer différents cas en fonction de la classe des
objets
h Le polymorphisme constitue la troisième caractéristique essentielle
d’un langage orienté objet après l’abstraction des données
(encapsulation) et l’héritage
h Une plus grande facilité d’évolution du code. Possibilité de définir de
nouvelles fonctionnalités en héritant de nouveaux types de données à
partir d’une classe de base commune sans avoir besoin de modifier le
code qui manipule la classe de base
keulkeul.blogspot.com

h Développement plus rapide


h Plus grande simplicité et meilleure organisation du code
h Programmes plus facilement extensibles
h Maintenance du code plus aisée
Cours Java - M. Baron - Page 136
Polymorphisme : un exemple typique

h Exemple : la géométrie
h Stocker des objets Forme de n’importe quel type (Rectangle ou
Cercle) puis les afficher
Stockage
Forme
- liste : Forme[ ]
- positionx : int
- positiony : int + ajouter(Forme)
+ afficherForme()
+ afficher()
...
keulkeul.blogspot.com

Cercle
Rectangle
- rayon : int
- largeur : int
- hauteur : int + afficher()
+ afficher() …

Cours Java - M. Baron - Page 137
Polymorphisme : un exemple typique

h Exemple (suite) : la géométrie


public class Stockage {
private Forme[] liste;
private int taille;
private int i;
Si un nouveau type de
public Stockage(int taille) { Forme est défini, le code
this.taille = taille;
liste = new Forme[this.taille]; de la classe Stockage
i = 0; n’est pas modifié
}

public void ajouter(Forme f) {


if (i < taille) {
liste[i] = f;
public class Test {
i++; public static void main (String[] argv) {
} Stockage monStock = new Stockage(10);
} monStock.ajouter(new Cercle(...));
monStock.ajouter(new Rectangle(...));
public void afficherForme() {
keulkeul.blogspot.com

for (int i = 0; i < taille; i++) {


liste[i].afficher();
Rectangle monRect = new Rectangle(...);
} Forme tonRect = new Rectangle(...);
} monStock.ajouter(monRect);
} monStock.ajouter(tonRect);
}
}

Cours Java - M. Baron - Page 138


Polymorphisme : downcasting

h Intérêt
h Force un objet à « libérer » les fonctionnalités cachées
par le surclassement
h Conversion de type explicite (cast). Déjà vu pour les types primitifs
ClasseA
ClasseA monObj = ...
ClasseB b = (ClasseB) monObj

h Pour que le « cast » fonctionne, il faut qu’à l’exécution …


le type effectif de monObj soit « compatible »
avec le type ClasseB
ClasseB
keulkeul.blogspot.com

h Compatible : on peut tester la compatibilité par le mot clé instanceof


obj instanceof ClasseB

Retourne vrai ou faux


Cours Java - M. Baron - Page 139
Polymorphisme : downcasting

h Exemple : downcasting
public class Test {
public static void main (String[] argv) {
Forme maForme = new Rectangle();
// Je ne peux pas utiliser les méthodes de la classe Rectangle

// Déclaration d’un objet de type Rectangle


Rectangle monRectangle;
if (maForme instanceof Rectangle) {
monRectangle = (Rectangle)maForme;
// Utilisation possible des méthodes spécifiques de Rectangle
}
}
}

Réalisation de la
keulkeul.blogspot.com

conversion de l’objet de
Attention si la compatibilité est
fausse et si le cast est effectué type Forme en objet de
une exception de type type Rectangle
ClassCastException est levée
Cours Java - M. Baron - Page 140
La méthode « equals() »

h Deux possibilités pour comparer des objets d’une classe


h Créer une méthode ad-hoc « boolean comparer(MaClasse c) {…} »
qui compare les attributs
h Redéfinir la méthode « boolean equals(Object o) » pour garder la
compatibilité avec les autres classes de Java
h Re-implémenter la méthode « boolean equals(Object o) »
en comparant les attributs (en utilisant une conversion de type
explicite) Object
+ boolean equals(Object)

keulkeul.blogspot.com

Rappel de la classe
Voiture
Voiture
- puissance : int
- estDemarree : boolean
- vitesse : reel
… Cours Java - M. Baron - Page 141
La méthode « equals() »

h Exemple : redéfinition de la méthode equals


public class Voiture extends Object {
Redéfinition de la méthode
public boolean equals(Object o) {
if (!o instanceof Voiture) {
return false; equals de la classe Object
}

Voiture maVoit = (Voiture)o;


return this.puissance == maVoit.puissance && this.estDemarree ==
maVoit.estDemarree && this.vitesse == maVoit.vitesse;
}
...
} Même valeurs d’arguments

public class Test {


public static void main (String[] argv) {
Voiture maVoit = new Voiture(...);
keulkeul.blogspot.com

VoitureElectrique maVoitele = new VoitureElectrique(...);

maVoit.equals(maVoitele); --> TRUE


}
}
Attention : l’égalité de référence ==
vérifie si les références sont les mêmes,
cela ne compare pas les attributs
Cours Java - M. Baron - Page 142
Classes abstraites : intérêts

h On ne connaît pas toujours le comportement par défaut


d’une opération commune à plusieurs sous-classes
h Exemple : toit d’une voiture décapotable. On sait que toutes les
décapotables peuvent ranger leur toit, mais le mécanisme est
différent d’une décapotable à l’autre
h Solution : on peut déclarer la méthode « abstraite » dans la classe
mère et ne Pas lui donner d’implantation par défaut
h Méthode abstraite et conséquences : 3 règles à retenir
h Si une seule des méthodes d’une classe est abstraite, alors la classe
devient aussi abstraite
keulkeul.blogspot.com

h On ne peut pas instancier une classe abstraite car au moins une de


ses méthodes n’a pas d’implémentation
h Toutes les classes filles héritant de la classe mère abstraite doivent
implémenter toutes ses méthodes abstraites ou sinon elles sont aussi
abstraites Cours Java - M. Baron - Page 143
Classes abstraites et Java

h Le mot clé abstract est utilisé pour spécifier qu’une classe


est abstraite

h Une classe abstraite se déclare ainsi


public abstract class NomMaClasse {
...
}

h Une méthode abstraite se déclare ainsi


public abstract void maMethode(...);
keulkeul.blogspot.com

Pour créer une méthode abstraite, la


signature (nom et paramètres) est
déclarée sans spécifier le corps et en
ajoutant le mot clé abstract
Cours Java - M. Baron - Page 144
Classes abstraites : exemple VoitureDecapotable

h La classe VoitureDecapotable
h Hérite de Voiture
Voiture

h Définit un attribut protégé toitReplié

h Définit une méthode abstraite replieLeToit()


VoitureDecapotable {abstraite}
# toitReplié : booléen
+ replieLeToit() {abstraite}

h Les classes DeuxChevaux et C3Pluriel


héritent de VoitureDecapotable
keulkeul.blogspot.com

C3Pluriel
DeuxChevaux - arceauxRetirés : booléen
- capoteAttachée : booléen + replieLeToit()
+ replieLeToit()
Cours Java - M. Baron - Page 145
Classes abstraites : exemple VoitureDecapotable

h Exemple : une voiture décapotable


public abstract class VoitureDecapotable
extends Voiture {
protected boolean toitReplié;
Classe
abstraite public abstract void replieLeToit();
}

public class DeuxChevaux extends VoitureDecapotable {


private boolean capoteAttachee;

public void replieLeToit() {


Méthode this.toitReplie = true;
abstraite this.capoteAttachee = true;
}
}
keulkeul.blogspot.com

public class C3Pluriel extends VoitureDecapotable {


private boolean arceauxRetirés;
Attention : ce n’est pas
public void replieLeToit() {
de la redéfinition. On
this.toitReplie = true;
this.arceauxRetirés = true; parle d’implémentation
} de méthode abstraite
}
Cours Java - M. Baron - Page 146
Classes abstraites : exemple VoitureDecapotable

h Exemple (suite) : une voiture décapotable


public class Test {
public static void main (String[] argv) {
// Déclaration et création d’une DeuxCheveaux
VoitureDecapotable voitureAncienne = new DeuxCheveaux(...);
// Envoi de message
voitureAncienne.replieLeToit();

// Déclaration et création d’une C3Pluriel


VoitureDecapotable voitureRecente = new C3Pluriel(...);
// Envoi de message
voitureRecente.replieLeToit();

// Déclaration et création d’une VoitureDecapotable


VoitureDecapotable voitureDecapotable =
new VoitureDecapotable(...); // Erreur
}
}
keulkeul.blogspot.com

Attention : La classe
VoitureDecapotable ne
peut être instanciée
puisqu’elle est
abstraite
Cours Java - M. Baron - Page 147
Classes abstraites : exemple Forme

h Exemple : la classe Forme


h Les méthodes surface() et périmètre() sont abstraites

h Ces méthodes n’ont de « sens » que pour les


sous-classes Cercle et Rectangle Forme {abstraite}
- positionx, positiony : int
+ deplace(x,y)
Cercle
+ surface() : double {abstraite}
- rayon : int + périmètre() : double {abstraite}
+ surface() : double
+ périmètre() : double

public abstract class Forme { Rectangle


private int positionx, positiony; - larg, haut : int
keulkeul.blogspot.com

public void deplacer(double dx, double dy){ + surface() : double


x += dx; y += dy; + périmètre() : double
}

public abstract double périmètre(); Pas d’implémentation !!


public abstract double surface();
}
Cours Java - M. Baron - Page 148
Notion d’interface

h Une interface est un modèle pour une classe


h Quand toutes les méthodes d’une classe sont abstraites et qu’il n’y a
aucun attribut nous aboutissons à la notion d’interface
h Elle définit la signature des méthodes qui doivent être implémentées
dans les classes qui respectent ce modèle
h Toute classe qui implémente l’interface doit implémenter toutes les
méthodes définies par l’interface
h Tout objet instance d’une classe qui implémente l’interface peut être
déclaré comme étant du type de cette interface
h Les interfaces pourront se dériver
h Exemple
keulkeul.blogspot.com

h Les choses Demarrable doivent posséder une méthode demarre()


Voiture
Demarrable << Interface >>
+ demarre
Ordinateur
Cours Java - M. Baron - Page 149
Notion d’interface et Java

h Mise en œuvre d’une interface


h La définition d’une interface se présente comme celle d’une classe.
Le mot clé interface est utilisé à la place de class
public interface NomInterface { Interface : ne pas
...
confondre avec les
}
interfaces graphiques
h Lorsqu’on définit une classe, on peut préciser qu’elle implémente
une ou plusieurs interface(s) donnée(s) en utilisant une fois le mot
clé implements
public class NomClasse implements Interface1,Interface3, ... {
...
keulkeul.blogspot.com

h Si une classe hérite d’une autre classe elle peut également implémen-
ter une ou plusieurs interfaces
public class NomClasse extends SuperClasse implements Inter1, ... {
...
} Cours Java - M. Baron - Page 150
Notion d’interface et Java

h Mise en œuvre d’une interface


h Une interface ne possède pas d’attribut

h Une interface peut posséder des constantes

public interface NomInterface {


public static final int CONST = 2;
}

h Une interface ne possède pas de mot clé abstract

h Les interfaces ne sont pas instanciables (Même raisonnement avec les


keulkeul.blogspot.com

classes abstraites)

NomInterface jeTente = new NomInterface(); // Erreur!!

Cours Java - M. Baron - Page 151


Notion d’interface et Java

h Toute classe qui implémente l’interface doit implémenter


toutes les méthodes définies par l’interface
Voiture
Demarrable << Interface >>
+ demarre
Ordinateur
public interface Demarrable {
public void demarre();
}
public class Voiture implements Demarrable {
Doit implémenter ...

toutes les méthodes public void demarre() {


des interfaces }
moteurAllumé = true;

}
keulkeul.blogspot.com

public class Ordinateur implements Demarrable {


... Une « Voiture » est «
Demarrable »
public void demarre() {
estDemarree = true; Un « Ordinateur » est
}
}
« Demarrable »
Cours Java - M. Baron - Page 152
Notion d’interface et Java

h Tout objet instance d’une classe qui implémente l’interface


peut être déclaré comme étant du type de cette interface
public class Test {
public static void main (String[] argv) {
// Déclaration d’un objet de type Demarrable
Demarrable dem1;
// Création d’un objet Voiture
dem1 = new Voiture();

// Déclaration et création d’un objet Personne Une personne peut


Personne pers1 = new Personne(dem1); demarrer tous les
pers1.mettreEnRoute();
objets Demarrable
// Déclaration d’un objet de type Demarrable
Demarrable dem2;
// Création d’un objet Ordinateur
keulkeul.blogspot.com

dem2 = new Ordinateur();

// Déclaration et création d’un objet Personne


Personne pers2 = new Personne(dem2);
pers2.mettreEnRoute();
}
}
Cours Java - M. Baron - Page 153
Notion d’interface et Java

h Exemple : une Voiture et un Ordinateur sont des objets


Demarrable
public class Person {

private Demarrable objetDemarrable;

public Person(Demarrable dem) {


objetDemarrable = dem;
}

public void mettreEnRoute() {


objetDemarrable.demarre();
}
keulkeul.blogspot.com

Une personne peut démarrer


Voiture et Ordinateur sans
connaître leur nature exacte
Cours Java - M. Baron - Page 154
Notion d’interface et Java

h Les interfaces pourront se dériver

h Une interface peut hériter d’une autre interface : « extends »


NomInte1 << Interface >>
h Conséquences
+ …

h La définition de méthodes de l’interface mère NomInte1

sont reprises dans l’interface fille NomInte2. Toute classe qui

implémente l’interface fille doit donner une implémentation à

toutes les méthodes mêmes celle héritées


keulkeul.blogspot.com

h Utilisation
NomInte2 << Interface >>
+ …

h Lorsqu’un modèle peut se définir en plusieurs sous-modèles complé-

mentaires
Cours Java - M. Baron - Page 155
Classes abstraites versus interfaces

h Les classes
h Elles sont complètement implémentées
h Une autre classe peut en hériter
h Les classes abstraites
h Sont partiellement implémentées
h Une autre classe non abstraite peut en hériter mais doit donner une
implémentation aux méthodes abstraites
h Une autre classe abstraite peut en hériter sans forcément donner une
implémentation à toutes les méthodes abstraites
h Ne peuvent pas être instanciées mais peuvent fournir un constructeur
keulkeul.blogspot.com

h Les interfaces
h Elles ne sont pas implémentées
h Toute classe qui implémente une ou plusieurs interfaces doit
implémenter toutes leurs méthodes (abstraites)Cours Java - M. Baron - Page
156
L’interface « Cloneable »

h Deux possibilités pour dupliquer un objet


h Créer une méthode ad-hoc public MaClasse dupliquer() qui retourne
une copie de l’objet en ayant créé une nouvelle instance et initialisé
les attributs (en utilisant le constructeur)
saClio maClio
saClio != maClio mais - puissance = 4 - puissance = 4
le contenu est identique - estDemarree = true recopie - estDemarree = true
- vitesse = 179.8 - vitesse = 179.8

h Utiliser l’interface « Cloneable » pour garder la compatibilité avec les


autres classes de Java
h Implémenter la méthode protected Object clone() de l’interface
Cloneable
keulkeul.blogspot.com

public class Voiture implements Demarrable, Cloneable {


protected Object clone() {
Voiture copie;
copie = new Voiture(this.puissance, (Galerie)laGalerie.clone());
return copie;
}
}
Cours Java - M. Baron - Page 157
Les classes internes « Inner Classes »

h Règle de base en Java


h Une classe par fichier et un fichier par classe
h Classes locales ou internes public class Voiture {
...
h Définies à l’intérieur d’autres classes
class Moteur {
...
(Moteur dans Voiture) }
}

h Classes anonymes
h Sont des instanciations de classes et Demarrable uneInstance =
new Demarrable(){
des implémentations d’une classe public void demarre() {
// Code ici
abstraite ou d’une interface }
keulkeul.blogspot.com

};
h La ou les méthodes abstraites doivent
être implémentées au moment de l’instanciation

Les classes anonymes sont très utilisées pour


le développement d’IHM avec Java/Swing
Cours Java - M. Baron - Page 158
Les classes internes « Inner Classes »

h Code source : 1 fichier


Classe anonyme, implémente
h classe l’interface Init
public class Voiture {
h classe anonyme
public Voiture(...) {

h classe interne
monMoteur = new Moteur(...);
Init monInit = new Init() {
public void initialisation() {
h Génération de byte-code : 3 fichiers }
...

};
h classe Voiture.class }
class Moteur {
...
h anonyme Voiture$1.class public Moteur(...) {Classe interne
...
}
h interne Voiture$Moteur.class }
}
keulkeul.blogspot.com

Les fichiers .class qui


possèdent dans leur nom un $
ne sont pas des fichiers
temporaires!!!
Cours Java - M. Baron - Page 159
Programmation Orientée Objet application au langage
Java

Les indispensables

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Les packages

h Le langage Java propose une définition très claire du


mécanisme d’empaquetage qui permet de classer et de gérer
les API externes
h Les API sont constituées
0..* 0..* 0..*
API Paquetage Classe Méthode

0..*
0..* Attribut
Interface

h Un package est donc un groupe de classes associées à une


fonctionnalité
keulkeul.blogspot.com

h Exemples de packages
h java.lang : rassemble les classes de base Java (Object, String, …)
h java.util : rassemble les classes utilitaires (Collections, Date, …)
h java.io : lecture et écriture Cours Java - M. Baron - Page 161
Les packages : ok, mais pourquoi faire?

h L’utilisation des packages permet de regrouper les classes


afin d’organiser des libraires de classes Java
h Exemple : la classe Date est définie deux fois

Nom complet
de la classe
java.util.Date
keulkeul.blogspot.com

Package Sous-Package Classe

Cours Java - M. Baron - Page 162


Les packages : utilisation des classes

h Lorsque, dans un programme, il y a une référence à une


classe, le compilateur la recherche dans le package par
défaut (java.lang)
h Pour les autres, il est nécessaire de fournir explicitement
l’information pour savoir où se trouve la classe :
h Utilisation d’import (classe ou paquetage)
import mesclasses.Point;
import java.lang.String; // Ne sert à rien puisque par défaut
import java.io.ObjectOutput;

ou
keulkeul.blogspot.com

import mesclasses.*;
import java.lang.*; // Ne sert à rien puisque par défaut Ecriture très
import java.io.*; lourde préférer
la solution avec
h Nom du paquetage avec le nom de la classe le mot clé import
java.io.ObjectOuput toto = new java.io.ObjectOuput(...)
Cours Java - M. Baron - Page 163
Les packages : leur « existence » physique

h A chaque classe Java correspond un fichier


h A chaque package (sous-package) correspond un répertoire

Package
Exemple : mesclassses.Voiture

Voiture.java
Classe

mesclasses
Le nom des
h Un package peut contenir packages est
h Des classes ou des interfaces toujours écrit en
minuscules
h Un autre package (sous-package)
keulkeul.blogspot.com

Package (mesclasses)
Exemple : mesclassses.ex1.Voiture Sous-package (ex1)
Classe (Voiture.java)
ex1

mesclasses Cours Java - M. Baron - Page 164


Les packages : hiérarchie de packages

h A une hiérarchie de packages correspond une hiérarchie de


répertoires dont les noms coïncident avec les composants
des noms de package
h Exemple : la classe String

java
h Bibliothèque pure Java

h Les sources (*.java) se trouvent


lang util math dans le répertoire src du répertoire Java
keulkeul.blogspot.com

h Les bytecodes (*.class) se trouvent dans


l’archive rt.jar du répertoire Java
String.java

Cours Java - M. Baron - Page 165


Les packages : création et conseils

h Quand vous créer un projet nommez le package de plus haut


(voiture) niveau par le nom du projet (Voiture)
Sources
Vos répertoires de travail
(Pas encore de notion de
package)

Voiture Geom

Package voiture :
voiture.modele.VoitureElectrique
voiture
voiture.modele.Voiture
voiture.test.Test
Vos packages. A la
racine de Voiture vous
pouvez y placer des
keulkeul.blogspot.com

test
modele
informations d’aides à
l’utilisation de votre
package.
(Fichier de lancement
par exemple)
Test.java
VoitureElectrique.java Voiture.java
Cours Java - M. Baron - Page 166
Les packages : création et conseils

h Pour spécifier à une classe qu’elle appartient à un package


utiliser le mot clé package Le mot clé package est
package voiture.modele; toujours placé en
public class VoitureElectrique { première instruction
...
} d’une classe
package voiture.modele;
public class Voiture {
...
}
package voiture.test;
import voiture.modele.VoitureElectrique;
import voiture.modele.Voiture;
import ...

public class Test1 {


public static void main(String[] argv) {
keulkeul.blogspot.com

...
}
}

Ne confondez pas héritage et package.


Pas la même chose. VoitureElectrique
est dans le même package que Voiture Cours Java - M. Baron - Page 167
Les packages : compilation et exécution

h Être placé dans la racine du répertoire Voiture

Voiture

h La compilation doit prendre en compte les chemins des


packages

javac voiture\modele\*.java voiture\test\*.java

h L’exécution se fait en indiquant la classe principale avec son


chemin
keulkeul.blogspot.com

La séparation entre
package, sous-packages
et classes se fait à l’aide
java voiture.test.Test de point « . » et non de
anti-slash « \ »

Cours Java - M. Baron - Page 168


Les packages : visibilité

h L’instruction import nomPackage.* ne concerne que les


classes du package indiqué.
Elle ne s’applique pas aux classes des sous-packages

Packages différents

import java.util.zip.*; Essai utilise les classes Date


import java.util.*;

du package java.util et
public class Essai {
...
ZipFile du package
keulkeul.blogspot.com

public Essai() {
Date myDate = new Date(...);
ZipFile myZip = new ZipFile(...); java.util.zip
...
}
...
}

Cours Java - M. Baron - Page 169


Javadoc et les commentaires

h Deux types de commentaires


h Commentaires de traitements : précision sur le code lui-même
h Commentaires de documentation (outil javadoc de la JDK : génération
automatique de pages html)

h Classes, constructeurs, méthodes et champs


h Compris entre /** et */

h Première ligne : uniquement /**


h Suivantes : un espace suivi d’une étoile
h Dernière ligne : uniquement */ précédé d’un espace
keulkeul.blogspot.com

/**
* Description de la méthode Ajouter du sens et des
* Autres caractéristiques
précisions à vos codes.
*/
public Voiture(...) { Expliquer n’est pas
... traduire!!
}
}
Cours Java - M. Baron - Page 170
Javadoc et les commentaires

h Javadoc et intérêts
h Javadoc est aux classes ce que les pages de manuel (man) sont à
Unix ou ce que Windows Help est aux applications MS Windows
h Rédaction de la documentation technique des classes au fur et à
mesure du développement de ces mêmes classes puis génération
finale du html
h Utilisation
h L’entité documentée est précédée par son commentaire
h Suivre la description des méthodes, classes, …
h Utilisation de tags définit par javadoc permettant de typer certaines
informations (utilisation possible de balise html)
keulkeul.blogspot.com

@author Nom du ou des auteurs


@version Identifiant de version
@param Nom et signification de l’argument (méthodes uniquement)
@since Version du JDK où c’est apparu (utilisé par SUN)
@return Valeur de retour
@throws Classe de l’exception et conditions de lancement
@deprecated Provoque les avertissements de désapprobation
@see Référence croisée Cours Java - M. Baron - Page 171
Javadoc et les commentaires

h Exemple : source de la classe Object


package java.lang;
/**
* Class <code>Object</code> is the root of the class hierarchy.
* Every class has <code>Object</code> as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @version 1.58, 12/03/01
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
/**
* Returns the runtime class of an object. That <tt>Class</tt>
* object is the object that is locked by <tt>static synchronized</tt>
* methods of the represented class.
*
* @return the object of type <code>Class</code> that represents the
* runtime class of the object.
*/
public final native Class getClass();
keulkeul.blogspot.com

...

h Génération du code html à partir de l’outil javadoc


Pour obtenir les javadoc [options] nomDesClassesJava.java
informations de javadoc
javadoc -help
Cours Java - M. Baron - Page 172
Javadoc et les commentaires

h Exemple : aperçu html de la description de la classe Object


générée avec javadoc
keulkeul.blogspot.com

Cours Java - M. Baron - Page 173


Jar

h Jar et intérêts
h L’archiveur jar est l’outil standard pour construire les archives qui ont
le même objectif que les bibliothèques de programmes utilisées par
certains langages de programmation (lib par exemple)
java –verbose HelloWorld

Montre les archives


utilisées pour exécuter le
programme HelloWorld

h Utilisation pour la création


h Utilisation de l’outil jar
keulkeul.blogspot.com

h Pour créer un fichier .jar contenant les fichiers du répertoire courant


jar cvf hello.jar .
Le . indique le
répertoire courant
Création Verbose Nom archive
Cours Java - M. Baron - Page 174
Jar

h Utilisation pour la création (suite)


h Utilisation d’un fichier manifeste (MANIFEST.MF) pour préciser un
ensemble d’attributs pour exécuter
h L’attribut Main-class par exemple permet de connaître la classe
principale à exécuter
Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-class: HelloWorld

MANIFEST.MF
h Création du jar avec un fichier manifeste :
jar cvfm hello.jar MANIFESTE.MF .
keulkeul.blogspot.com

h Utilisation pour l’exécution


La classe HelloWorld est
java –jar hello.jar chargée par l’intermédiaire
du fichier MANIFESTE.MF
Cette option permet d’exécuter à
partir d’une archive du code java Cours Java - M. Baron - Page 175
Exception
h Définition
h Une exception est un signal indiquant que quelque chose d’exception-
nelle (comme une erreur) s’est produit.
h Elle interrompt le flot d’exécution normal du programme
h A quoi ça sert
h Gérer les erreurs est indispensable : mauvaise gestion peut avoir des
conséquences catastrophiques (Ariane 5)
h Mécanisme simple et lisible
h Regroupement du code réservé au traitement des erreurs
h Possibilité de « récupérer » une erreur à plusieurs niveaux d’une
application (propagation dans la pile des appels de méthodes)
keulkeul.blogspot.com

h Vocabulaire
h Lancer ou déclencher (throw) une exception consiste à signaler les
erreurs
h Capturer ou attraper (catch) une exception permet de traiter les
erreurs Cours Java - M. Baron - Page 176
Exception

h Exemple : lancer et capturer une exception


public class Point {
... // Déclaration des attributs

La classe
... // Autre méthodes et constructeurs

public Point(int x, int y) throws ErrConst {


if ((x < 0) || (y < 0)) throw new ErrConst();
ErrConst n’est
this.x = x ; this.y = y; pas encore
définie. A voir
}

public void affiche() {


System.out.println("Coordonnées : " + x + " " + y);
plus tard
} public class Test {
} public static void main(String[] argv) {
try {
Point a = new Point(1,4);
a.affiche();
a = new Point(-2, 4);
a.affiche();
keulkeul.blogspot.com

} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.exit(-1);
}
}
}

Cours Java - M. Baron - Page 177


Exception : mécanisme

h Explication
h Lorsqu’une situation exceptionnelle est rencontrée, une exception est
lancée Méthode n

h Si elle n’est pas traitée, elle est transmise au bloc 1

bloc englobant, …, jusqu’à ce qu’elle soit bloc 1.1

traitée ou parvienne en haut de la pile


d’appel. Elle stoppe alors l’application bloc 2

Méthode bloc 2.1


Méthode 11
bloc 2.1.1

Méthode
Méthode 22
bloc 2.1.2
keulkeul.blogspot.com



appel de Méthode
Méthode nn
bloc 2.2
méthode

transmission Une exception vient


d'exception de se produire
Cours Java - M. Baron - Page 178
Exception : lancer ou déclencher

h Une méthode déclare qu’elle peut lancer une exception par le


mot clé throws Permet au
public Point(int x, int y) throws ErrConst {
... constructeur Point de
} lancer une exception
ErrConst
h Soit la méthode lance une exception, en créant une nouvelle
valeur (un objet) d’exception 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;
Création d’une
} nouvelle valeur
d’exception
keulkeul.blogspot.com

h Soit la méthode appelle du code qui lance une exception


public Point(int x, int y) throws ErrConst { private void checkXYValue(in x, int y)
checkXYValue(x,y); throws ErrConst {
this.x = x ; this.y = y; if ((x < 0) || (y < 0))
} throw new ErrConst();
}
Cours Java - M. Baron - Page 179
Exception : capturer ou attraper

h On parle ici de gestionnaire d’exception. Il s’agit de traiter


par des actions la situation exceptionnelle
h On délimite un ensemble d’instructions susceptibles de
déclencher une exception par des blocs try {…}
try {
Point a = new Point(1,4); Méthodes à risques. Elles
sont « surveillées »
a.affiche();
a = new Point(-2, 4);
a.affiche();
}

h La gestion des risques est obtenue par des blocs


catch(TypeException e) {…}
keulkeul.blogspot.com

} catch (ErrConst e) {
System.out.println("Erreur Construction");
System.exit(-1);
}

h Ces blocs permettent de capturer les exceptions dont le type est


spécifié et d’exécuter des actions adéquates Cours Java - M. Baron - Page 180
Exception : capturer ou attraper

h Compréhension du mécanisme de capture


public class Test {
public static void main(String[] argv) {
try {
Point a = new Point(1,4);

a.affiche();

a = new Point(-2, 4);

a.affiche();
} catch (ErrConst e) {
System.out.println("Erreur Construction"); L’erreur exceptionnelle
System.exit(-1); est traitée par le bloc
}
...
catch
}
}
keulkeul.blogspot.com

Puis, il y a poursuite de l’exécution en


dehors du bloc try catch
Remarque : si erreur le programme
s’arrête (System.exit(-1))
Cours Java - M. Baron - Page 181
Exception : modélisation

h Les exceptions en Java sont considérées comme des objets


h Toute exception doit être une instance d’une sous-classe de
la classe java.lang.Throwable
Erreur que l’on peut
Erreurs non récupérables.
Throwable traiter puisque
« Plantage » de l’application récupérable

Error Exception
keulkeul.blogspot.com

NullPointerException ErrConst
Pour définir de nouveaux
types d’exception, on sous-
classera la classe
Exception
Cours Java - M. Baron - Page 182
Exception : modélisation

h Les exceptions sont des objets nous pouvons donc définir


h Des attributs particuliers
Contient un message
h Des méthodes Exception d’erreur décrivant
l’exception
- message : String
+ Exception()
Renvoie le message d’erreur + Exception(String) Constructeur avec ou
décrivant l’exception + getMessage() : String sans argument
+ printStackTrace()
+ …

Classe très simple,


puisque rien n’a été
keulkeul.blogspot.com

Affiche sur la sortie erreur redéfini


standard la liste des appels ErrConst
de méthodes ayant conduit
à l’exception public class ErrConst extends Exception {
public ErrConst() {
...
}
}
Cours Java - M. Baron - Page 183
Exception : modélisation

h Exemple : utilisation de l’objet ErrConst


Erreur de type ErrConst
qui hérite de Exception
public class Test {
public static void main(String[] argv) {
try {
...
} catch (ErrConst e) {
System.out.println("Erreur Construction"); Affichage de l’erreur
System.out.println(e.getMessage());

e.printStackTrace();

System.exit(-1);
} Affichage de la liste des
}
...
méthodes
keulkeul.blogspot.com

Cours Java - M. Baron - Page 184


Exception : attraper les tous …

h Il est possible de capturer plus d’une 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;
Définition d’une
} nouvelle méthode
public Point(int x, int y) throws ErrConst { qui lance une
if ((x < 0) || (y < 0)) throw new ErrConst();
this.x = x ; this.y = y;
exception
}

...
public class Test {
}
public static void main(String[] argv) {
try {
... // Bloc dans lequel on souhaite détecter
les exceptions ErrConst et ErrDepl Attrape la nouvelle
} catch (ErrConst e) { exception de type
keulkeul.blogspot.com

ErrDepl
System.out.println("Erreur Construction");
System.exit(-1);
} catch (ErrDepl e) {
System.out.println("Erreur Déplacement");
System.exit(-1);
}
}
}

Cours Java - M. Baron - Page 185


Exception : attrapez les tous …

h Toute méthode susceptible de lever une exception doit


h Soit l’attraper (bloc try catch)
h Soit déclarer explicitement qu’elle peut lancer une exception (mot clé
throws)
h Les exceptions déclarées dans la clause throws d’une
méthode sont …
Les exceptions levées dans des
Les exceptions levées dans la
méthodes (checkXYValue) appelées
méthode (Point) et non attrapées par
par la méthode (Point) et non
celle-ci
attrapées par celle-ci
keulkeul.blogspot.com

public Point(int x, int y) throws ErrConst { public Point(int x, int y) throws ErrConst {
if ((x < 0) || (y < 0)) throw new ErrConst(); checkXYValue(x,y);
this.x = x ; this.y = y; this.x = x ; this.y = y;
} }
private void checkXYValue(in x, int y) throws
ErrConst {
if ((x < 0) || (y < 0))
throw new ErrConst();
}

Cours Java - M. Baron - Page 186


Exception : attrapez les tous …

h Il faut s’assurer que les exceptions soient sous contrôle


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(...); }
}
}
keulkeul.blogspot.com

Ne pas oublier de traiter une


exception sinon le compilateur
ne vous loupe pas!!!! Cours Java - M. Baron - Page 187
Exception : attrapez les tous …

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

Soit en ajoutant explicitement Soit en entourant d’un bloc


l’instruction throws à la try … catch la méthode
méthode transformer de façon qui peut poser problème
à rediriger l’erreur
keulkeul.blogspot.com

public void transformer() {


public void transformer() try {
throws ErrDepl { ...
... this.deplace(...);
this.deplace(...); } catch (ErrDepl e) {
} e.printStackTrace();
}
}

Cours Java - M. Baron - Page 188


Exception : transmission d’information

h Possibilité d’enrichir la classe ErrConst en ajoutant des


attributs et des méthodes de façon à communiquer
public class Point {
public Point(int x, int y) throws ErrConst { ErrConst
if ((x < 0) || (y < 0)) throw new ErrConst(x,y);
this.x = x ; this.y = y; - abs, ord : int
} public class ErrConst extends Exception {
... private int abs, ord; + ErrConst(x,y)
}
+ getAbs : int
public ErrConst(int x, int y) {
this.abs = x; + getOrd : int
this.ord = y;
}

public int getAbs() { return this.abs; }


public int getOrd() { return this.ord; }
} ErrConst permet de
public class Test {
public static void main(String[] argv) { connaître les valeurs
keulkeul.blogspot.com

try {
...
qui ont fait échouer la
a = new Point(-2, 4); construction de Point
} catch (ErrConst e) {
System.out.println("Erreur Construction point");
System.out.println("Coordonnées souhaitées : "
+ e.getAbs() + " " + e.getOrd());
System.exit(-1);
}...
Cours Java - M. Baron - Page 189
Exception : finally

h Bloc finally : c’est une instruction optionnelle qui peut servir


de « nettoyage »

h Elle est exécutée quel que soit le résultat du bloc try (c’est-
à-dire qu’il ait déclenché ou non une exception)

h Permet de spécifier du code dont l’exécution est garantie


quoi qu’il arrive

h L’intérêt est double


keulkeul.blogspot.com

h Rassembler dans un seul bloc un ensemble d’instructions qui


autrement auraient du être dupliquées

h Effectuer des traitements après le bloc try, même si une exception a


été levée et non attrapée par les blocs catch
Cours Java - M. Baron - Page 190
Exception : finally

h Exemple : terminer correctement avec finally


public class Test {
public static void main(String[] argv) {
try {
... // Bloc dans lequel on souhaite détecter
les exceptions ErrConst et ErrDepl
} catch (ErrConst e) { Ces instructions sont
System.out.println("Erreur Construction");
System.out.println("Fin du programme"); rappelées plusieurs
System.exit(-1);
} catch (ErrDepl e) { fois
System.out.println("Erreur Déplacement");
System.out.println("Fin du programme");
System.exit(-1);
public class Test {
}
public static void main(String[] argv) {
}
try {
}
... // Bloc dans lequel on souhaite détecter
les exceptions ErrConst et ErrDepl
} catch (ErrConst e) {
System.out.println("Erreur Construction");
Au moyen du mot
keulkeul.blogspot.com

} catch (ErrDepl e) {
clé finally, il est System.out.println("Erreur Déplacement");
} finally {
possible de System.out.println("Fin du programme");
System.exit(-1);
factoriser }
}
}

Cours Java - M. Baron - Page 191


Exception : pour ou contre

h Exemple : gérer les erreurs sans les exceptions


erreurType lireFichier() {
int codeErreur = 0;
// Ouvrir le fichier
if (isFileIsOpen()) {
La gestion des
// Détermine la longueur du fichier erreurs devient très
if (getFileSize()) {
// Vérification de l’allocation de la mémoire difficile
if (getEnoughMemory()) {
// Lire le fichier en mémoire
if (readFailed()) {
codeErreur = -1;
} Difficile de gérer les
} else {
codeErreur = -2; retours de fonctions
}
} else {
codeErreur = -3;
}
keulkeul.blogspot.com

// Fermeture du fichier
if (closeTheFileFailed()) {
Le code devient de
codeErreur = - 4; plus en plus
conséquent
}
} else {
codeErreur = - 5;
}
}
Cours Java - M. Baron - Page 192
Exception : pour ou contre

h Le mécanisme d’exception permet


h La concision void lireFichier() {
try {
h La lisibilité // Ouvrir le fichier
// Détermine la longueur du fichier
// Vérification de l’allocation de la mémoire
// Lire le fichier en mémoire
// Fermer le fichier
} catch (FileOpenFailed) {
...
} catch (FileSizeFailed) {
...
} catch (MemoryAllocFailed) {
...
} catch (FileReadFailed) {
...
} catch (FileCloseFailed) {
keulkeul.blogspot.com

...
}
}

Préférer cette solution à la


précédente. Programmation
propre et professionnelle
Cours Java - M. Baron - Page 193
Exception : les exceptions courantes

h Java fournit de nombreuses classes prédéfinies dérivées de la


classe Exception
h Ces exceptions standards se classent en deux catégories
h Les exceptions explicites (celles que nous avons étudiées), mention-
nées par le mot clé throws
h Les exceptions implicites qui ne sont pas mentionnées par le mot clé
throws
h Liste de quelques exceptions
h ArithmeticException (division par zéro)
keulkeul.blogspot.com

h NullPointerException (référence non construite)


h ClassCastException (problème de cast)
h IndexOutOfBoundsException (problème de dépassement d’index dans
tableau) Cours Java - M. Baron - Page
194
Les flux

h Pour obtenir des données, un programme ouvre un flux de

données sur une source de données (fichier, clavier,

mémoire, etc.)

h De la même façon pour écrire des données dans un fichier,

un programme ouvre un flux de données

h Java fournit un paquetage java.io qui permet de gérer les flux


keulkeul.blogspot.com

de données en entrée et en sortie, sous forme de caractères

(exemple fichiers textes) ou sous forme binaire (octets, byte)


Cours Java - M. Baron - Page 195
Les flux

h En Java, le nombre de classes intervenant dans la manipula-


tion des flux est important (plus de 50)
h Java fournit quatre hiérarchies de classes pour gérer les flux
de données
h Pour les flux binaires
h La classe InputStream et ses sous-classes pour lire des octets
(FileInputStream)
h La classe OuputStream et ses sous-classes pour écrire des octets
(FileOuputStream)
keulkeul.blogspot.com

h Pour les flux de caractères


h La classe Reader et ses sous-classes pour lire des caractères
(BufferedReader, FileReader)
h La classe Writer et ses sous-classes (BufferedWriter, FileWriter)
Cours Java - M. Baron - Page 196
Les flux de caractères

h Exemple : écrire du texte dans un fichier

FileWriter hérite de Writer et


permet de manipuler un flux
texte associé à un fichier

public class TestIO {


public static void main(String[] argv) {
FileWriter myFile = new FileWriter("a_ecrire.txt");

myFile.write("Voilà ma première ligne dans un fichier");

myFile.close();
}
keulkeul.blogspot.com

Ecriture d’une ligne de


Fermeture du flux texte dans le fichier
myFile vers le fichier « a_ecrire.txt »
a_ecrire.txt
Cours Java - M. Baron - Page 197
Les flux de caractères

h Exemple : lire l’entrée standard : enfin !!!


« Convertit » un objet
de type InputStream
public class TestIO { en Reader
public static void main(String[] argv) {
System.out.print("Veuillez saisir votre nom :");

String inputLine = " ";


try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));

inputLine = is.readLine();

is.close(); Lit la ligne jusqu’au


} catch (Exception e) {
System.out.println("Intercepté : " + e);
prochain retour
} chariot
if (inputLine != null)
keulkeul.blogspot.com

System.out.println("Votre nom est :" + inputLine);


}
}

Chaîne saisie

Cours Java - M. Baron - Page 198


Les flux de caractères

h Exemple : copie de fichier en utilisant les caractères


FileReader et
FileWriter héritent
public class TestIO {
de Reader et Writer public static void main(String[] argv) {
FileReader in = new FileReader("a_lire.txt");
et permettent de FileWriter out = new FileWriter("a_ecrire.txt");
int c;
manipuler un flux
while ((c = in.read()) != -1) {
texte associé à un out.write(c);
fichier texte }

in.close();
out.close();
}
Transfert de
keulkeul.blogspot.com

données jusqu’à ce
que in ne fournisse Fermeture des flux
et par conséquent
plus rien
des fichiers
respectifs Cours Java - M. Baron - Page 199
Les flux binaires

h Exemple : copie de fichier en utilisant les binaires


Même raisonnement
que pour les
caractères sauf …

public class TestIO {


public static void main(String[] argv) {
FileInputStream in = new FileInputStream("a_lire.txt");
FileOutputStream out = new FileOutputStream("a_ecrire.txt");
int c;

while ((c = in.read()) != -1) {


out.write(c);
}
keulkeul.blogspot.com

in.close();
out.close();
}
}

Cours Java - M. Baron - Page 200


La classe File

h Java dispose d’une classe File qui offre des fonctionnalités


de gestion de fichiers
Attention : ne pas
h La création d’un objet de type File confondre la création de
l’objet avec la création du
File monFichier = new File("truc.dat"); fichier physique

Création du fichier
File portant le nom de name
- name : String
+ File(String nf) Vérifie si le fichier existe
+ createNewFile() physiquement
+ delete() : booléen
keulkeul.blogspot.com

+ exists() : booléen File monFichier = new File("c:\toto.txt");


+ getName() : String if (monFichier.exists()) {
monFichier.delete();
+ isFile() : booléen } else {
+ … monFichier.createNewFile();
}

Cours Java - M. Baron - Page 201


Les collections

h Pour l’instant nous avons étudié le tableau pour structurer


les données
h Taille statique

h Lent pour la recherche d’éléments particuliers

h Impossibilité d’utiliser un pattern de déplacement dans les éléments

h Java propose depuis la version 2 des classes permettant de


manipuler les principales structures de données
keulkeul.blogspot.com

h Les tableaux dynamiques implémentées par ArrayList et Vector

h Les listes implémentées par LinkedList

h Les ensembles implémentées par HashSet et TreeSet


Cours Java - M. Baron - Page 202
Les collections

h Ces classes implémentent toutes indirectement une même


interface Collection qu’elles complètent de fonctionnalités
propres
Collection << Interface >> LinkedList

TreeSet HashSet

HashSet ArrayList

h Depuis la version 5 de Java, possibilité d’utiliser les génériques


pour typer le contenu des Collections
keulkeul.blogspot.com

h Avant : Voiture maVoiture = (Voiture)myList.get(2)


h Maintenant : Voiture maVoiture = myList.get(2)
Plus de problème de
conversion explicite
Cours Java - M. Baron - Page 203
Les collections

h L’interface Collection permet


h La généricité et références : possibilité de stocker des éléments de
type quelconque, pour peu qu’il s’agisse d’objets. Un nouvel élément
introduit dans une collection Java est une référence à l’objet et non
une copie

h Les itérateurs : ils permettent de parcourir un par un les différents


éléments d’une collection

h Efficacité des opérations sur des collections


keulkeul.blogspot.com

h Opérations communes à toutes les collections : les collections que


nous allons étudier implémentent toutes au minimum l’interface
Collection, de sorte qu’elles disposent de fonctionnalités communes
Cours Java - M. Baron - Page 204
Les collections : les génériques Java

h Avec la version 5 de Java possibilité d’exploiter les génériques


dans les collections et pour d’autres aspects du langage
h Une syntaxe particulière a été rajoutée de manière à prendre
en considération les génériques
h < ? > : signale qu’il faut préciser le type de la classe
h < ? , ? > : signale qu’il faut préciser deux types
h Avec les génériques il va être possible de fixer lors de la
construction de la collection le type du contenu stocké dans
les collections
h Avantages
keulkeul.blogspot.com

h Toutes les méthodes accesseurs et modifieurs qui manipulent les


éléments d’une collection sont signés suivant le type défini à la
construction de la collection
h Vérification des types pendant le développement (avant problème de
CastClassException) Cours Java - M. Baron - Page 205
Les collections : Iterator

h Les itérateurs permettent de parcourir les éléments d’une


collection sans connaissance précise du type de la collection :
Polymorphisme
h Il existe deux familles d’itérateurs
h monodirectionnels
Le parcours de la collection se fait d’un début vers une fin; l’accès à un
élément ne se fait qu’une seule fois
h bidirectionnels
Le parcours de la collection peut se faire dans les deux sens ;
keulkeul.blogspot.com

possibilité d’avancer et reculer à sa guise dans la collection

La notion d’Iterator fait


partie de l’ensemble des
Design Patterns
Cours Java - M. Baron - Page 206
Les collections : Iterator

h Itérateur monodirectionnel : interface Iterator


h Par défaut, toutes collections possèdent un attribut de type Iterator

Vérifie s’il y a un Iterator << Interface >>


Permet d’obtenir
prochain + hasNext() : booléen
+ next() : < ? >
l’objet courant et
+ remove() passe au suivant
Supprime le dernier
objet renvoyé par
next() c est une
collection et on
récupère son
Iterator iter = c.iterator(); Iterator
keulkeul.blogspot.com

On récupère
while (iter.hasNext()) {
On vérifie s’il y a
possibilité de ??? o = iter.next(); l’objet courant
récupérer un }
...
puis on passe au
objet suivant
Cours Java - M. Baron - Page 207
Les collections : Iterator

h Itérateur bidirectionnel : interface ListIterator


h Cela concerne les listes et les tableaux dynamiques
h Permet d’ajouter et de supprimer des objets Iterator << Interface >>
Vérifie s’il y a un
précédent ListIterator << Interface >>
+ previous() : < ? > Ajoute ou modifie à
+ hasPrevious() : booléen la position courante
On vérifie s’il y a + add(< ? >)
un élément de la
possibilité de + set(< ? >)
collection
+ …
récupérer un objet
précédemment c est une
collection et on
keulkeul.blogspot.com

Iterator iter = c.listIterator();


récupère son
ListIterator
while (iter.hasPrevious()) {
Récupère l’objet
précédemment puis ??? o = iter.previous(); Initialise en début
on passe au }
...
de liste
précédent Cours Java - M. Baron - Page 208
Les collections : LinkedList

h Cette classe permet de manipuler des listes dites doublement


chaînées
h A chaque élément de collection, on associe implicitement
deux informations qui sont les références à l’élément
précédent et suivant
… c a c a b a b …

LinkedList<String> l1 = new LinkedList<String>(); Ajout des


ListIterator iter = l1.listIterator();
éléments au
Plus rien iter.add("Bonjour"); travers de
keulkeul.blogspot.com

après ses iter.add("Coucou");


l’itérateur
éléments, while(iter.hasPrevious()) {
L’utilisation de
on fait un String o = iter.previous();
System.out.println(o); la LinkedList est
retour en } transparente
arrière
Cours Java - M. Baron - Page 209
Les collections : LinkedList

h Possibilité d’utiliser les collections (ici LinkedList est un


exemple) sans les itérateurs mais moins performant !!!

LinkedList<String> l1 = new LinkedList<String>();


L’utilisation
de la
l1.add("Bonjour");
l1.add("Coucou");
LinkedList
n’est pas
for (int i = 0; i < l1.size(); i++) { transparente.
String o = l1.get(i);
System.out.println(o); Connaissance
} obligatoire
de ces
Utilisation de
méthodes
keulkeul.blogspot.com

la méthode
add de la Ne pas modifier la collection
classe (add de LinkedList) pendant
LinkedList qu’on utilise l’itérateur (next())

Cours Java - M. Baron - Page 210


Les collections : ArrayList

h La classe ArrayList est une encapsulation du tableau avec la


possibilité de le rendre dynamique en taille
h Possibilité d’utiliser des ListIterator mais on préfère son
utilisation à un élément 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("Chaîne:" + ((String)myObject));
keulkeul.blogspot.com

if (my_object instanceof Integer) {


System.out.println("Integer:" + ((Integer)myObject));
}
Préférer
} l’utilisation de
la classe ArrayList au
lieu de la classe Vector Cours Java - M. Baron - Page 211
Les collections : HashSet

h La classe HashSet permet de gérer les ensembles

h Deux éléments ne peuvent être identiques

h Prévoir deux choses dans vos classes

h La redéfinition de la méthode hashCode() qui est utilisée pour

ordonnancer les éléments d’un ensemble (calcul la table de hachage

d’un objet)
keulkeul.blogspot.com

h La redéfinition de la méthode equals(Object) qui compare des objets

de même classe pour connaître l’appartenance d’un élément à

l’ensemble
Cours Java - M. Baron - Page 212
Les collections : HashSet

h Exemple : gestion de points avec HashSet


public class TestHashSet {
public static void main(String[] argv) {
Point p1 = new Point(1,3); Point p2 = new Point(2,2);
Point p3 = new Point(4,5); Point 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 déjà présent");
System.out.print("Ensemble = "); affiche(ens);
}
}

public static void affiche(HashSet ens) {


keulkeul.blogspot.com

Iterator iter = ens.iterator();


while(iter.hasNext()) {
Point p = iter.next();
p.affiche();
}
System.out.println();
}
}

Cours Java - M. Baron - Page 213


Les collections : HashSet

h Exemple : gestion de points avec HashSet


public class Point {
private int x,y;

Point(int x, int y) {
Redéfinition des
this.x = x; this.y = y; méthodes hashCode()
et equals(Object)
}
public int hashCode() {
return x+y;
}
public boolean equals(Object pp) {
Point p = (Point)pp;
return ((this.x == p.x) &
(this.y == p.y));
}
public void affiche() {
System.out.print("[" + x + " "
+ y + "] ");
}
}
keulkeul.blogspot.com

Cours Java - M. Baron - Page 214


Programmation Orientée Objet application au langage
Java

Bilan

Mickaël BARON - 2008 (Rév. Août 2009)


mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
Bilan

h Ce que nous avons appris


h Se familiariser avec la programmation orientée objet avec Java
h Les concepts principaux de l’orientée objet (encapsulation, héritage
et polymorphisme)
h Aperçu des API les plus importantes de la plateforme Java

h Perspectives futures
h Le langage Java est en constante évolution. Chaque nouvelle
version apporte son lot de nouvelles fonctionnalités
keulkeul.blogspot.com

h Structurer les classes en appliquant les patterns de conception


(Design Pattern)
h Le langage Java est un point de départ pour concevoir des
applications serveur avec Java Entreprise Edition
Cours Java - M. Baron - Page 216