LU2IN002
PREMIER OBJET
Vincent Guigue & Christophe Marsala
Philosophie
Diviser un programme complexe en objets:
objet autonome: réutilisable dans plusieurs projets Vecteurs, Personne, MoteurGraphique...
objetsécurisé: garantie de bon usage par d’autre
un objet intègre desdonnées et desméthodespour les manipuler proprement, les transactions bancaires sont journalisées, les éléments d’une simulation physique ne se téléportent pas...
objetsimple & intuitif: le client ne voit que ce qui est nécessaire Enjeux:
Réfléchir en amontau découpage & à la sécurisation
Documenterle code (en premier lieu, respecter les conventions pour faciliter la compréhension)
Encapsulation = vue interne + vue externe
Objet
données
données
données Vérification des entrées/sorties
Barrière de sécurisation
=
encapsulation
Encapsulation = vue interne + vue externe
Point
I/O:
- construction - accès en lecture - translation...
Barrière de sécurisation
=
encapsulation
double x double y
Encapsulation = vue interne + vue externe
Point de vue fournisseur :
Point
I/O:
- construction - accès en lecture - translation...
Barrière de sécurisation
= encapsulation
double x double y
Nouveau fichier, nouvelle classe Point.java
Comment construire un objet?
e.g. J’attends 2 valeurs réelles je mets à jourxety
Comment établir un dialogue (IO)?
je définis une méthode pour observerx je réfléchis à la manière de modifierxet y
Accès direct
Addition, soustraction, ...
Encapsulation = vue interne + vue externe
Point de vue client :
Point
I/O:
- construction - accès en lecture - translation...
Barrière de sécurisation
= encapsulation
double x double y
Nouveau type de variable int i; Point p;
Comment construire un objet?
Je donne 2 valeurs réelles + syntaxe p = new Point(1.2, 3.1);
Comment dialoguer?
J’utilise le. pour accéder à l’interface de l’objet:
p.getX();
Encapsulation = vue interne + vue externe Point de vue client :
Point
I/O:
- construction - accès en lecture - translation...
Barrière de sécurisation
= encapsulation
double x double y
Nouveau type de variable int i; Point p;
Comment construire un objet?
Je donne 2 valeurs réelles + syntaxe p = new Point(1.2, 3.1);
Comment dialoguer?
J’utilise le. pour accéder à l’interface de l’objet:
p.getX();
⇒De l’extérieur, je ne me demande pas comment marche l’objet
Trivial sur unPoint... Mais imaginons la même chose avec une classe Image
Syntaxe: signature et attributs
1 Fichier: 1 classe = 1 fichier
nom de la classe + .java = nom du fichier marquer l’encapsulation, faciliter la ré-utilisation le nom de classe commence par une majuscule
2 Signature: une classe est toujours public(en LU2IN002)
3 Déclaration des attributs:
Répondre à : De quoi est composé notre objet?
Les attributs sont presque toujoursprivate(cf plus loin) nom des attributs en minuscules
4 Définir des méthodes
Comment construire un objet?
Quelles opérations effectuer sur l’objet? nom des méthode en minuscules
1 // C r e a t i o n du f i c h i e r P o i n t . java
2 p u b l i c c l a s s P o i n t { // c l a s s e p u b l i q u e
3 p r i v a t e d o u b l e x , y ; // a t t r i b u t s p r i v e s
Syntaxe: signature et attributs
1 Fichier: 1 classe = 1 fichier
nom de la classe + .java = nom du fichier marquer l’encapsulation, faciliter la ré-utilisation le nom de classe commence par une majuscule
2 Signature: une classe est toujours public(en LU2IN002)
3 Déclaration des attributs:
Répondre à : De quoi est composé notre objet?
Les attributs sont presque toujoursprivate(cf plus loin) nom des attributs en minuscules
4 Définir des méthodes
Comment construire un objet?
Quelles opérations effectuer sur l’objet? nom des méthode en minuscules
1 // C r e a t i o n du f i c h i e r P o i n t . java
2 p u b l i c c l a s s P o i n t { // c l a s s e p u b l i q u e
3 p r i v a t e d o u b l e x , y ; // a t t r i b u t s p r i v e s
Syntaxe: signature et attributs
1 Fichier: 1 classe = 1 fichier
nom de la classe + .java = nom du fichier marquer l’encapsulation, faciliter la ré-utilisation le nom de classe commence par une majuscule
2 Signature: une classe est toujours public(en LU2IN002)
3 Déclaration des attributs:
Répondre à : De quoi est composé notre objet?
Les attributs sont presque toujoursprivate(cf plus loin) nom des attributs en minuscules
4 Définir des méthodes
Comment construire un objet?
Quelles opérations effectuer sur l’objet? nom des méthode en minuscules
1 // C r e a t i o n du f i c h i e r P o i n t . java
2 p u b l i c c l a s s P o i n t { // c l a s s e p u b l i q u e
3 p r i v a t e d o u b l e x , y ; // a t t r i b u t s p r i v e s
Syntaxe: signature et attributs
1 Fichier: 1 classe = 1 fichier
nom de la classe + .java = nom du fichier marquer l’encapsulation, faciliter la ré-utilisation le nom de classe commence par une majuscule
2 Signature: une classe est toujours public(en LU2IN002)
3 Déclaration des attributs:
Répondre à : De quoi est composé notre objet?
Les attributs sont presque toujoursprivate(cf plus loin) nom des attributs en minuscules
4 Définir des méthodes
Comment construire un objet?
Quelles opérations effectuer sur l’objet?
nom des méthode en minuscules
1 // C r e a t i o n du f i c h i e r P o i n t . java
2 p u b l i c c l a s s P o i n t { // c l a s s e p u b l i q u e
3 p r i v a t e d o u b l e x , y ; // a t t r i b u t s p r i v e s
Syntaxe: constructeur
Comment construire unPoint?
Attention à considérer le problème des 2 points de vues Fournisseur
Besoin: 2 coordonnées fournies en argument Action: affectation des valeurs des attributs
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4
5 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
Client
ie: utilisateur d’une classe Point existante... Besoin: créer une instance dans la mémoire avec les bonnes valeurs
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 }
9 }
Syntaxe: constructeur
Comment construire unPoint?
Attention à considérer le problème des 2 points de vues Fournisseur
Besoin: 2 coordonnées fournies en argument Action: affectation des valeurs des attributs
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4
5 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
Client
ie: utilisateur d’une classe Point existante...
Besoin: créer une instance dans la mémoire avec les bonnes valeurs
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 }
9 }
Syntaxe: constructeur
Comment construire unPoint?
Attention à considérer le problème des 2 points de vues Fournisseur
Besoin: 2 coordonnées fournies en argument Action: affectation des valeurs des attributs
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4
5 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
Client
ie: utilisateur d’une classe Point existante...
Besoin: créer une instance dans la mémoire avec les bonnes valeurs
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 }
9 }
Autorisations d’accès
public: accessible / visible depuis l’extérieur de l’objet (eg : main, autre objet...) private : protégé / invisible depuis l’extérieur de l’objet
Constructeurs = publicen général: ils sont appelés depuis l’extérieur Attributs = private en général, ils sont protégés et non accessibles depuis l’extérieur
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 private d o u b l e x , y ;
4
5 public P o i n t (d o u b l e x2 , d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5
6 // opération autorisée
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8
9 // opération impossible :
10 // ERREUR DE COMPILATION
11 d o u b l e d = p . x ;
12 }
13 } 6/15
Syntaxe : méthodes
Comment manipuler un Point?
1 définir des méthodes
eg: accéder aux attributs (en lecture)
2 les invoquer depuis l’extérieur
Objet
données
données
données Vérification des entrées/sorties
Barrière de sécurisation
= encapsulation
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ;
6 y = y2 ;
7 }
8
9 p u b l i c d o u b l e g e t X ( ) { r e t u r n x ; }
10 11 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7
8 d o u b l e px = p . ge t X ( ) ;
9
10 S y s t e m . o u t . p r i n t l n (
11 " c o o r d ␣ x ␣ de ␣ p : "+px ) ;
12 }
13 }
Syntaxe: surcharge du constructeur
Comment construire unPoint? ... de plusieurs manières !
Ex:
2 valeurs à fournir: le plus classique 0 valeur: génération aléatoire dexety 1 valeur: affectation de la même valeur pour xety
⇒Syntaxe triviale : il suffit de définir plusieurs constructeurs
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ; y = y2 ;
6 }
7 p u b l i c P o i n t (d o u b l e d ) { x = d ; y = d ; }
8
9 p u b l i c P o i n t ( ) { // a u t r e s u r c h a r g e
10 // a l e a t o i r e e n t r e 0 e t 10
11 x = Math . random ( )∗1 0 ;
12 y = Math . random ( )∗1 0 ;
13 }
14 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7 // c o n s t r u c t i o n d ’ un a u t r e p o i n t :
8 P o i n t p2 = new P o i n t ( ) ;
9 // c o n s t r u c t i o n d ’ un 3 e p o i n t :
10 P o i n t p3 = new P o i n t ( 4 . 2 ) ;
11 }
12 }
Syntaxe: surcharge du constructeur
Comment construire unPoint? ... de plusieurs manières !
Ex:
2 valeurs à fournir: le plus classique 0 valeur: génération aléatoire dexety 1 valeur: affectation de la même valeur pour xety
⇒Syntaxe triviale : il suffit de définir plusieurs constructeurs
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ; y = y2 ;
6 }
7 p u b l i c P o i n t (d o u b l e d ) { x = d ; y = d ; }
8
9 p u b l i c P o i n t ( ) { // a u t r e s u r c h a r g e
10 // a l e a t o i r e e n t r e 0 e t 10
11 x = Math . random ( )∗1 0 ;
12 y = Math . random ( )∗1 0 ;
13 }
14 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7 // c o n s t r u c t i o n d ’ un a u t r e p o i n t :
8 P o i n t p2 = new P o i n t ( ) ;
9 // c o n s t r u c t i o n d ’ un 3 e p o i n t :
10 P o i n t p3 = new P o i n t ( 4 . 2 ) ;
11 }
12 }
Syntaxe: surcharge du constructeur
Comment construire unPoint? ... de plusieurs manières !
Ex:
2 valeurs à fournir: le plus classique 0 valeur: génération aléatoire dexety 1 valeur: affectation de la même valeur pour xety
⇒Syntaxe triviale : il suffit de définir plusieurs constructeurs
CONTRAINTE:signatures des constructeurs différentes
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ; y = y2 ;
6 }
7 p u b l i c P o i n t (d o u b l e d ) { x = d ; y = d ; }
8
9 p u b l i c P o i n t ( ) { // a u t r e s u r c h a r g e
10 // a l e a t o i r e e n t r e 0 e t 10
11 x = Math . random ( )∗1 0 ;
12 y = Math . random ( )∗1 0 ;
13 }
14 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7 // c o n s t r u c t i o n d ’ un a u t r e p o i n t :
8 P o i n t p2 = new P o i n t ( ) ;
9 // c o n s t r u c t i o n d ’ un 3 e p o i n t :
10 P o i n t p3 = new P o i n t ( 4 . 2 ) ;
11 }
12 } 8/15
ATTENTION: informatique 6=infomagique
Créer un point avec deux coordonnéesaet b:
1 le main/ le client doit donner aet b: ⇒on ne peut pas inventer les valeurs !
2 La classePoint / le fournisseur doit avoir prévu de recevoir deux valeurs
L’exécution d’un programme n’est pas magique non plus:
1 on peut suivre l’exécution ligne par ligne
2 on peut comprendre les choix de la machine
⇒ il ne peut pas y avoir deux méthodes qui s’appellent pareil
⇒Du bon sens et encore du bon sens !!!! Faîtes quelques erreurs de syntaxe [mais pas trop]...
mais n’écrivez pas n’importe quoi !
ATTENTION: informatique 6=infomagique
Créer un point avec deux coordonnéesaet b:
1 le main/ le client doit donner aet b: ⇒on ne peut pas inventer les valeurs !
2 La classePoint / le fournisseur doit avoir prévu de recevoir deux valeurs L’exécution d’un programme n’est pas magique non plus:
1 on peut suivre l’exécution ligne par ligne
2 on peut comprendre les choix de la machine
⇒ il ne peut pas y avoir deux méthodes qui s’appellent pareil
⇒Du bon sens et encore du bon sens !!!! Faîtes quelques erreurs de syntaxe [mais pas trop]...
mais n’écrivez pas n’importe quoi !
ATTENTION: informatique 6=infomagique
Créer un point avec deux coordonnéesaet b:
1 le main/ le client doit donner aet b: ⇒on ne peut pas inventer les valeurs !
2 La classePoint / le fournisseur doit avoir prévu de recevoir deux valeurs L’exécution d’un programme n’est pas magique non plus:
1 on peut suivre l’exécution ligne par ligne
2 on peut comprendre les choix de la machine
⇒ il ne peut pas y avoir deux méthodes qui s’appellent pareil
⇒Du bon sens et encore du bon sens !!!!
Faîtes quelques erreurs de syntaxe [mais pas trop]...
mais n’écrivez pas n’importe quoi !
Syntaxe: méthodes standards
Les méthodes standards existent sur tous les objets (cf cours héritage)...
Mais le comportement n’est pas satisfaisant Parce que l’infomagiquen’existe pas equals,toString, ....
Ex: conversion d’un objet en chaine de caractèrespublic String toString()
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 . . .
4 5 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7
8 S t r i n g s t r = p . t o S t r i n g ( ) ;
9 S y s t e m . o u t . p r i n t l n (" p : " + s t r ) ;
10 }
11 }
» p: Point@8764152
Syntaxe: méthodes standards
Les méthodes standards existent sur tous les objets (cf cours héritage)...
Mais le comportement n’est pas satisfaisant Parce que l’infomagiquen’existe pas equals,toString, ....
Ex: conversion d’un objet en chaine de caractèrespublic String toString() Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 . . .
4 public String toString(){
5 return "["+ x +","+ y +"]";
6 }
7 }
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // c o n s t r u c t i o n d ’ un p o i n t :
6 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
7
8 S t r i n g s t r = p . t o S t r i n g ( ) ;
9 S y s t e m . o u t . p r i n t l n (" p : " + s t r ) ;
10 }
11 }
» p: [2, 3.1]
Reflexion sur la syntaxe objet
Exemple type: addition entre 2Point
Réfléchir à la signature d’une méthodeaddpermettant d’additionner 2 instances dePoint (en retournant une nouvelle instance dont les coordonnées sont les sommes respectives desxety des attributs des opérandes)
⇒Quelle signature de méthode pour add? Argument(s) / retour?
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5
6 // c o n s t r u c t i o n d ’ un p o i n t :
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 P o i n t p2 = new P o i n t ( 0 . 5 , 1 ) ;
9
10 P o i n t p3 = p . add ( p2 ) ;
11 }
12 }
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ;
6 y = y2 ;
7 }
8
9 p u b l i c P o i n t add ( P o i n t p ) {
10 r e t u r n new P o i n t ( x+p . x , y+p . y ) ;
11 }
Syntaxe objet = un truc à prendre... Pas évident au début !
Reflexion sur la syntaxe objet
Exemple type: addition entre 2Point
Réfléchir à la signature d’une méthodeaddpermettant d’additionner 2 instances dePoint (en retournant une nouvelle instance dont les coordonnées sont les sommes respectives desxety des attributs des opérandes)
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5
6 // c o n s t r u c t i o n d ’ un p o i n t :
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 P o i n t p2 = new P o i n t ( 0 . 5 , 1 ) ;
9
10 P o i n t p3 = p . add ( p2 ) ;
11 }
12 }
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ;
6 y = y2 ;
7 }
8
9 p u b l i c P o i n t add ( P o i n t p ) {
10 r e t u r n new P o i n t ( x+p . x , y+p . y ) ;
11 }
Syntaxe objet = un truc à prendre... Pas évident au début !
Reflexion sur la syntaxe objet
Exemple type: addition entre 2Point
Réfléchir à la signature d’une méthodeaddpermettant d’additionner 2 instances dePoint (en retournant une nouvelle instance dont les coordonnées sont les sommes respectives desxety des attributs des opérandes)
Client
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5
6 // c o n s t r u c t i o n d ’ un p o i n t :
7 P o i n t p = new P o i n t ( 2 . , 3 . 1 ) ;
8 P o i n t p2 = new P o i n t ( 0 . 5 , 1 ) ;
9
10 P o i n t p3 = p . add ( p2 ) ;
11 }
12 }
Fournisseur
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 , d o u b l e y2 ) {
5 x = x2 ;
6 y = y2 ;
7 }
8
9 p u b l i c P o i n t add ( P o i n t p ) {
10 r e t u r n new P o i n t ( x+p . x , y+p . y ) ;
11 }
Syntaxe objet = un truc à prendre... Pas évident au début !
Surcharge
Même nom de fonction, arguments différents Le type de retour ne compte pas
1 p u b l i c c l a s s P o i n t {
2 . . .
3 p u b l i c v o i d move (d o u b l e dx , d o u b l e dy ) {
4 x+=dx ; y+=dy ;
5 }
6 p u b l i c v o i d move (d o u b l e dx , d o u b l e dy , d o u b l e s c a l e ) {
7 x+=dx∗s c a l e ; y+=dy∗s c a l e ;
8 }
9 p u b l i c v o i d move (i n t dx , i n t dy ) {
10 x+=dx ; y+=dy ;
11 }
12 p u b l i c v o i d move ( P o i n t p ) {
13 x+=p . x ; y+=p . y ;
14 }
Rappel: dans la classePoint, vous avez accès aux attributs privés des autres instances de Point
Compilation/exécution
Nous avions vu précédemment comment compiler et executerUNE classe... Comment faire maintenant qu’il y en a plusieurs?
» javac Point.java
» javac TestPoint.java
» java TestPoint Syntaxe réduite:
» javac Point.java TestPoint.java OU javac *.java
» java TestPoint
Remarque: il peut y avoirplusieurs main
(mais pas plus de 1 par classe) Compilation de tous les maind’un coup
Execution d’un seul (appel à la classe correspondante)
Cas ambigus: this.
Un argument de méthode et un attribut portent le même nom: il faut les distinguer!
Exemple le plus classique: le constructeur
1 p u b l i c c l a s s P o i n t {
2 p r i v a t e double x,y; // a t t r i b u t s
3 p u b l i c P o i n t (double x, double y) { // a r g u m e n t s du c o n s t r u c t e u r
4 // d i s t i n g u e r l ’ a t t r i b u t e t l ’ a r g u m e n t
5 // p o u r f a i r e l ’ a f f e c t a t i o n d a n s l e bon s e n s
6 this.x = x; // u t i l i s e r l ’ a r g u m e n t p o u r i n i t . l ’ a t t r i b u t
7 this.y = y;
8 }
9 }
Vous avez toujours le droit d’utiliser la syntaxethis.attrpour désigner l’attributattr dans la classe (même dans les cas non ambigus)
Vous pouvez utiliserthis.maMethode()pour invoquermaMethodelorsque vous êtes dans une autre méthode de l’objet.
Cas ambigus: this.
Un argument de méthode et un attribut portent le même nom: il faut les distinguer!
Exemple le plus classique: le constructeur
1 p u b l i c c l a s s P o i n t {
2 p r i v a t e double x,y; // a t t r i b u t s
3 p u b l i c P o i n t (double x, double y) { // a r g u m e n t s du c o n s t r u c t e u r
4 // d i s t i n g u e r l ’ a t t r i b u t e t l ’ a r g u m e n t
5 // p o u r f a i r e l ’ a f f e c t a t i o n d a n s l e bon s e n s
6 this.x = x; // u t i l i s e r l ’ a r g u m e n t p o u r i n i t . l ’ a t t r i b u t
7 this.y = y;
8 }
9 }
Vous avez toujours le droit d’utiliser la syntaxethis.attrpour désigner l’attributattr dans la classe (même dans les cas non ambigus)
Vous pouvez utiliserthis.maMethode()pour invoquermaMethodelorsque vous êtes dans une autre méthode de l’objet.
Constructeur multiple: usage du this()
Approche standard pour écrire plusieurs constructeurs dans une classe:
1 Ecrire le constructeur général, prenant le plus d’arguments
2 Appeler le constructeur 1 avec des arguments spécifiques
⇒éviter les copier-coller, fiabiliser le code
1 p u b l i c c l a s s P o i n t {
2 p r i v a t e d o u b l e x , y ; // a t t r i b u t s
3
4 p u b l i c P o i n t (d o u b l e x , d o u b l e y ) { // c o n s t r u c t e u r 1
5 t h i s. x = x ;
6 t h i s. y = y ;
7 }
8
9 p u b l i c P o i n t ( ) { // c o n s t r u c t e u r 2
10 // ATTENTION : aucun code avant this()
11 t h i s( Math . random ( )∗1 0 , Math . random ( )∗1 0 ) ; // i n v o c a t i o n
12 // du c o n s t r u c t e u r 1
13 }
14 }