Vous êtes sur la page 1sur 48

Cours Java : Programmation Oriente Objet

2006 Atos Origin. Document exclusivement rserv usage commercial. Tout ou partie de ce document ne peut tre copi, modifi, diffus ou annot sans accord crit d'Atos Origin ou du client.

Sommaire

Programmation objet avec java


Lhritage
Les interfaces
Conversion entre objet
Paquetage et classes
Les classe internes

Programmation
objet

Structure dun programme Java

Un programme Java contient au moins une classe public ayant la structure de la classe
Bonjour prsente en introduction :
public class Bonjour{
.
public static void main ( String[ ] args){
........
}
}

Le point dentre dun programme Java est toute classe dclare comme tant public, et
contenant la mthode main ( ) de prototype
public static void main ( String[ ] args)

Structure dun programme Java

public class Arguments{


public static void main(String[ ] args){

if (args.length = = 0){
System.out.println( `` Veuillez rentrer au moins 1 valeur ``);
System.exit(1) ; / / sortie du programme avec code erreur = 1.
}
for ( int i = 0; i < args.length; i++ )
System.out.println(`` arguments `` + ( i + 1) + `` = `` + args[i] );
}
}

Un fichier peut contenir au plus une classe public, il doit alors porter exactement le mme nom que celleci. Par contre, un mme fichier peut contenir plusieurs classes non publiques.

Un programme Java est constitu dun ensemble de fichier contenant des dfinition de classes parmi
lesquelles au moins une doit tre publique et contenir un point dentre (mthode main ( ) ). Cest le nom
de cette classe qui est fourni comme argument linterprte Java

Classes et instanciation

Toute fonction est dfinie dans une classe : on ne peut pas crire de fonctions lextrieur de
la dfinition dune classe. Cest ainsi que le point dentre dun programme est dfini dans
une classe.
public class Bonjour {
public static void main(String[ ] args){
System.out.println(`` Bonjour ! ``);

/ / affiche `` Bonjour ! `` lcran

}
}

Loprateur dinstanciation est new : tout objet est cre par new, auquel on prcise le type (la
classe) de lobjet crer, et qui retourne une rfrence sur lobjet ainsi cre.

Individu pierre = new Individu( ) ;

Class et objet
Objet
reprsente une entit dans le monde rel ou un lment du programme.
Possde des tats et des comportements

Ex. un objet "Tlvision"

ses tats =
{ allum/teint, chane courante, volume de son },

ses comportements =
{ allumer, changer de chane, changer de volume de son, teindre }

Class

Un objet est une instance d'une classe la classe dcrit l'objet.


Description des tats des attributs de la classe
Description des comportements des mthodes de la classe.

Exemple d'une class


public class Television {
// Etat
private int volume;
private int chaine;
private boolean estAllume;
// Comportements
public void allumer() { }
public void eteindre() { }
public void augmenterVolume() { }
public void reduireVolume() { }
public void changerChaine(int _chaine) { chaine=_chaine }
}
Rappel : Par convention, les noms des classes commencent par majuscule
ceux des attributs/ mthodes commence par minuscule
8

Instanciation
Une classe peut tre rutilise pour instancier
plusieurs objets
Class
Television
boolean est Allume
int volume
int chaine

Objets
Est Allume: true
volume: 5
chaine: 1
estAllume: true
volume: 6
chaine: 2
estAllume: false
volume: 0
chaine: 0

Question
Dfinir une classe reprsentant des voitures.
Les tats des objets voiture doivent dcrire
-

Dmarr ou non, position de boite de vitesse, vitesse


niveau d'essence,

Les comportements d'une voiture incluent:


10

Dmarrer, arrter
Changer de rapport de boite de vitesse
Acclrer, ralentir
Tourner (selon le dgr spcifi)

Solution
public class Voiture {
private boolean estDemarre;
private int posBoiteVitesse;
private int vitesse;
private int niveauEssence;
public void demarrer() { }
public void arreter() { }
public void setPosBoiteVitesse(int pos) {
posBoiteVitesse=pos;}
public void accelerer() { }
public void ralentir() { }
public void tourner(int degre) { }
}

11

La cration d'un objet : instancier une classe


Il est ncessaire de dfinir la dclaration d'une variable ayant le type de l'objet dsir.
La dclaration est de la forme nom_de_classe nom_de_variable

L'oprateur new se charge de crer une instance de la classe et de l'associer la


variable

Il est possible de tout runir en une seule dclaration

12

Exemple

Attention : En Java, pour


accder un champ ou
invoquer une mthode dun
autre objet, on doit disposer
dune rfrence sur cet objet (et
de plus cette ressource doit tre
expose, cest--dire visible de
lextrieur).

Rsultat de lexcution
13

Les constructeurs
Un constructeur est une mthode qui est appele au moment de la cration dun
objet par new pour initialiser son tat, il doit :
Porter le mme nom que la classe :
Ne rien retourner et ne pas possder de type de retour (void est interdit)
En gnral, tre public
Exemple
class Individu {
String nom, prenom ;
int taille, age ; / / valeur par dfaut.
Individu (String marzouk, String firdaous)
{
nom = marzouk ;
prenom = firdaous;
}
}
14

Les constructeurs
Quelques remarques :
Il peut ny avoir aucun constructeur de dfini dans une classe, dans ce cas un
constructeur par dfaut est fourni par le compilateur, qui naccepte aucun
argument, et qui ne fait rien, part initialiser les variables pour les quelles on a
spcifi une valeur initiale en les dclarant. On parle aussi de constructeur par
dfaut pour la version de constructeur sans argument.
Il peut y avoir plusieurs constructeurs, ils doivent alors diffrer par leur liste
darguments : nombres et / ou type des arguments.
Loprateur new invoque le constructeur avec la liste dargument prsente dans
linstruction new. En cas de multiples constructeurs, le constructeur
effectivement utilis est slectionn en fonction de cette liste darguments.

15

Surcharge et enchanement des constructeurs

16

Il est trs courant de surcharger la dfinition dun constructeur, afin de dfinir plusieurs
formes dinitialisation : soit partir de donnes de natures diffrentes, soit partir
dinformations plus ou moins compltes. Classiquement, dans le second cas, laction
principale est dcrite dans le constructeur le plus prcis au niveau des paramtres, et les
autres y font appel en compltant les paramtres pas pas, comme suit :

La rfrence this

La plupart du temps this est omis et implicite.


Sa prsence est toutefois indispensable dans le cas o apparait une confusion de
notation, ou une ambigut
Dans l'exemple suivant, on a utilis dans le constructeur (de) Cercle() des
homonymes des attributs de la classe.
Evidemment, une telle criture, quoique correcte, nuit la lisibilit.
public class Cercle {
double x, y, r ;
public Cercle(double x, double y, double r) {
this.x = x ;
this.y = y ;
this.r = r ;
}
}

17

Exemple1 :

Constructeur avec
un seul paramtre

Constructeur avec
trois paramtres
Constructeur par
dfaut

18

Exemple2 :
Raliser une classe Point permettant de reprsenter un point sur un axe.
Chaque point sera caractris par un nom (de type char) et une abscisse (de type
double). On prvoira :
un constructeur recevant en arguments le nom et labscisse dun point,
une mthode affiche imprimant (en fentre console) le nom du point et son
abscisse,
une mthode translate effectuant une translation dfinie par la valeur de son
argument.
crire un petit programme utilisant cette classe pour crer un point, en afchant les
caractristiques, le dplacer et en afcher nouveau les caractristiques.

19

Exemple2 :

20

Exemple2 :

21

Encapsulation et exposition

Cest le principe de sparation de la fonctionnalit et de la manire (le quoi et le comment),


ou encore de linterface et de limplmentation.

Linteraction des objets seffectue par lintrimaire des interfaces, indpendamment de la


faon dont elles sont programmes

Les donnes et mthodes dun objet qui ne sont pas directement accessibles depuis
lextrieur sont dites encapsules : elles ne font pas partie de linterface de lobjet.

Tous les langages objets offrent des mcanismes pour contrler plus au moins finement les
rgles daccs aux membres dune classe. En Java, on dispose de modificateurs daccs :
public : le membre (champ ou mthode) est accessible de tout autre objet. Quelque soit
sa classe
si on ne spcifie pas dattribut dexposition, le membre nest utilisable que par les objets
de classes du mme package mais pas par les sous classes situes dans dautres
packages. On parle dexposition de type friendly
protected : la visibilit est limite aux objets de classes drives quel que soit leur
emplacement. Il inclut de plus lautorisation daccs de type friendly.
private : le membre ne peut tre accd des objets dautres classes.

22

TP

23

LHritage

24

Prsentation

L'avantage essentiel d'un langage orient-objet est que le code est rutilisable. Grce
l'hritage, on peut faire driver une nouvelle classe d'une classe existante et ainsi en
rcuprer les attributs et mthodes, sans avoir la rcrire compltement.

Terminologie :
On dit que la classe Enfant hrite de la classe Parent, qu'elle tend cette ancienne classe.
Enfant est alors une sous-classe (subclassed) de Parent
Parent est une super-classe (surclasse) de Enfant.

Une sous-classe reprend toutes les proprits et mthodes de la super-classe, tout en


pouvant intgrer de champs nouveaux (attributs et mthodes). Ceux-ci caractriseront et
distingueront les objets de la classe hrite des objets de la classe parent.
Autrement dit, cela signifie qu'une instance de la classe Enfant aura la possibilit d'utiliser,
outre des attributs et mthodes supplmentaires, toutes les ressources dfinies dans Parent
(si des modificateurs ne l'empche pas , voir plus loin).

L'hritage est donc une relation entre classes, semblable la relation d'inclusion d'un sousensemble dans un ensemble : un objet de la classe qui hrite est aussi un objet de la classe
d'origine, mais il acquiert des proprits particulires .

Java ne permet que l'hritage simple. Une sous-classe ne peut hriter que d'une seule
classe.

25

Notations et exemples

[modificateur] class Enfant extends Parent


{ ...... // la classe Enfant hrite de la classe Parent }
En Java, toutes les classes sont drives de la classe spciale Object.
C'est la racine de la hirarchie des classes (cela entraine que toute classe Java possde dj
sa naissance un certain nombre de variables et de mthodes).
Dans la dclaration d'une classe si la clause extends n'est pas prsente, la surclasse est
donc Object directement
Exemple
Soit une classe gnrale Ville qui possde 2 attributs d'instance privs nom et nbHabitants
(on aurait pu ajouter une variable statique pour numroter les villes construites)

26

public class Ville {


private String nom;
private int nbHabitants;

Donnes prives et hritage

Si une variable de la classe Parent est dclare private, elle n'est visible que dans sa propre
classe, mme la classe Enfant n'y accde pas !
Par exemple dans l'exemple de la classe ville, les variables nom et nbHabitants dclares
private ne sont pas accessibles par la classe Capitale qui en hrite.
public class Ville {
private String nom;
private int nbHabitants;
.......
public class Capitale extends Ville { ............

Attention, une variable dclare private dans la super-classe est bien hrite par la classe
Enfant. chaque instance de Enfant en possde une copie qui ne peut ni consulte, ni
initialise directement. Pour cela, il faut faire appel une mthode ou un constructeur de
Parent.

Ainsi, dans la classe Capitale qui hrite de Ville, nom doit tre initialis par un constructeur
de Ville, ou affect par l'intermdiaire de la mthode d'accs setNom()

27

Donnes prives et hritage

Il peut tre souhaitable d'avoir un accs direct certaines variables d'instance de Parent, en
lecture comme en modification, tout en les "protgeant" de l'extrieur, des autres classes. Il
faut pour cela les dfinir avec la qualification protected

Exemple : dans la classe Capitale, pour pouvoir facilement agir sur la variable nbHabitants, il
faudrait remplacer private par protected.
public class Ville {
/** nom est private, non visible de la sous-classe Capitale,
* accessible seulement par les mthodes publiques setNom() et getNom()
*/

private String nom;


/** nbHabitants est protg de l'extrieur mais pas de la descendance de Ville.
* Cette variable est donc visible et manipulable directement dans la sous-classe Capitale
*/
protected int nbHabitants;
.......

28

Classes finales et hritage

Variable finale
un attribut dclar final est une constante, dont on doit donner tout de suite la valeur. Par
habitude, son nom est crit en majuscules.

Exemple :
final int DOUZE=12;

Un mcanisme permet de bloquer l'hritage : dclarer une classe "finale", prcde du


modificateur final la rend impossible tre tendue.
Exemple : la bibliothque mathmatique dfinie dans la classe Math
public final class Math extends Object
ne peut tre ni tendue, ni instancie car toutes les variables et methodes y sont
dclares statiques. D'o les appels comme Math.sin(Math.PI/2) ...
Pensez vous que le code suivant sera compil ?
final class MaFinaleClasse extends MaClasse { ...
class MaSousFinaleClasse extends MaFinaleClasse { ...

On peut agir plus finement au niveau d'une mthode :


pour empcher qu'une mthode puisse tre redfinie par hritage, on la qualifie par final

29

Classe abstraite
Au contraire d'une classe finale, une classe abstraite est une classe n'ayant pas
d'instances
Elle n'est utilisable qu' travers sa descendance. Autrement dit, une telle classe ne
peut pas tre instancie directement, et doit toujours tre drive pour pouvoir
gnrer des objets.
abstract class MaClasseAbstraite extends MaClasse { ...
Elle sert uniquement regrouper des attributs et mthodes communes un groupe
de classes pour constituer une vritable "factorisation" de ces classes et ne sera
utilisable que par l'intermdiaire de ses sous-classes.
Exemple:
abstract class Forme{
private String nom;
}

30

Exemple de classe abstraite

Mthode dfinir
dans les classe
descendantes

31

Les interfaces

32

Les interfaces

En Java, l'hritage multiple n'existe pas, on ne peut pas faire hriter une classe de
plusieurs classes. Pour contourner la difficult, on a cr des interfaces.
Une interface est une collection de dclarations de mthodes dpourvues
d'implmentation.
Le code doit obligatoirement tre prcis dans la redfinition des mthodes de
l'interface. Voir ce mcanisme dans la gestion des vnements auxquels peut
ragir une interface graphique.

33

Les interfaces: exemple

Triplet hrite les


attributs de Doublet
et le comportement
de SommeProduit
34

Redfinition de constructeurs et de mthodes

35

Dfinition
Lorsque l'on code la classe Enfant, on a la possibilit de remplacer des mthodes de la
super-classe Parent, simplement en dfinissant une mthode avec le mme nom et les
mmes paramtres.
On appelle cette fonctionnalit redfinition des mthodes hrites.
Utiliser une mthode (redfinie) de la classe parent
L' opration de redfinition d'une mthode masque invitablement la mthode d'origine de la
super-classe Parent.
Pour pouvoir faire appel tout de mme la mthode Parent, on crit le mot-cl super devant
le nom de la mthode.
Supposons qu'on ait redfini dans la classe Enfant, la mthode M() dj dfinie dans la
classe Parent.
Alors, super.M(), fait appel la mthode M() dfinie dans la classe Parent et non celle
d'Enfant.
Utiliser un constructeur (redfini) de la classe parent
Par contre, il n'est pas possible de redfinir un constructeur, puisque celui-ci porte le nom
de la classe dans laquelle il est dclar, et que les noms des deux classes diffrent
obligatoirement.
On peut faire appel un constructeur de la sur-classe en utilisant le mot spcial super()
L'appel au constructeur super() doit tre la premire instruction du bloc.

Polymorphisme

Il s'agit de la possibilit pour Java de choisir le code correct de la mthode


excuter, au moment de l'excution, parmi un ensemble de mthodes redfinies,
en fonction de l'objet auquel s'adresse la mthode. (ceci rend le choix du code
dynamique).
Exemple: prenons les classe de lexemple prcdent:
Le rsultat de lexcution a
montr que la mthode somme
excut est bien celle de la
classe Triplet et non pas de
Doublet pour lobjet t.

36

Exercice:

Ecrire une classe Personne avec trois attributs (nom, prenom et age),et une mthode
afficher() qui affiche le nom , prnom et lge de la personne et les getters & setters des
attributs.

Ecrire la classe Etudiant qui hrite de Personne en ajoutant deux autres attributs (classe et
section).

Ecrire une troisime classe Professeur qui hrite elle aussi de Personne en ajoutant les
attributs matiere et experience (nombre dannes).

Redfinissez dans chaque classe la mthode afficher afin dafficher le mtier de chaque
personne.

Dans la classe TestMain (dfinissez la mthode main) crer des personnes et essayez
dexcuter la mthode afficher pour chacun.

Dans un deuxime temps affectez vos personnes des tudiants et des professeurs
(personne1=new Etudiant()) excuter une deuxime fois votre programme. Qu'est ce que
vous remarquez ?

Essayez dafficher le mtier pour les professeurs et la classe pour les tudiants. Est-ce que
vous arrivez compiler votre programme? Sinon, pourquoi?

37

Conversion
entre objet

38

Conversion entre objet

En Java, tout objet a un type effectif (celui spcifi lors de sa cration par new), mais peut
tre considr aussi comme du type Object ou tout autre anctre de sa classe. Le type
Object est trs basique et noffre que trs peu de mthodes, celles communes tout objet :
toString( ), equals ( ), etc. Ceci est utilis en particulier par les types pile (Stack) et table
(Vector), qui, pour tre capables de collectionner des objets de types quelconques,
considrent simplement leurs lments comme des rfrences sur Object.

Leffet pervers de ce mcanisme est quun lment sorti dune pile ou dune table apparat
toujours avec le type Object. En effet la mthode pop( ) des objets Stack a le prototype
suivant :

my_stack.push(``hello``); / / mise en pile dun objet (String).


........
Object obj = my_stack.pop( ); / / Sortie de pile dun objet

39

On perd la notion String car on obtient un type objet ce qui pourrait conduire une erreur, si
on fait appel des fonctions utilisant comme argument un String telle que :
println(obj.charAt(0)) erreur la compilation

Conversion entre objet: suite


Dans ce genre de situation, si le programmeur est sr du type effectif de son objet,
par exemple String, il peu demander au compilateur par une instruction de
conversion (cast) de forcer String le type de cette rfrence sur Object
my_stack.push(``hello``); / / mise en pile dun objet (String).
........
String s = (String) my_stack.pop( ); / / Sortie de pile dun objet, et cast
/ / s reoit une rfrence sr Objet force au type rfrence sur String
if (s.length ( ) > 50) . / / on peut appeler via s les mthodes de String

Java vrifie toujours lexcution la validit des conversions dobjets. En


cas derreur de logique dans une conversion, il y aura leve dune exception
de type ClassCastException lexcution. Pour limiter ces erreurs de
conversion, Java offre au programmeur un oprateur de comparaison de
types : instanceof. ( ref instanceof Type ) est une expression logique valant
true si ref est une rfrence sur un objet de type compatible avec Type, et
false sinon.
40

Le paquetage
et classes

41

Le paquetage et classes

Un paquetage est un groupe de classes connexes destines fournir un ensemble de


fonctionnalits lies. Cest une forme de classe gante : un paquetage encapsule un
ensemble de classes et dinterfaces. Contrairement aux bibliothques que lon rencontre
dans dautres langages, la notion de paquetage est prise en compte dans le mcanisme de
protection (encapsulation).

Encapsulation et paquetage:
Seuls les membres public dun paquetage sont utilisables lextrieur du paquetage.
Les membres protected dune classe sont utilisables partout dans le paquetage dont fait
partie la classe en question (protected implique friendly ).
Les membres dont laccs nest pas spcifi sont galement visibles dans tout le
paquetage, mais pas dans les sous classes de la classe dans laquelle ils sont dclars.
Exemple : le paquetage java.utile fournit un ensemble de classe pour la programmation
de la date et lheure, larchivage des fichiers, la gestion des structures de donnes.

On dclare le nom du paquetage dont fait partie une classe en plaant une directive

package nom_de_package ;

42

En tte de fichier. Toutes les classes qui y sont dfinies en feront alors partie

Paquetage: suite

On utilise un paquetage de deux faons:


En accdant ses membres par le biais de la notation pointe
Ou bien, on peut rendre librement accessible tout ou une partie du paquetage laide de
la directive import place en tte de fichier.

import nom_de_package.nom_de_classe ; / / on importe une seule classe du paquetage

Ou bien

import nom_de_package.* ; / / on importe toutes les classes du paquetage

Classes importes
package

43

Accs aux classes dune application


La compilation dune source java ou lexcution dune application ncessite que le
compilateur ou linterprteur localisent les classes utilises par lapplication. A priori
les classes peuvent tre localises nimporte ou sous la machine ou mme sur une
machine distante. Le moyen utilis consiste indique au compilateur ou
linterprteur la liste des rpertoires dans lesquelles les classes sont susceptibles
dtre places (similaire au mcanisme de la variable PATH).
Utiliser la variable denvironnement CLASSPATH.
Lors de la compilation, le compilateur cherche le code des classes importes
dans lun des rpertoires spcifis dans la variable CLASSPATH. Lun de ces
rpertoires doit contenir le fichier .class recherch. Linterprteur utilise
galement cette variable pour rechercher les classes.
Exemple sous Windows :
c : \ > set CLASSPATH = . ; c : \ mysql \jdbc \ mm.mysql-2.0.6.1.jar ; c : \
oracle \jdbc \ ojdbc14.jar
Linconvnient est que lemploi dune nouvelle bibliothque oblige modifier la
variable denvironnement
44

Classe
interne

45

Classe interne

La conception dune application fait que parfois certaines classes ne sont utilises
que par une seule classe. On peut alors dclarer ces classes dans la classe
utilisatrice.
Tout type de classe peut tre interne : instanciable, abstraite ou interface
Laccs une telle classe est contrlable compltement : prive, public, protge
ou paquetage.
On peut driver une classe interne sauf si elle est dclare finale
Une classe interne peut, elle aussi, inclure des classes internes.

46

Classe interne: exemple

Rsultat de
lexcution

47

Classe interne

Une classe interne est utilise diffremment selon quelle est dclare static ou pas
Une classe interne non statique accde directement aux champs et mthodes de la
classe englobante. Cest possible car une instance de la classe interne contient une
rfrence vers linstance de la classe englobante. Cela simplifie le code crit par rapport
une classe externe. En dehors de la classe englobante, la cration dun objet de la
clase interne ncessite un objet de la classe englobante.
ClasseEnglobante oce = new classeEnglobante ( ) ;
ClasseInterne
oci = oce.new classeInterne ( ) ;
Une classe interne statique na pas accs quaux membres statiques de la classe
englobante. Linstanciation de la classe interne pourra se faire en dehors de la classe
englobante de la manire suivante :
ClasseInterne oci = new classeEnglobante.ClasseIntene ( ) ;
Un intrt supplmentaire est quon peut nommer les classes internes sans risque de conflit
avec dventuels noms de classes externes la classe englobante.
Pour une classe nomme ClasseInterne interne une classe nomme ClasseEnglobante,
le compilateur gnre le fichier ClasseEnglobante$ClasseInterne.class.

48