Vous êtes sur la page 1sur 25

La programmation oriente objet avec Java L3-MIAGE Plan

Le concept objet en java lments de conceptions des classes


Typologie des mthodes d'une classe : les constructeurs Les classes internes change d'information avec les mthodes

Les paquetages

Marta RUKOZ

Typologie des mthodes d'une classe


Parmi les diffrentes mthodes que comporte une classe, on peut distinguer :
Les constructeurs Les mthodes d'accs qui fournissent des informations relatives l'tat d'un objet, c'est dire aux valeurs de certains de ses variables (gnralement prives), sans les modifier. Les mthodes d'altration qui modifient l'tat d'un objet, donc ses variables.

les constructeurs
La dclaration d'un objet est suivie d'une sorte d'initialisation par le moyen d'une mthode particulire appele constructeur pour que les variables aient une valeur de dpart. Elle n'est systmatiquement invoque que lors de la cration d'un objet.
Le constructeur suit la dfinition des autres mthodes except que son nom doit obligatoirement correspondre celui de la classe et qu'il n'est pas typ, pas mme void, donc il ne peut pas y avoir d'instruction return dans un constructeur.

On peut surcharger un constructeur.

les constructeurs
La dfinition d'un constructeur est facultative. Si elle n'est pas dfinie, la machine virtuelle appelle un constructeur par dfaut vide cr automatiquement. Ds qu'un constructeur est explicitement dfini, Java considre que le programmeur prend en charge la cration des constructeurs et que le mcanisme par dfaut, qui correspond un constructeur sans paramtres, est supprim. Si on souhaite maintenir ce mcanisme, il faut dfinir explicitement un constructeur sans paramtres.

les constructeurs
Il existe plusieurs manires de dfinir un constructeur : le constructeur simple : ce type de constructeur ne ncessite pas de dfinition explicite : son existence dcoule automatiquement de la dfinition de la classe. Exemple : public MaClasse() {} le constructeur avec initialisation fixe : il permet de crer un constructeur par dfaut Exemple : public MaClasse() { nombre = 5; } le constructeur avec initialisation des variables : pour spcifier les valeurs de donnes initialiser on peut les passer en paramtres au constructeur Exemple : public MaClasse(int valeur) { nombre = valeur; }

Quelques rgles concernant les constructeurs


Par essence, un constructeur ne fournit aucune valeur. Dans son en-tte, aucun type ne doit figurer devant son nom. Mme la prsence de void est une erreur. Une classe peut ne disposer d'aucun constructeur. On peut alors instancier des objets comme s'il existait un constructeur par dfaut sans arguments par des instructions telles que : Point a = new Point() ; Mais ds qu'une classe possde au moins un constructeur, ce pseudo- constructeur par dfaut ne peut plus tre utilis.

Quelques rgles concernant les constructeurs


Un constructeur ne peut pas tre appel directement depuis une autre mthode. Par exemple : Point a = new Point (3, 5) ; a.Point(8, 3) ; // interdite

Il existe cependant une exception : au sein d'un constructeur il est possible d'en appeler un autre de la mme classe (et portant alors sur l'objet courant). Pour cela on utilise le mot cl this. Dans ce cas, l'appel this() doit obligatoirement tre la premire instruction du constructeur

Quelques rgles concernant les constructeurs


Un constructeur peut appeler un autre constructeur de la mme classe. Cette possibilit utilise la surdfinition des mthodes et ncessite l'utilisation du mot cl super.

Un constructeur peut tre dclar priv (private). Dans ce cas, il ne pourra plus tre appel de l'extrieur, c'est--dire qu'il ne pourra tre utilis pour instancier des objets

Construction et initialisation d'un objet


La cration d'un objet entrane toujours, par ordre chronologique, les oprations suivantes :
Une initialisation par dfaut de tous les champs de l'objet

Une initialisation explicite lors de la dclaration du champ


L'excution des instructions du corps du constructeur Le corps du constructeur n'est excut qu'aprs l'initialisation par dfaut et l'initialisation explicite

change d'information avec les mthodes


En Java, la transmission d'un argument une mthode et celle de son rsultat ont toujours lieu par valeur. Comme pour l'affectation, les consquences seront totalement diffrentes, selon que l'on a affaire une valeur d'un type primitif ou d'un type classe.

Pour les types primitifs : une mthode ne peut pas modifier la valeur d'un argument effectif

Lorsqu'on manipule une variable de type objet, son nom reprsente en fait sa rfrence de sorte que la mthode reoit bien une copie, mais il s'agit d'une copie de la rfrence. La mthode peut donc modifier l'objet concern qui, quant lui n'a pas t recopi.

Cas des objets transmis en argument


En java l'unit d'encapsulation est la classe et non l'objet. Une mthode appele pour un objet a, est autorise accder aux champs privs d'un autre objet b de la mme classe.

Bien entendu, lorsqu'une mthode d'une classe T reoit en argument un objet de classe T', diffrent de T, elle n'a pas d'accs aux champs ou mthodes prives de cet objet.

Cas des objets transmis en argument


Exemple : Supposons que nous voulions au sein d'une classe Point, introduire une mthode nomm coincide (avec des membres x et y ) charge de dtecter la concidence ventuelle de deux points. Son appel (par exemple au sein de la mthode main) se prsentera obligatoirement sous la forme : a.coincide ()

Il nous faudra donc transmettre le second point en argument , s'il le nomme b, cela nous conduira un appel de la forme :
a.coincide (b) ou b.coincide (a) La mthode coincide pourrait se prsenter comme : Public boolean coincide (Point p) { return ((p.x == x) && (p.y == y)

Cas des objets transmis en argument


Dans le cas d'un argument de type objet, la mthode reoit la copie de la rfrence l'objet. Elle peut donc tout fait modifier l'objet correspondant.

Exemple : Supposons qu'on a dans la classe Point une mthode nomme permute, charge d'changer les coordonnes de deux points. public void permute (Point a) { Point c = new Point (0,0) ; c.x = a.x ; c.y = a.y ; // copie de a dans c a.x = x ; a.y = y ; // copie du point courant dans a

x = c.x ; y = c.y ;
}

// copie de c dans le point courant

Cette mthode reoit en argument la rfrence a d'un point dont elle doit changer les coordonnes avec celles du point concern par la mthode. Ici on a cre un objet local c de classe Point, qui sert effectuer l'change.

Cas des objets transmis en argument


Supposons que l'on a cre deux points de cette faon : Point a = new Point (1, 2) ; Point b = new Point (5, 6) ;
a
1 2 5 6

Candidat au ramassemiettes ds la sortie de la mthode permute

Considrons l'appel a.permute (b) ; A la fin de l'excution de la mthode (avant son retour ), on a : a b
5 6 1 2 1 2

c Notez que ce ne sont pas les rfrences contenues dans a et b qui ont chang, mais seulement les valeurs des objets correspondants

Cas de la valeur de retour


Exemple : Disparat la class Point fin de { l'excution de public Point (int abs, int ord) la mthode { x = abs ; y = ord ; symtrique } public Point symetrique() L'objet cr par { Point res ; new Point continue res = new Point (y, x) ; d'exister. Sa return res ; rfrence est } effectivement public void affiche () copie par main { system.out.prntln (Coordonnees : + x + + y) ; dans b. } private int x, y ; } public class Sym { public static void main (String args[]) { Point a = new Point (1,2) ; a.affiche () ; Point b =a.symetrique () ; b.affiche() ; Coordonnees : 1 2 } Coordonnees : 2 1 }

Cas de la valeur de retour


On reoit toujours la copie de la valeur fournie par une mthode. Dans le cas o la valeur de retour c'est un objet, elle fournit une copie de la rfrence l'objet concern.

Un autre exemple :
Point p = new Point (2, 5) ; . for ( )

{ Point s = p.symetrique () ;
. }

Si la rfrence contenue dans s n'est pas recopie dans une autre variable au sein de la boucle for, l'objet rfrenc par s (cr par la mthode symetrique) deviendra candidat au ramasse-miettes la fin de la boucle for

Les classes internes


Une classe est dite interne lorsque sa dfinition est situe l'intrieur de la dfinition d'une autre classe.
Elle ne doit surtout pas tre confondue avec la notion d'objet membre. Exemple

class E
{ { . } . }

// dfinition d'une classe usuelle (externe)


// mthodes et donnes de la classe E // mthodes et donnes de la classe I // autres mthodes et donnes de la classe E class I // dfinition d'une classe interne la classe E

La dfinition de la classe interne I n'introduit pas d'office de membre de type I dans E


La dfinition de I est utilisable au sein de la dfinition de E, pour instancier quand on le souhaite un ou plusieurs objets de ce type.

Schma d'utilisation de classe interne


Classe E
{ public void fe( ) // mthode de E { I i = new I( ) ; // cration d'un objet de type I ; sa rfrence est ici locale // la mthode fe

}
classe I { . } } Ici un objet de classe E ne contient aucun membre de type I. Simplement, une de ses mthodes (fe) utilise le type I pour instancier un objet de ce type

Schma d'utilisation de classe interne


Classe E { classe I { . } private I i1, i2 ; // les champs de i1 et i2 de E sont des rfrences des // objets de type I

}
Ici un objet de classe E contient deux membres de type I.

Lien entre objet interne et objet externe


Les objets de classe interne jouissent de trois proprits particulires : Un objet d'une classe interne est toujours associ, au moment de son instanciation, un objet d'une classe externe dont ont dit qu'il lui a donne naissance. Un objet d'une classe interne a toujours accs aux champs et mthodes (mme privs) de l'objet externe lui ayant donn naissance (attention : ici, il s'agit bien d'un accs restreint l'objet, et non tous les objets de cette classe)

Un objet de classe externe a toujours accs aux champs et mthodes (mme privs) d'un objet d'une classe interne auquel il a donn naissance.

Lien entre objet interne et objet externe (Exemple 1)


Classe E { public void fe( ) // mthode de E { I i = new I( ) ; // cration d'un objet de type I ; associ l'objet // de classe E lui ayant donn naissance (celui qui // aura appel la mthode fe } classe I { . public void fi ( ) { // ici, on a accs au champ ne de l'objet de classe E // associ l'objet courant de classe I } private int n ; } private int ne ; // champ priv de E } . E e1 = new E ( ), e2 = new E ( ) ; e1.fe ( ) ; // l'objet cr par fe sera associ e1 // dans fi, ne dsignera e1.n e2.fe ( ) ; // l'objet cr par fe sera associ e2 // dans fi, ne dsignera e2.n

Les paquetages
La notion du paquetage correspond un regroupement logique sous un identificateur commun d'un ensemble de classes.

Attribution d'une classe un paquetage

Un paquetage est caractris par un nom qui est :


soit un simple identificateur soit une suite d'identificateurs spars par des points. L'attribution d'un nom de paquetage se fait au niveau du fichier source , toutes les classes d'un mme fichier source appartiendront donc toujours un mme paquetage. Pour ce faire, on place, en dbut de fichier, une instruction de la forme : Package xxxxx ; Dans laquelle xxxxx reprsente le nom du paquetage La notion de paquetage est une notion logique, n'ayant qu'un rapport partiel avec la localisation effective des classes ou des fichiers au sein de rpertoires.

Utilisation d'une classe d'un paquetage

Lorsque, dans un programme, on fait rfrence une classe, le compilateur la recherche dans le paquetage par dfaut.

Pour utiliser une classe appartenant un autre paquetage, il est ncessaire de :


Citer le nom du paquetage avec le nom de la classe Utiliser une instruction import en y citant soit une classe particulire d'un paquetage, soit tout un paquetage

Paquetage et droit d'accs

Droits d'accs aux classes : Avec le mot cl public, une classe est accessible toutes les autres classes. Sans le mot cl public, la classe n'est accessible qu'aux classes du mme paquetage

Droits d'accs aux membres d'une classe :

Avec le mot cl public, le membre est accessible depuis l'extrieur de la classe


Avec le mot cl private, le membre n'est accessible qu'aux mthodes de la classe Sans mot cl (public ou private), l'accs au membre est limit aux classes du mme paquetage

Paquetage et droit d'accs

Pour les classes internes on a :


Avec le mot cl public, la classe interne est accessible partout o sa classe externe l'est. Avec private (qui est utilisable avec une classe interne, alors qu'il ne l'est pas pour une classe externe), la classe interne n'est accessible que depuis sa classe externe.

Sans aucun mot cl, la classe interne n'est accessible que depuis les classes du
mme paquetage