Vous êtes sur la page 1sur 88

Le langage Java

Le langage
Java

MSIAG 2007-2008 UML & POO – Section 3 1


Chapitres

1 - Présentation générale

2 - Les bases du langage

3 - La gestion des objets

4 - Les exceptions

5 - Collections

MSIAG 2007-2008 UML & POO – Section 3 2


Java – Chapitre 1

Présentation
Générale

MSIAG 2007-2008 UML & POO – Section 3 3


Généralités

Langage Orienté-Objet récent (1995)

Développé par Sun MicroSystem

Doté d’une bibliothèque de classes très riche

Multi-plateformes (windows, unix, linux)

Compilateurs et environnements gratuits

Supporté par une grande communauté open source

MSIAG 2007-2008 UML & POO – Section 3 4


La machine virtuelle (JVM)

La JVM permet à Java d’être indépendant de la plate-forme cible

Java est un langage semi-compilé

La phase de compilation génère un pseudo-code (bytecode)

interprété par la machine virtuelle java à l’exécution

Le bytecode est indépendant de l’architecture matérielle

d’exécution

Le code java peut donc s’exécuter sur n’importe quelle plateforme

MSIAG 2007-2008 UML & POO – Section 3 5


Les API Java

La « richesse » de Java :

Un grand nombre de classes prédéfinies et standardisées

Classes conçues pour fonctionner sur tout type de plate-


forme
API Fonctionnalités

java.lang Types de données / éléments de base

java.swing Graphisme 2D et IHM

Java 3D Graphisme 3D s’appuyant sur les bibliothèques OpenGL et DirectX

JDBC Accès aux bases de données relationnelles

java.xml Gestion de données XML

java.io Entrées-sorties

Etc …

MSIAG 2007-2008 UML & POO – Section 3 6


Un peu de lecture …

Les sites web

http://java.sun.com/docs/books/tutorial/ (en anglais)

Thinking in Java : http://www.mindview.net/Books/TIJ/

Exemples de codes : http://www.exampledepot.com/

Les livres en français

Programmer en Java de Claude Delannoy

Etc …

MSIAG 2007-2008 UML & POO – Section 3 7


Java – Chapitre 2

Les bases
du langage

MSIAG 2007-2008 UML & POO – Section 3 8


Premier exemple

Définition du package.
package cours_java ;

import java.lang.* ; On importe les packages nécessaires


import java.io.* ;
Déclaration de la classe
class PremAppli {
Déclaration des attributs
private String maVariable ;

void maMethode () { Définitions des méthodes


maVariable = "BONJOUR" ;
}
une méthode « main »
static public void main (String argv [ ]) {
PremAppli monAppli = new PremAppli(); Création de l’objet monAppli
monAppli.maMethode ( ) ;
System.out.println (monAppli.maVariable) ; appel de méthode
}
}

MSIAG 2007-2008 UML & POO – Section 3 9


Règles et conventions d’écriture

Règles

Une classe Java = un fichier

Nom du fichier = <nom de la classe>.java - ex : PremAppli.java

Conventions

Nom du package en minuscules (ex : cours_java)

Nom de classe commençant par une majuscule - ex : PremAppli

Nom de méthode commençant par une minuscule


ex : trier(Liste)

Nom de constante entièrement en majuscule - ex : Math.PI

MSIAG 2007-2008 UML & POO – Section 3 10


Compilation - Exécution

Compilation avec la commande javac

javac [<options>] < fichiers source >

ex : javac PremAppli.java

On obtient un fichier PremAppli.class (du bytecode)

Exécution avec la commande java

java [<options>] < fichiers-de-classe avec une méthode


« main » >

ex : java PremAppli

Nous utiliserons Eclipse pour faciliter la compilation et l’exécution

MSIAG 2007-2008 UML & POO – Section 3 11


Les types de données

Valeur Taille
Type Contenu Valeur min. Valeur max.
par défaut (bits)

boolean true ou false false 1

char Caractères Unicode \u0000 16 \u0000 \uFFFF

byte Entier signé 0 8 -128 +127

short Entier signé 0 16 -32768 +32767

int Entier signé 0 32 -2147483648 +2147483647

long Entier signé 0 64 -9223372036854775808 +9223372036854775807

float Flottant IEEE 754 0.0 32 1.40239846 E -45 3.40282347 E +38

double Flottant IEEE 754 0.0 64 4.94…E -324 1.797… E +308

MSIAG 2007-2008 UML & POO – Section 3 12


Les types de données

Déclarations
int i = 5;
double x = 2.5;
boolean b = true;

Conversions

i = ( int ) x ; // i récupère la partie entière de x


int j = 3 ;
int k = i / j ; // k vaut 0 – division entière
double z = ((double) i) / ((double) j) ; // k vaut 0.6666666

MSIAG 2007-2008 UML & POO – Section 3 13


Les types de données

Notations

‘A’ ou ‘\u0041’ est une valeur de type char

3.14159f est une valeur de type float

3.14159d est une valeur de type double

0xa25c est une valeur de type int exprimée en

hexadécimal

MSIAG 2007-2008 UML & POO – Section 3 14


Références et objets

Tous les éléments du langage Java autre que les variables de type simple
(short, int, float, double …) sont manipulés par référence.
C’est le cas des tableaux et des chaînes de caractères

Une référence est un « pointeur caché » sur un objet créé dynamiquement en


mémoire

ClasseXXX ref1 = null ; ref1 Objet


ClasseXXX ref2 ;
ref2 Objet
ref1 = new ClasseXXX() ;
ref2 = new ClasseXXX() ; L’ancienne instance
référencée par ref2 est
ref2 = ref1 ; // référence la même instance perdue et sera détruite
par le « Garbage
Collector »

MSIAG 2007-2008 UML & POO – Section 3 15


Références et objets

Clonage
ClasseXXX ref1, ref2 ;
ref2 référence un nouvel
ref1 = new ClasseXXX ( ) ; objet, identique à celui
référencé par ref1
ref2 = ref1.clone ( ) ;
Test simplement le fait que
ref1 et ref2 référencent le
if (ref1 == ref2) … même objet

La méthode « equals » de la classe Object

if ( ref1.equals (ref2) ) …
if ( chaine1.equals ("abc") ) …

MSIAG 2007-2008 UML & POO – Section 3 16


Les tableaux

Les tableaux sont des objets particuliers


Créés dynamiquement et manipulés par référence

Les tableaux commencent à 0

Déclaration et affectation
int [ ] tableau ;
Constante ou
variable
tableau = new int [ 20 ] ;
int nb =12 ;

int [ ] tableau = new int [ nb ] ;


Initialisation statique
tableau [ 0 ] = 10 ;

int tableau [ ] = { 1, 2, 34, 56, 23 } ;

MSIAG 2007-2008 UML & POO – Section 3 17


Les tableaux

L’attribut « length »

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


tableau [ i ] = i ;
}

Objet (une instance) tableau


tableau

0 1 2 n-1

length n

MSIAG 2007-2008 UML & POO – Section 3 18


Les tableaux

Remarques importantes

Tout accès hors des limites d’un tableau lève une exception

Tout tableau peut comporter des éléments de type simple

Tous les éléments d’un tableau sont de même type

Les classes « Vector » et « ArrayList » sont des tableaux ne


pouvant contenir que des références sur des objets

« Vector » et « ArrayList » peuvent contenir des objets de


types différents et sont redimensionnables

MSIAG 2007-2008 UML & POO – Section 3 19


Les chaînes de caractères : String

Généralités

classe spécifique : « String »

Chaque caractère est codé en Unicode (2 octets)

Une chaîne est exprimée entre double quottes, ex :


String s = "abc" ;

String s = new String ( "abc" ) ;

L’opérateur « + » permet de concaténer des chaînes, ex :


String s = "abc" + "def" donnera "abcdef"

MSIAG 2007-2008 UML & POO – Section 3 20


Les chaînes de caractères

Principales méthodes
char c = ch1.charAt (0) ;
int longueur = ch1.length() ;
bOk = ch1.equals ("abc") ;
sousCh = ch1.substring (premPos, dernPos + 1) ;

Exemple
String fileName = " Fic.txt " ;
int n = fileName.length ( ) ;
String ext = fileName.substring (n – 3 , n) ;

MSIAG 2007-2008 UML & POO – Section 3 21


Les conversions

Conversion numérique String


String ch1, ch2 ;
int i = 5 ;
double x = 4.3 ;
ch1 = String.valueOf ( i ) ;
ch2 = String.valueOf ( x ) ;

Conversion String numérique


i = Integer.parseInt ( ch1 ) ;
x = Double.parseDouble ( ch2 ) ;

MSIAG 2007-2008 UML & POO – Section 3 22


Les conversions

Conversion Objet String


String ch ;
Integer nObj ;
ch = nObj.toString ( ) ;

Conversion String Objet


String ch = new String ( "234" ) ;
nObj = new Integer ( ch ) ;

String ch = new String ("TOTO" ) ; Conversion impossible !


Une exception de type
nObj = new Integer ( ch ) ; NumberFormatException
est levée

MSIAG 2007-2008 UML & POO – Section 3 23


Les instructions

Jeu de caractères Unicode (codé sur 2 octets)

3 types de commentaires
// commentaire jusqu ’à la fin de la ligne
/* commentaires sur plusieurs lignes */
/** commentaires pris en compte par javadoc */

Un identificateur
Ne doit pas commencer par un chiffre
Ne doit pas être un mot réservé du langage

MSIAG 2007-2008 UML & POO – Section 3 24


Les instructions

Test simple

if ( a == b ) {
// plusieurs instructions
}
else {
// plusieurs instructions
}

MSIAG 2007-2008 UML & POO – Section 3 25


Instructions : les boucles

Boucles for Java 5 uniquement

for ( int i = 0 ; i < 10 ; i++ ) { String[] data = { "Toronto", "Stockholm" };


for (String s : data) {
tableau [ i ] = i ; System.out.println(s);
} }

Boucles while / do while


int i = 100 ; do { // faire au moins 1 fois
while ( i > 10 ) { // instructions
i -- ;
} while ( i != 0) ;
// plusieurs instructions
}

MSIAG 2007-2008 UML & POO – Section 3 26


Instructions : les débranchements

Boucles sans fin et débranchements

for ( ; ; ) {
// il faut en sortir !!!
}

break ; // sortie de boucle


return ; // sortie de méthode
continue ; // pas suivant d’une boucle
exit (0) ; // sortie de programme

MSIAG 2007-2008 UML & POO – Section 3 27


Les opérateurs

Opérateurs Rôle

+ Addition

- Soustraction / Opposé

* Multiplication

/ Division

= Affectation

> Supérieur

< Inférieur

>= Supérieur ou égal

<= Inférieur ou égal

== Test d’égalité

! Négation logique

!= Différence

MSIAG 2007-2008 UML & POO – Section 3 28


Les opérateurs

Opérateurs Rôle

++ Incrémentation ( pré ou post : ++ i ou i ++ )

-- Décrémentation ( pré ou post : -- i ou i -- )

% Modulo

&& « Et » logique

|| « Ou » logique

+= i += j équivaut à i = i + j

-= i -= j équivaut à i = i - j

*= i *= j équivaut à i = i * j

/= i /= j équivaut à i = i / j

() Conversion de type

instanceof Test d’appartenance à une classe

MSIAG 2007-2008 UML & POO – Section 3 29


Les opérateurs

instanceof : tester le type d’un objet


Vector tableau = new Vector ( ) ;
tableau.add ( new String ("abc") ) ;
tableau.add ( new Integer (5) ) ; ElementAt retourne un
element de type Object
int index = 0 ;
Object element = tableau.elementAt (index) ;

if ( element instanceof String ) { On peut traiter l’élément


comme une String
String chElement = (String) element ;

}

MSIAG 2007-2008 UML & POO – Section 3 30


Java – Chapitre 3

La gestion des
objets

MSIAG 2007-2008 UML & POO – Section 3 31


Les « packages »

Définition

Les « packages » permettent de regrouper des classes

Le regroupement est motivé par une thématique ou un

objectif commun

Le nom des « packages » doit s’apparenter à la structure des

répertoires, exemple : le package projet.dev.utils

correspond au répertoire projet / dev / utils

MSIAG 2007-2008 UML & POO – Section 3 32


Les « packages »

Déclaration

A la création : package projet.dev.utils ;


Doit apparaître sur la première ligne du fichier

Si l’instruction est omise, le fichier appartient au package par défaut

Toujours mettre un package !

A l’utilisation : import projet.dev.utils ;


Permet d’utiliser les noms abrégés des classes, ex :
Vector au lieu de java.util.Vector

Le caractère « * » permet d’importer toutes les classes d’un package


Ex : import java.awt.* ;

Le caractère « * » n’importe pas les sous packages (non récursif !)

MSIAG 2007-2008 UML & POO – Section 3 33


Les « packages »

Intérêts

Mise à disposition « structurée » de classes


Trouver les classes à charger lors du lancement de la JVM

Répertoires qui correspondent au nom des packages

Un fichier d’archive (.jar) contient une arborescence de packages

Éviter les conflits entre classes de même nom développées


par des programmeurs différents
fr.anpe.Offre : offre d’emploi

com.bnp.Offre : offre commerciale spécifique à la BNP

Délimiter un espace de visibilité de niveau « package »

MSIAG 2007-2008 UML & POO – Section 3 34


Les « packages »

Visibilité

Toute classe d’un package est accessible depuis toutes les


autres classes du même package

Seules les classes « public » sont accessibles d’un autre


package

Un membre d’une classe est accessible depuis une autre


classe du package s’il n’est pas « private »

Un élément « protected » est accessible depuis le package

MSIAG 2007-2008 UML & POO – Section 3 35


Les « packages » : exemples

Nom du package Contenu

java.lang Bases du langages ( type de données )

java.io Entrées - Sorties

java.math Fonctions mathématiques (sin, cos, tang …)

java.xml Gestion des données XML

javax.swing Classes graphiques, IHM

java.util Classes utilitaires (Vector, Stack …)

java.applet Codage des applets

java.net Applications réseau

java.rmi Réseau avec technologie RMI

java.beans Objets « métier »

java.security Classes liées aux aspects sécurité

MSIAG 2007-2008 UML & POO – Section 3 36


Les classes

Définition
Entité décrivant une structure de données (variables) et des
méthodes opérant sur cette données

public class Cercle {


Déclaration des variables
private double x, y ;
private double r ;
public double perimetre ( ) {
return 2 * Math.PI * r ;
} Déclaration et définition des
public double aire ( ) { méthodes
return Math.PI * r * r ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 37


Les classes

Déclaration et utilisation

public class MonProgramme {

static public void main ( String argv [ ] ) {


Cercle c = new Cercle() ;
c.setX(50.0) ;
c.setY(50.0) ;
c.setR(100.0);
double aire = c.aire ();
System.out.println("aire du cercle c" + aire);
}
}

MSIAG 2007-2008 UML & POO – Section 3 38


Le mot clé « this » : auto référence

this est une référence correspondant à l’objet sur lequel on


appelle une méthode.
public class Cercle { public class MonProgramme {
private double x, y ; static public void main ( String argv [ ] ) {
private double r ; Cercle c = new Cercle() ;
public double perimetre ( ) { c.setX(50.0) ;
return 2 * Math.PI * this.r ; c.setY(50.0) ;
} c.setR(100.0);
public double aire ( ) { double per = c.perimetre( ) ;
return Math.PI * r * r ; }
} }
}

Le this présent dans la méthode périmètre() correspond


à l’objet c sur lequel on appelle périmètre()

MSIAG 2007-2008 UML & POO – Section 3 39


Les constructeurs

Méthodes particulières permettant de créer un objet

Le nom du constructeur doit être celui de la classe

Le constructeur n’a pas de retour

public class Cercle {



public Cercle ( double x, double y, double r ) {
this.x = x ; this.y = y ; this.r = r ;
}
… Cercle c = new Cercle (60.0, 80.0, 120.0) ;
}

this permet de différencier l’attribut x


de la classe Cercle du paramètre x

MSIAG 2007-2008 UML & POO – Section 3 40


Les constructeurs

public class Cercle {



public Cercle ( double X, double Y, double R ) {
this.x = X ; this.y = Y ; this.r = R ;
}
public Cercle ( ) {
Cercle c1 = new Cercle (60.0, 80.0, 120.0) ;
x=0; y=0 ; r=0;
Cercle c2 = new Cercle ( ) ;
}
Cercle c3 = new Cercle ( c1 ) ;
public Cercle ( Cercle c1 ) {
this.x = c1.x ; this.y = c1.y ; this.r = c1.r ;
}

}

MSIAG 2007-2008 UML & POO – Section 3 41


Les constructeurs

Remarques importantes

Si aucun constructeur n’est défini dans la classe, Java en


crée un par défaut permettant d’allouer l’espace mémoire
pour un objet

S’il existe un constructeur ayant au moins un paramètre il


n’est plus possible d’écrire : refObj = new ClasseXXX( );

Il est fortement conseillé de définir soi-même un constructeur


pour chaque classe plutôt que de laisser faire Java.

MSIAG 2007-2008 UML & POO – Section 3 42


L’encapsulation

Règles à suivre pour respecter le principe d’encapsulation :

Définir au moins un constructeur, on évite ainsi de laisser le


constructeur par défaut fourni par Java

Maintenir « private » les données internes à la classe

Définir des méthodes « public » permettant d’accéder aux


données internes – getXxx ( ) et setXxx ( … ) ;

Définir « protected » les éléments que l’on veut laisser


accessible aux classes filles (voir héritage)

Ne rien définir = visibilité de package = encapsulation faible

MSIAG 2007-2008 UML & POO – Section 3 43


L’encapsulation

Exemple dans les « règles de l’art »


public class Cercle {
private double x, y ;
private double r ;
public Cercle ( ) { x = 0.0 ; y = 0.0 ; r = 0.0 ; }
public double getX ( ) { return this.x ; }
public void setX ( double x ) { this.x = x ; }
public double getY ( ) { return this.y ; }
public void setY ( double y ) { this.y = y ; }
public double getR ( ) { return this.r ; }
public void setR ( double r ) { this.r = r ; }
}

MSIAG 2007-2008 UML & POO – Section 3 44


L’encapsulation

Rappel de l’intérêt de l’encapsulation

Intégrité des données internes à la classe

Évolutions « transparentes » pour les utilisateurs


de vos classes (si l’interface de la classe est stable)

Lisibilité du code accrue

MSIAG 2007-2008 UML & POO – Section 3 45


Le garbage collector

Java ne dispose pas de mot-clés « delete » ou


« free » pour libérer la mémoire allouée
dynamiquement par l’appel à « new »

Les objets Java sont automatiquement détruits dès


qu’ils ne sont plus référencés

Le « garbage collector » est exécuté par un


processus (thread) tournant en tâche de fond

Simplifie grandement Java (comparé à C++ ou C)

MSIAG 2007-2008 UML & POO – Section 3 46


Variables et méthodes de classe

Variable de classe
Définie par le mot-clé « static »
Partagées par toutes les instances d’une même classe

public class Cercle {


double x, y, r ;
static int nbInstances = 0 ;
public Cercle ( double X, double Y, double R ) {
this.x = X ; this.y = Y ; this.r = R ;
nbInstances ++ ;
}
public double aire ( ) {
return Math.PI * r * r ;
}
}
MSIAG 2007-2008 UML & POO – Section 3 47
Variables et méthodes de classe

public class MonProgramme {

public static void main ( String argv [ ] ) {


double surface1 ;
Cercle c1, c2, c3 ;
c1 = new Cercle ( 20.0, 25.0, 50.0 ) ;
c2 = new Cercle ( 34.0, 24.0, 100.0 ) ; Création de 3 instances
c3 = new Cercle ( 2.0, 1.0, 10.0 ) ;

surface1 = c1.aire ( ) ;
System.out.println ("Nombre de cercles : " + Cercle.nbInstances ) ;
}
}
Accès depuis la classe et non l’objet

MSIAG 2007-2008 UML & POO – Section 3 48


Variables de classe : constante

Constantes

Définie par une variable de classe déclarée « final »

Par convention les constantes sont déclarées en majuscules

public class Cercle {


double x, y, r ;
… Défini dans la
classe Math
public double aire ( ) {
return Math.PI * r * r ;
}
… public static final double PI = 3.14159265 ;
}

MSIAG 2007-2008 UML & POO – Section 3 49


Méthode de classe

Méthode de classe

Définie par le mot-clé « static »

Peut être invoquée depuis la classe et aussi depuis une


instance

Se rapproche des fonctions globales du C/C++

Le mot-clé « this » ne peut pas être utilisé dans une méthode


de classe (pas d’objet disponible, juste la classe !)

La plus classique des méthodes de classe : la méthode


« main »

MSIAG 2007-2008 UML & POO – Section 3 50


Méthode de classe

public class Cercle {


Variable de classe
double x, y, r ;
static Color couleur = Color.BLUE;

public Cercle ( ) {

} Méthode de classe

public static void changeCouleur ( ) {


couleur = Color.RED ;
} Ne peut pas accéder
aux attributs x,y,r
public void affiche ( ) {
System.out.println ( "Couleur des cercles : "+ Cercle.couleur ) ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 51


Méthode de classe

public class MonProgramme {


Cercle c1 = new Cercle ( ) ;
Cercle c2 = new Cercle ( ) ;

public static void main ( String [ ] args ) {


MonProgramme prog = new MonProgramme ( ) ;
prog.c1.Affiche ( ) ;
La classe et
non l’objet prog.c2.Affiche ( ) ;
Cercle.changeCouleur ( ) ;
prog.c1.Affiche ( ) ;
prog.c2.Affiche ( ) ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 52


L’héritage

Syntaxe
public class NomClasseFille extends NomClasseParent {

}

Remarques
La classe « Mère » de toute les classes Java est « Object »
Une classe déclarée avec le mot-clé « final » ne peut être
dérivée
La mot-clé « protected » permet d’affiner la visibilité des
variables et des méthodes des classes « parent »
MSIAG 2007-2008 UML & POO – Section 3 53
L’héritage

Exemple
equals
public class CercleGr extends Cercle {
Object private Color Couleur ;
public void setCouleur (Color c) { Couleur = c; }
hérite de public Color getCouleur ( ) { return Couleur ; }
x, y, r
Cercle aire() public void afficher ( ) {
afficher()
super.afficher ( ) ;

hérite de
}
couleur
setCouleur() }
CercleGr getCouleur()
afficher()
Appel du code de la
classe « Mère »

MSIAG 2007-2008 UML & POO – Section 3 54


L’héritage

Utilisations
Cercle c = null ; x, y, r
aire()
CercleGr cg = null ; Cercle afficher()
double a ;
hérite de
cg = new CercleGr ( 23, 67, 234 ) ;
couleur
double p = cg.aire ( ) ; setCouleur()
CercleGr getCouleur()
afficher()
cg.setCouleur ( Color.red ) ;
cg.afficher ( ) ;

c = cg ; // c référence un cercle graphique


c.setCouleur (Color.blue) ; ((CercleGr) c).setCouleur (Color.blue) ;
a = c.aire ( ) ;
c.afficher ( ) ;
Downcast

MSIAG 2007-2008 UML & POO – Section 3 55


Héritage et constructeur

Constructeur d’une classe dérivée

Le constructeur d’une « sous-classe » peut appeler


le constructeur de la classe « mère » en utilisant le
mot-clé « super »

« super » peut recevoir des paramètres

L’appel à « super » doit être à la première ligne du


code du constructeur de la « sous-classe »

MSIAG 2007-2008 UML & POO – Section 3 56


Héritage et constructeur : exemple

Appel du constructeur de la classe mère

public class CercleGr extends Cercle {


private Color Couleur ;

public CercleGr ( double x, double y, double r, Color couleur ) {


super ( x, y, r ) ;
this.Couleur = couleur ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 57


Le polymorphisme

Principe
Un même message envoyé vers divers objets peut déclencher
des actions (méthodes) pouvant prendre des formes
différentes
Le choix de la méthode à déclencher est effectué au moment
de l’exécution. On parle de liaison dynamique

Exemple
Objet Rectangle
Chaque objet
va exécuter
Objet Objet Cercle
sa méthode
afficher()
Objet Ligne
Appel à
afficher()

MSIAG 2007-2008 UML & POO – Section 3 58


Le polymorphisme

La redéfinition des méthodes

Classe1
La définition initiale est
Afficher remplacée par celle de la
méthode polymorphe
Définition de la
méthode initiale
Classe2

Afficher

héritage

Classe4 Classe3 Le message envoyé à


l’objet et transmis à la
hiérarchie des classes

Objet Message

MSIAG 2007-2008 UML & POO – Section 3 59


Le polymorphisme

La redéfinition des méthodes

Cercle c = null ;
x, y, r
aire()
CercleGr cg = null ;
Cercle afficher()
cg = new CercleGr ( 23, 67, 234 ) ;
hérite de
couleur
cg.setCouleur ( Color.red ) ;
CercleGr setCouleur() cg.afficher ( ) ;
getCouleur()
afficher()
c = cg ; // c référence un cercle graphique
((CercleGr) c).setCouleur (Color.blue) ;
c.afficher ( ) ;
Appel de la méthode afficher()
définie au niveau de CercleGr

MSIAG 2007-2008 UML & POO – Section 3 60


Les classes abstraites

Définition

Une méthode abstraite est une méthode sans code


devant absolument être redéfinie dans une des
sous-classes

Une classe abstraite contient au moins une


méthode abstraite et ne peut être instanciée

Définie par le mot-clé « abstract »

MSIAG 2007-2008 UML & POO – Section 3 61


Les classes abstraites

Déclaration
public abstract class ObjetGraphique
{
public Color couleur ;
public void abstract dessiner ( Graphics g ) ;
public void setCouleur ( Color c ) { couleur = c ; }
public Color getCouleur ( ) { return couleur ; }
}

MSIAG 2007-2008 UML & POO – Section 3 62


Les classes abstraites

Utilisation
public class CercleGraphique extends ObjetGraphique {
public void dessiner ( Graphics g ) {
g.drawOval ( x, y, r, r ) ;
}
}

public class RectangleGraphique extends ObjetGraphique {


public void dessiner ( Graphics g ) {
g.drawRect ( x, y, l, h ) ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 63


Les classes abstraites

Utilisation
Instanciation impossible
ObjetGraphique obj ; d’une classe abstraite !

obj = new ObjetGraphique ( ) ;

CercleGraphique c = new CercleGraphique (…) ;


ObjetGraphique r = new RectangleGraphique (…) ;

obj = r ;
obj.dessiner ( g )

obj = c ;
obj.dessiner ( g )

MSIAG 2007-2008 UML & POO – Section 3 64


Les interfaces

Définition

Une interface est une classe qui ne contient que des


méthodes abstraites et pas d’attributs (or constante)

Définie par le mot-clé « interface »

Une classe « implémente » une interface – « implements »

Intérêts

Traduire un contrat de service à implémenter

Permet de simuler l’héritage multiple non supporté par Java

MSIAG 2007-2008 UML & POO – Section 3 65


Les interfaces

Déclaration

public interface Dynamique { Méthodes implicitement


abstraites

public void setPosition ( double x, double y ) ;


public void setZoom ( double coeff ) ;
public static final double DEFAUTZOOM = 1.0 ;

Constante visible depuis les


classes qui implémentent
cette interface

MSIAG 2007-2008 UML & POO – Section 3 66


Les interfaces

Toutes les méthodes de l’interface


Utilisation doivent être implémentées dans la classe

public class CercleDynamique extends Cercle implements Dynamique


{
double coeffZoom ;

public CercleDynamique ( ) { coeffZoom = DEFAUTZOOM ; … }


public void setPosition ( double x, double y ) { this.x = x ; … }
public void setZoom ( double coeff ) { coeffZoom = coeff ; }

}

MSIAG 2007-2008 UML & POO – Section 3 67


Les modificateurs d’accès / visibilité

Résumé

Modificateurs Visibilité

Une classe, une méthode ou un membre sont visibles et accessibles


public
n’importe où dans le monde Java

Une classe, une méthode ou un membre sont visibles


Par défaut
par seules les classes du même package

Une méthode ou un membre d’une classe sont visibles par les classes du
protected
même package et par les classe filles se trouvant hors du package

Une méthode ou un membre d’une classe sont visibles par cette seule
private
classe

MSIAG 2007-2008 UML & POO – Section 3 68


Java – Chapitre 4

Les exceptions

MSIAG 2007-2008 UML & POO – Section 3 69


Les exceptions

Définition

Mécanisme de gestion des incidents survenus lors de


l’exécution d’un programme

Lever une exception consiste à indiquer qu’un incident


« exceptionnel » vient de se produire

Capturer une exception consiste à indiquer qu’on va la gérer

Il est possible de propager les exceptions aux méthodes


« appelantes »

Il est obligatoire de traiter l’exception sauf si la classe


d’exceptions hérite de « RuntimeException »

MSIAG 2007-2008 UML & POO – Section 3 70


Les exceptions

Intérêts

Gérer systématiquement les incidents

Traiter les incidents au « bon » moment grâce au


mécanisme de propagation

Clarifier le code source

Contraintes

Complexité accrue

Lourdeur de certaines parties du code (try, catch)


MSIAG 2007-2008 UML & POO – Section 3 71
La gestion des exceptions

Traiter les exceptions prédéfinies : « try - catch »

Permettre la propagation des exceptions dans ses


propres méthodes : « throws »

Lever des exceptions ( prédéfinies ou non ) dans ses


propres méthodes : « throw »

Définir ses propres classes d’exceptions

MSIAG 2007-2008 UML & POO – Section 3 72


Traitement des exceptions

Les blocs « try - catch »


Bloc « try » : contient le code susceptible de déclencher un
incident
Bloc « catch » : contient le code permettant de gérer
l’incident survenu dans la zone « try »

public void LitFichier (String nomfic) {


try {
FileInputStream fic = new FileInputStream ( nomfic ) ;
}
catch ( FileNotFoundException fnfe ) {
System.out.println ("Fichier "+nomfic+" non trouvé !" ) ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 73


Traitement des exceptions

public void LitFichier ( String nomfic ) {


try {
FileInputStream fic = new FileInputStream ( nomfic ) ;
fic.read ( … ) ;
}
catch ( FileNotFoundException fnfe ) {
System.out.println ( "Fichier "+nomfic+" non trouvé !" ) ;
}
catch ( IOException ioe ) {
System.out.println ("Problème à la lecture du fichier "+nomfic ) ;
ioe.printStackTrace ( ) ;
} Très pratique
} Print de la pile de pour debugger un
l’exception programme

MSIAG 2007-2008 UML & POO – Section 3 74


Traitement des exceptions

Bloc « finally »
Zone dans laquelle le code est exécuté quoiqu’il arrive

public void LitFichier ( String nomfic ) {


try {
FileInputStream fic = new FileInputStream ( nomfic ) ;
}
catch ( FileNotFoundException fnfe ) {
System.out.println ( "Fichier "+nomfic+" non trouvé !" ) ;
}
finally {
code toujours exécuté
}
}
MSIAG 2007-2008 UML & POO – Section 3 75
Propagation des exceptions

Remarques
Une exception levée au niveau N peut être traitée au niveau
N+1
La méthode dans laquelle se produit l’incident doit être
« habilitée » à propager les exceptions ( prédéfinies ou non )
Syntaxe
openFile propage les
Utiliser le mot-clé « throws » exceptions mais ne
les traite pas

public void openFile ( … ) throws FileNotFoundException, MonException {



}

MSIAG 2007-2008 UML & POO – Section 3 76


Propagation des exceptions

« openFile » lève :
- FileNotFoundException « litFichier » propage MonException
mais traite FileNotFoundException
- MonException

public void LitFichier ( String nomfic ) throws MonException {

try {
obj.openFile ( nomfic ) ;
}
catch ( FileNotFoundException fnfe ) {
System.out.println ( "Fichier "+nomfic+" non trouvé !" ) ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 77


Propagation des exceptions

Intérêts

Le niveau N+1 connaît généralement mieux le


contexte global et peut effectuer un traitement plus
approprié de l’erreur

Renvoyer une erreur vers le client si l’incident s’est


produit côté serveur

Augmenter la souplesse du traitement des incidents


Exemple :Enregistrer les erreurs dans un fichier

MSIAG 2007-2008 UML & POO – Section 3 78


Lever une exception prédéfinie

Explicitement levée par le programme avec le mot-clé


« throw »

La méthode dans laquelle est levée l’exception doit être


« habilitée » à lever ce type d’exception (clause throws)

public void openFile( … ) throws FileNotFoundException, IOException {


FileInputStream fic = new FileInputStream( nomfic ) ;

if ( … ) { // problème
throw new IOException ( ) ;
}

}

MSIAG 2007-2008 UML & POO – Section 3 79


Créer ses propres exceptions

La nouvelle classe d’exception doit hériter de classe


« Exception » prédéfinie dans Java
public class BadTemperatureException extends Exception {
private float temperature ;
public BadTemperatureException(float temp) {
temperature = temp ;
}
public float getTemperature ( ) {
return temperature ;
}
}

MSIAG 2007-2008 UML & POO – Section 3 80


Créer ses propres exceptions

public class EssaiException {


static void maMethode ( float t ) throws BadTemperatureException {
if ( t > MAX_TEMPERATURE )
throw new BadTemperatureException(t) ;
}

static public void main ( String argv [ ] )


try {
maMethode ( 41 ) ;
System.out.println (" Pas d’erreur ! ") ;
}
catch (BadTemperatureException e ) {
System.out.println("mauvaise temperature : "+e.getTemperature() );
}
}
}
MSIAG 2007-2008 UML & POO – Section 3 81
La hiérarchie des exceptions

java.lang.Throwable
irrécupérables récupérables

java.lang.Error java.lang.Exception

java.lang.RuntimeException Programmées java.lang.IOException

java.lang.NumberFormatException Programmées

MSIAG 2007-2008 UML & POO – Section 3 82


Java – Chapitre 5

Les Collections

MSIAG 2007-2008 UML & POO – Section 3 83


Les Collections

Série d’interfaces du package java.util


Collection<E>, Set<E>, SortedSet<E>, List<E>, Map<K,V> et
SortedMap<K,V>
Interface paramétrée en Java 5 mais pas en Java 1.4

Méthodes sophistiquées sur des ensemble d’objets (Object)


Création et explorations de collections d’objets avec ou sans doublon
Recherche d’objets par clé (Map)
Redimensionnable (contrairement aux tableaux)
Vérification du type d’objet passé : une List<String> n’accepte et ne
renvoie que des String.

Les interfaces sont implémentées sous la forme de classe Java


ArrayList<E>, HashSet<E>, TreeSet<E>, HashMap<K,V> …

MSIAG 2007-2008 UML & POO – Section 3 84


Les différentes collections (1)

Collection
Interface de base de toutes les collections
Une boucle foreach permet de parcourir ses éléments

List
Collection ordonnée et indexée : get(5) renvoie le 5ème
élément
Doublons possibles
Simple à utiliser
Remplace naturellement les tableaux

MSIAG 2007-2008 UML & POO – Section 3 85


Exemple de liste

Interface List

List<String> stringList = new ArrayList<String>();

stringList.add("Kevin"); Classe
implémentant
stringList.add("John"); l’interface List

//stringList.add(123); ERREUR : 123 n’est pas de type String

String firstString = stringList.get(0);

// renvoie "Kevin" : le décompte commence à 0

System.out.println(firstString);

MSIAG 2007-2008 UML & POO – Section 3 86


Les différentes collections (2)

Set
Collection sans doublons

Les éléments de la collection doivent redéfinir equals()

Map
Ensemble de (clé, valeur) - concept du dictionnaire

Les clés doivent redéfinir equals() et hashCode()

Pas de doublons de clés mais doublons possible au niveau


valeur

MSIAG 2007-2008 UML & POO – Section 3 87


Exemple de Map

Map<String, Structure> map = new HashMap<String, Structure>();

Structure structure1 = new Structure();

map.put("John", structure1); Type Type


Clé Valeur
Structure structure2 = new Structure();

map.put("Kevin", structure2);

// récupération de la structure de John

map.get("John"); // renvoie structure1 !

MSIAG 2007-2008 UML & POO – Section 3 88