Vous êtes sur la page 1sur 25

Programmation en Java 1.

De C à Java
V.Padovani, PPS, Paris-Diderot
1.1. Eléments de base du langage
éléments communs à C et Java :

 notions de variable, de typage, d'aectation,

 types numériques int, float, double, etc.

 opérateurs arithmétiques + *, -, /, ++, ---, etc.

 opérateurs de comparaison <, <=, ==, !=, >=, >,


 conditions, connecteurs ||, &&, !,
 structures if/else, for, while, do/while, switch,
 ?/:, break, continue
les variables se déclarent à la volée (6= C ANSI).

Programmation en Java 1 Programmation en Java 3

PARTIE I - Classes et Objets  un type boolean de constantes true, false.


basicstyle
basicstyle
boolean b = (x == 3) && (y + 10 < z); basicstyle
 Eléments communs à C et Java

 Classes, objets et références  Les conditions doivent être de type booléen :

 Initialisation des objets : les constructeurs basicstyle


if
basicstyle
(x != 0) { ... } // et non if (x), comme en C. basicstyle

 Modication des objets : les méthodes.


 Un for peut avoir un compteur local :

basicstyle
for
basicstyle
(int i = 0; i < n; i++) { basicstyle
basicstyle
basicstyle
// i declare et visible seulement basicstyle
// dans le corps de la boucle,
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 2 Programmation en Java 4


1.2. Syntaxe des tableaux 1.3. Achage
 déclarés et crées :  équivalents de printf :

 à l'aide de l'opérateur new :  System.out.print


basicstyle
int[]
basicstyle
t = new int[100]; basicstyle  System.out.println (retour à la ligne)

 ou par initialisation explicite :  plus besoin de spécicateurs de format :

basicstyle
int[]
basicstyle
u = {2,3,0,1}; basicstyle basicstyle
for
basicstyle
(int i = 0; i < 10; i++) { basicstyle
basicstyle
basicstyle
System.out.print ("le carre de"); basicstyle
même syntaxe d'accès qu'en C : t[i] = 42; etc. System.out.print (i);
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
System.out.print (" est "); basicstyle
 int[] est le type des tableaux d'entiers. System.out.println (i * i);
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle
 Les tableaux sont gratuitement initialisés à 0. System.out.println
basicstyle
basicstyle ('a'); basicstyle
basicstyle
System.out.println
basicstyle (3.14); // etc. basicstyle

Programmation en Java 5 Programmation en Java 7

 la taille des tableaux est libre (plus de malloc/free) :  System.out.print ou System.out.println peuvent

basicstyle
basicstyle
double[] t = new double[n + 42]; basicstyle prendre plusieurs arguments séparés par des +...

 t.length vaut le nombre d'éléments de t. basicstyle


for
basicstyle
(int i = 0; i < 10; i = i++) basicstyle
basicstyle
basicstyle
System.out.println basicstyle
 les accès sont vériés à l'exécution. basicstyle
basicstyle
("le carre de " + i + " est " + (i * i)); basicstyle

les accès invalides interrompent l'exécution.  l'association des + s'eectue de gauche à droite.

basicstyle
char[]
basicstyle
t = new char[100]; basicstyle entre deux valeurs numériques, + garde le sens de addition.
basicstyle
basicstyle
/* basicstyle
* t[-1] = 'a';
basicstyle
basicstyle // erreur d'execution basicstyle basicstyle
int
basicstyle
i = 2; basicstyle
basicstyle
basicstyle
* t[100] = 'a'; // erreur d'execution basicstyle basicstyle
System.out.println
basicstyle (i + i); // affiche 4. basicstyle
basicstyle
basicstyle
*/ basicstyle basicstyle
System.out,println
basicstyle (i + " " + i) // affiche 2 2 basicstyle
basicstyle
System.out,println
basicstyle (i + i + " " + i) // affiche 4 2 basicstyle

Programmation en Java 6 Programmation en Java 8


 il existe un type String pour les chaînes de caractères.  les conversions vers un type plus petit doivent toujours être

explicites.
 + est l'opérateur de concaténation des chaînes.
basicstyle
basicstyle
/* erreur a la compilation basicstyle
 on peut concaténer une chaîne et une valeur numérique, basicstyle
basicstyle
* int x = 1; basicstyle
convertie dans ce cas en String. basicstyle
basicstyle
* char c = 'a' + x; // 'a' promu en int basicstyle
*/
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
String s = "abc"; basicstyle basicstyle
/*
basicstyle
correct. d vaut 'b' */ basicstyle
basicstyle
System.out.println
basicstyle (s); // affiche "abc" basicstyle basicstyle
basicstyle
int x = 1; basicstyle
basicstyle
sbasicstyle
= s + "def"; basicstyle char d = (char) ('a' + x); // somme convertie en char.
basicstyle
basicstyle basicstyle
System.out.println
basicstyle
basicstyle (s); // affiche "abcdef" basicstyle basicstyle
basicstyle basicstyle
basicstyle
sbasicstyle
= s + 42; basicstyle basicstyle
/*
basicstyle
erreur a la compilation. 2.5f n'est pas dans basicstyle
basicstyle
System.out.println
basicstyle (s); // affiche "abcdef42" basicstyle * les valeurs du type int :
basicstyle
basicstyle basicstyle
// etc.
basicstyle
basicstyle basicstyle basicstyle
basicstyle
* int x = 2.5f; basicstyle
basicstyle
basicstyle
*/ basicstyle
 un argument numérique de println sera converti en String basicstyle
/*
basicstyle
correct. x vaut l'arrondi 2 */ basicstyle
basicstyle
int
basicstyle
x = (int) 2.5f; basicstyle
(les chaînes sont des objets, sens à préciser).

Programmation en Java 9 Programmation en Java 11

1.4. Hiérarchie des types de base et conversions  les conversions vériables dès la compilation sont inutiles :

/* correct : la valeur 'b' assignee peut etre


basicstyle
basicstyle basicstyle
 boolean (true, false) basicstyle
basicstyle
* pre-calculee des la compilation, et cette valeur basicstyle
 byte (8 bits, signé) basicstyle
basicstyle
* reste dans les limites du type char */ basicstyle
basicstyle
char
basicstyle
e = 'a' + 1; basicstyle
 char (16 bits, non signé) (i.e. jeu de caractères étendu)

 short (16 bits, signé)


 ++ et -- opèrent sans conversions :

 int (32 bits, signé) basicstyle


char
basicstyle
c = 'a'; basicstyle
basicstyle
c++;
basicstyle basicstyle
 long (64 bits signé) basicstyle
/*
basicstyle
c vaut 'b' */ basicstyle
 float basicstyle
basicstyle basicstyle
basicstyle
char
basicstyle
d = 'a'; basicstyle
 double basicstyle
/*
basicstyle
erreur ! d promu en int, d + 1 en int basicstyle
basicstyle
basicstyle
* d = d + 1; basicstyle
basicstyle
basicstyle
*/ basicstyle
basicstyle
basicstyle basicstyle
basicstyle
/*
basicstyle
correct */ basicstyle
basicstyle
dbasicstyle
= (char) d + 1; basicstyle

Programmation en Java 10 Programmation en Java 12


2. Objets, Classes et Références basicstyle
//
basicstyle
fichier Exemple.java (meme nom que la classe principale) basicstyle
basicstyle
basicstyle
// definition d'une nouvelle classe Point2D basicstyle
2.1. Des structures de C aux classes de Java class Point2D {
basicstyle
basicstyle // modele d'objet a deux champs basicstyle
basicstyle
basicstyle
int abs; // de type int, valeurs par defaut 0 basicstyle
 objet ≡ une généralisation de la notion de structure en C. int ord;
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle
 comme une structure C, un objet basicstyle
//
basicstyle
definition de la classe principale du fichier basicstyle
basicstyle
public
basicstyle
class Exemple { basicstyle
 encapsule des données désignées par des noms de champs, // "fonction" principale
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
public static void main (String[] args) { basicstyle
 est créé suivant un certain modèle déni à l'avance.
// declaration de reference vers les objets de Point2D
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Point2D p; basicstyle
modèle d'objet ≡ classe de cet objet.
basicstyle
basicstyle
// creation d'une instance de Point2D, basicstyle
basicstyle
basicstyle
// stockage de son adresse dans p basicstyle
objets d'une classe ≡ instances de cette classe.
basicstyle
basicstyle
p = new Point2D (); basicstyle
basicstyle
basicstyle
// acces aux champs de l'objet via p basicstyle
 un programme Java est suite de dénitions de classes.
basicstyle
basicstyle
p.abs = 42; basicstyle
p.ord = 10;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 13 Programmation en Java 15

basicstyle
//
basicstyle
fichier exemple.c basicstyle
 les valeurs de champs sont nulles à la création d'un objet,
basicstyle
//
basicstyle
definition d'un nouveau type de structure basicstyle
basicstyle
struct
basicstyle
point2D { // modele de structure a deux champs basicstyle sauf si l'on spécie explicitement d'autres valeurs :
basicstyle
basicstyle
int abs; // de type int, indefinis par defaut basicstyle
basicstyle
basicstyle
int ord; basicstyle basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
};
basicstyle basicstyle basicstyle
basicstyle
int abs = 10; // valeur par defaut pour chaque instance basicstyle
// fonction principale
basicstyle
basicstyle basicstyle basicstyle
basicstyle
cree basicstyle
basicstyle
basicstyle
int main (int argc, char *argv[]) { basicstyle basicstyle
basicstyle
int ord; // valeur nulle a la creation basicstyle
basicstyle
basicstyle
// declaration de pointeur vers struct point2D basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
struct point2D *p; basicstyle
basicstyle
basicstyle
// stockage d'une adresse d'allocation dans p basicstyle
p = malloc (sizeof (struct point2D));
basicstyle
basicstyle basicstyle
// acces aux champs de la structure allouee via p
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
(*p).abs = 42; basicstyle
(*p).ord = 10;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle
free (p);
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
return 0; basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 14 Programmation en Java 16


2.2. Les références  deux références peuvent référencer le même objet :

 référence en Java :
basicstyle
basicstyle
Point2D p, q; basicstyle
basicstyle
basicstyle basicstyle
 variable pouvant contenir l'adresse-mémoire d'un objet
pbasicstyle
= new Point2D (); // nouvel objet, reference par p
basicstyle basicstyle
 similaire à un pointeur vers structure de C, mais basicstyle
qbasicstyle
= p; // p et q referencent a present le basicstyle
sans la notation * pour l'accès aux champs. meme objet
basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle
 la classe des objets sur lesquels pourra pointer une référence p.abs = 42;
basicstyle
basicstyle // acces a l'objet via p basicstyle
basicstyle
q.ord
basicstyle
= 10; // acces au meme objet via q basicstyle
est spéciée par sa déclaration:
basicstyle
basicstyle basicstyle
nom de classe nom de référence;
basicstyle
System.out.println
basicstyle (" p.abs = " + p.abs); // 42 basicstyle
System.out.println
basicstyle
basicstyle (" p.ord = " + p.ord); // 10 basicstyle
Point2D p; basicstyle
basicstyle basicstyle
basicstyle
System.out.println
basicstyle (" q.abs = " + q.abs); // 42 basicstyle
(aucun objet créé, p est pour l'instant de valeur indénie).
basicstyle
System.out.println
basicstyle (" q.ord = " + q.ord); // 10 basicstyle
 on peut donner à une référence la valeur nulle : p = null;.

Programmation en Java 17 Programmation en Java 19

2.3. Création et référencement des instances  une même référence peut pointer vers plusieurs objets au cours

du temps :
 création d'une instance via new + nom de classe :
basicstyle
basicstyle
Point2D p = new Point2D (); // une 1ere instance creee basicstyle
basicstyle
Point2D
basicstyle
p; // p de valeur indefinie basicstyle basicstyle
pbasicstyle
= new Point2D (); // une 2nde instance creee basicstyle
basicstyle
basicstyle basicstyle
basicstyle
pbasicstyle
= new Point2D ();// allocation d'un objet en memoire, basicstyle
basicstyle
basicstyle // retour de son adresse, stockage de basicstyle La 1ère instance créée est dénitivement perdue.
basicstyle
basicstyle // cette adresse dans p basicstyle
basicstyle
basicstyle basicstyle  pas de fuite de mémoire : les objets qui ne sont plus référencés
basicstyle
//
basicstyle
p reference/designe/pointe a present vers l'objet cree basicstyle
seront tôt ou tard eacés de la mémoire ("garbage collecting"
basicstyle
basicstyle basicstyle
p.abs = 42;
basicstyle
basicstyle // acces aux champs de l'objet basicstyle automatique).
p.ord = 10;
basicstyle
basicstyle // via la reference p. basicstyle

Programmation en Java 18 Programmation en Java 20


 les champs d'un objet peuvent être de type référence :
 on peut forcer la création des extrémités via l'initialisation des

basicstyle
basicstyle
class Point2D { basicstyle champs :
basicstyle
basicstyle
int abs; // valeurs par defaut : 0 basicstyle
int ord;
basicstyle
basicstyle basicstyle basicstyle
class
basicstyle
Segment { basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
Point2D debut = new Point2D (); // (re)-evalues a chaque basicstyle
basicstyle
basicstyle basicstyle basicstyle
basicstyle
Point2D fin = new Point2D (); // creation de segment. basicstyle
basicstyle
basicstyle
class Segment { basicstyle basicstyle
}basicstyle basicstyle
Point2D debut; // valeurs par defaut : null
basicstyle
basicstyle basicstyle basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Point2D fin; basicstyle basicstyle
basicstyle
//... basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
chaque creation de segment cree aussi deux points : basicstyle
la création d'un segment ne crée pas ses extrémités : Segment s = new Segment ();
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Segment t = new Segment (); basicstyle
il faut deux new supplémentaires par segment...

Programmation en Java 21 Programmation en Java 23

basicstyle
Segment
basicstyle
s = new Segment (); basicstyle 2.4. Remarques
basicstyle
basicstyle basicstyle
// pour l'instant, s.debut et s.fin valent null.
basicstyle
basicstyle basicstyle  on confond souvent objet et référence vers objet :
basicstyle
//
basicstyle
creation des extremites et cablage : basicstyle
basicstyle
basicstyle basicstyle  "l'objet référencé par p", ou
basicstyle
Point2D
basicstyle
p1 = new Point2D (); basicstyle
basicstyle
Point2D
basicstyle
p2 = new Point2D (); basicstyle  "l'objet p"
basicstyle
basicstyle
s.debut = p1; // s.debut et p1 designent le meme objet basicstyle
s.fin = p2; // s.fin
basicstyle
basicstyle et p2 designent le meme objet basicstyle
 "le point 2D p"
basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
creation directe des extremites : basicstyle  une référence contient plus d'information qu'un pointeur :
basicstyle
basicstyle basicstyle
basicstyle
Segment
basicstyle
t = new Segment (); basicstyle basicstyle
Point2D
basicstyle
p = new Point2D (); basicstyle
basicstyle
t.debut
basicstyle
= new Point2D (); basicstyle basicstyle
System.out.println
basicstyle (p); basicstyle
basicstyle
t.fin
basicstyle
= new Point2D (); basicstyle
ache e.g. Point2D@defa1a (classe + adresse).

Programmation en Java 22 Programmation en Java 24


3. Initialisation d'Objets : les Constructeurs basicstyle
class
basicstyle
Point2D { basicstyle
int abs;
basicstyle
basicstyle basicstyle
3.1. Dénitions de constructeurs int ord;
basicstyle
basicstyle basicstyle
Point2D () {}
basicstyle
basicstyle basicstyle
 constructeur ≡ code d'initialisation placé dans une dénition
basicstyle
basicstyle
Point2D (int x, int y) { basicstyle
de classe. ce code peut être appelé au moment de la création abs = x;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
ord = y; basicstyle
d'une instance.
basicstyle
basicstyle
} basicstyle
 chaque constructeur porte le même nom que la classe et peut }basicstyle
basicstyle basicstyle

avoir des paramètres.


 codes équivalents :
basicstyle
class
basicstyle
Point2D { basicstyle
 basicstyle
Point2D
basicstyle
p = new Point2D (); basicstyle
basicstyle
basicstyle
int abs; basicstyle
basicstyle
p.abs
basicstyle
= 42; basicstyle
basicstyle
basicstyle
int ord; basicstyle
basicstyle
p.ord
basicstyle
= 10; basicstyle
basicstyle
basicstyle
Point2D () {} // constructeur sans arguments basicstyle
basicstyle
basicstyle
Point2D (int x, int y) { // constructeur a deux arguments basicstyle
abs = x; ord = y;
basicstyle
basicstyle basicstyle
 et :

basicstyle
basicstyle
} basicstyle Point2D p = new Point2D (42, 10);
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 25 Programmation en Java 27

 l'appel d'un constructeur ne peut se faire qu'avec un new, au


3.2. Constructeur par défaut et dénitions multiples
moment de la création d'une nouvelle instance :  sans constructeurs dénis, la classe est munie implicitement

basicstyle
//
basicstyle
appel du 1er constructeur : basicstyle d'un constructeur par défaut (sans arguments, de corps vide).
basicstyle
Point2D
basicstyle
p = new Point2D (); basicstyle
basicstyle
//
basicstyle
appel du 2nd : basicstyle basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
Point2D
basicstyle
q = new Point2D (42, 10); basicstyle basicstyle
basicstyle
int abs, ord; basicstyle
basicstyle
}basicstyle basicstyle
 new Point2D(42, 10) :
est équivalent à
1. création (new) d'une nouvelle instance de Point2D
class Point2D {
basicstyle
basicstyle basicstyle
2. exécution de Point2D (int x, int y) basicstyle
basicstyle
int abs, ord; basicstyle
basicstyle
basicstyle
Point2D () {} // pas d'arguments, et ne faisant rien. basicstyle
avec passage par valeur x ← 42, y ← 10, et basicstyle
}basicstyle basicstyle
abs et ord désignant les champs de l'objet créé en (1).
(d'ou le new Point2D () dans les exemples précédents)
3. retour d'une référence vers l'objet créé.

Programmation en Java 26 Programmation en Java 28


4. Modications d'objets : les méthodes
 signature de constructeur ≡ suite des types de ses paramètres.

 on peut dénir autant de constructeurs que l'on veut, pourvu


4.1. Dénitions de méthodes

que leurs signatures soient distinctes :  méthode ≡ code placé dans une dénition de classe,

basicstyle
class
basicstyle
Point2D { basicstyle permettant la modication des champs de ses instances
basicstyle
basicstyle
int abs; basicstyle
basicstyle
basicstyle
int ord; basicstyle basicstyle
basicstyle
class Point2D { basicstyle
basicstyle
basicstyle
Point2D () {} // en () basicstyle basicstyle
basicstyle
int abs; basicstyle
Point2D (int x, int y) {
basicstyle
basicstyle // en (int,int) basicstyle basicstyle
basicstyle
int ord; basicstyle
abs = x; ord = y
basicstyle
basicstyle basicstyle basicstyle
basicstyle
// ... constructeurs ... basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
// exemples de methodes : basicstyle
Point2D (Point2D p) {
basicstyle
basicstyle // en (Point2D) basicstyle basicstyle
basicstyle
void assigner (int x, int y) { abs = x; ord = y; } basicstyle
basicstyle
basicstyle
abs = p.abs; ord = p.ord; // copie des champs du basicstyle basicstyle
basicstyle
void translater (int dx, int dy) { basicstyle
basicstyle
basicstyle
} // point p basicstyle abs = abs + dx;
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
ord = ord + dy; basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 29 Programmation en Java 31

 Un constructeur peut en appeler un autre par this(...) 4.2. Invocations de méthodes


en 1ère instruction (pas nécessairement unique) de ce  l'exécution d'une méthode se fait toujours relativement à un
constructeur. objet via une référence : on dit que la méthode est invoquée

basicstyle
class
basicstyle
Segment { basicstyle sur l'objet.
basicstyle
basicstyle
Point2D debut; basicstyle
basicstyle
basicstyle
Point2D fin; basicstyle basicstyle
Point2D
basicstyle
p = new Point2D (); basicstyle
basicstyle
basicstyle
Segment () { basicstyle basicstyle
p.assigner
basicstyle (42,10); basicstyle
basicstyle
basicstyle
this (0,0,0,0); // appel du constructeur basicstyle basicstyle
p.translater
basicstyle (20,20); basicstyle
basicstyle
basicstyle // en (int,int,int,int) basicstyle
basicstyle
basicstyle
// ... et eventuellement, autres instructions basicstyle  p.assigner (42, 10) :
basicstyle
basicstyle
} basicstyle
exécution de assigner (int x, int y)
basicstyle
basicstyle
Segment (int x1, int y1, int x2, int y2) { basicstyle
basicstyle
basicstyle
debut = new Point2D (x1, y1); basicstyle avec passage par valeur x ← 42, y ← 10,
basicstyle
basicstyle
fin = new Point2D (x2, y2); basicstyle
où dans le code de la méthode,
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle abs et ord désignent les champs de l'objet référencé par p.

Programmation en Java 30 Programmation en Java 32


 une méthode peut renvoyer une valeur :  un constructeur peut invoquer une méthode :

basicstyle
class
basicstyle
Point2D { basicstyle basicstyle
class
basicstyle
Point2D { basicstyle
// ... champs abs, ord, constructeurs ...
basicstyle
basicstyle basicstyle int abs;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Point2D cloner () { basicstyle basicstyle
basicstyle
int ord; basicstyle
Point2D clone = new Point2D ();
basicstyle
basicstyle basicstyle Point2D () {}
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
clone.abs = abs; // les champs abs et ord de l'objet basicstyle basicstyle
basicstyle
Point2D (int x, int y) { basicstyle
basicstyle
basicstyle
clone.ord = ord; // courant sont copies dans le clone basicstyle basicstyle
basicstyle
assigner (x,y); // invoquee sur l'objet qui vient basicstyle
return clone;
basicstyle
basicstyle basicstyle }
basicstyle
basicstyle // d'etre cree par new. basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
void assigner (int x, int y) { basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
abs = x; basicstyle
basicstyle
basicstyle basicstyle basicstyle
basicstyle
ord = y; basicstyle
basicstyle
//
basicstyle
... et dans une autre partie du programme : basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
Point2D
basicstyle
p = new Point2D (42,10); basicstyle basicstyle
}basicstyle basicstyle
basicstyle
Point2D
basicstyle
q = p.cloner (); // q est a present une copie de p basicstyle

Programmation en Java 33 Programmation en Java 35

 une méthode peut invoquer une autre méthode (voire elle-


4.3. Surcharge de noms de méthodes
même) :  signature de méthode ≡ suite des types de ses paramètres.

basicstyle
class
basicstyle
Point2D { basicstyle
 deux méthodes peuvent porter le même nom à condition que
basicstyle
basicstyle
// ... champs abs, ord, constructeurs ... basicstyle
basicstyle
basicstyle
void assigner(int x, int y) { basicstyle leurs signatures soient distinctes. le nom de méthode est dit
basicstyle
basicstyle
abs = x; basicstyle surchargé.
basicstyle
basicstyle
ord = y; basicstyle
basicstyle
basicstyle
} basicstyle  lors de l'invocation, l'implémentation choisie sera celle qui
basicstyle
basicstyle
void reinitialiser () { basicstyle
correspond à la suite des types des arguments fournis.
basicstyle
basicstyle
assigner (0,0); // invoquee sur l'objet courant basicstyle
}
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle
basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
... et dans une autre partie du programme : basicstyle
Point2D p = new Point2D(42,10);
basicstyle
basicstyle basicstyle
basicstyle
p.reinitialiser
basicstyle (); // equivalent a : p.assigner(0,0) basicstyle

Programmation en Java 34 Programmation en Java 36


basicstyle
class
basicstyle
Point2D { basicstyle 4.4. Référence à l'objet courant : this
basicstyle
basicstyle
int abs; basicstyle
basicstyle
basicstyle
int ord; basicstyle  this sans arguments dans un constructeur ≡ une référence vers
basicstyle
basicstyle
// ... constructeurs ... basicstyle l'objet qui vient d'être créé par new.
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void assigner (int x, int y) { basicstyle  this sans arguments dans une méthode ≡ une référence vers
basicstyle
basicstyle
abs = x; basicstyle
l'objet sur lequel cette méthode est invoquée.
ord = y;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle class Point2D {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void assigner (Point2D p) { basicstyle basicstyle
basicstyle
//... l'ecriture suivante est usuelle : basicstyle
basicstyle
basicstyle
abs = p.abs; basicstyle basicstyle
basicstyle
Point2D (int abs, int ord) { basicstyle
ord = p.ord;
basicstyle
basicstyle basicstyle this.abs = abs; this.ord = ord;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
} basicstyle
void assigner () {
basicstyle
basicstyle basicstyle void set (int abs, int ord) {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
abs = 0; basicstyle basicstyle
basicstyle
this.abs = abs; this.ord = ord; basicstyle
basicstyle
basicstyle
ord = 0; basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
}basicstyle basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 37 Programmation en Java 39

 ...ce qui permet aussi d'écrire : 4.5. Champs vs méthodes et masquage de champs
basicstyle
basicstyle
class Point2D { basicstyle
basicstyle
basicstyle
int abs; basicstyle  tout champ, constructeur ou méthode précédé du mot-clef
int ord;
basicstyle
basicstyle basicstyle private est inaccessible à l'extérieur de sa classe.
basicstyle
basicstyle
// ... constructeurs ... basicstyle
basicstyle
basicstyle
void assigner (int x, int y) { basicstyle  en pratique, on privilégie les invocations de méthodes, en
basicstyle
basicstyle
abs = x; basicstyle
dénissant souvent tous les champs privés :
basicstyle
basicstyle
ord = y; basicstyle
}
basicstyle
basicstyle basicstyle class Point2D {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void assigner (Point2D p) { basicstyle basicstyle
basicstyle
private int abs; // representation interne des donnees, basicstyle
basicstyle
basicstyle
assigner (p.abs, p.ord); basicstyle basicstyle
basicstyle
private int ord; // invisible depuis l'exterieur. basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
// constructeurs + methodes d'acces aux champs basicstyle
basicstyle
basicstyle
void assigner () { basicstyle basicstyle
basicstyle
... basicstyle
basicstyle
basicstyle
assigner (0,0); basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle ... et les noms abs et ord deviennent inconnus à l'extérieur
où les deux dernières méthodes en (Point2D) et en () de la classe Point2D : il faut passer par les méthodes pour
accéder aux champs.
appellent la première en (int, int).

Programmation en Java 38 Programmation en Java 40


4.6. Classe des points, version nale basicstyle
//
basicstyle
methodes d'acces en lecture : nom standard = setChamp basicstyle
basicstyle
void
basicstyle
setAbs (int abs) { basicstyle
basicstyle
class
basicstyle
Point2D { basicstyle basicstyle
basicstyle
this.abs = abs; basicstyle
basicstyle
basicstyle
// champs prives basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
private int abs; basicstyle basicstyle
void
basicstyle
setOrd (int ord) { basicstyle
basicstyle
basicstyle
private int ord; basicstyle this.ord = ord;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
// constructeurs basicstyle basicstyle
void
basicstyle
set (int abs, int ord) { basicstyle
basicstyle
basicstyle
Point2D () {} basicstyle this.abs = abs;
basicstyle
basicstyle basicstyle
Point2D (int abs, int ord) {
basicstyle
basicstyle basicstyle basicstyle
basicstyle
this.ord = ord; basicstyle
basicstyle
basicstyle
this.abs = abs; basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
this.ord = ord; basicstyle basicstyle
void
basicstyle
set (Point2D p) { basicstyle
basicstyle
basicstyle
} basicstyle this.set (p.abs, p.ord) // this facultatif, mais courant
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
// ... basicstyle basicstyle
}basicstyle basicstyle

Programmation en Java 41 Programmation en Java 43

basicstyle
//
basicstyle
methodes d'acces en lecture : nom standard = getChamp basicstyle 4.7. Conclusion
basicstyle
int
basicstyle
getAbs () { basicstyle
basicstyle
basicstyle
return abs; basicstyle  une dénition de classe contient :
basicstyle
}basicstyle basicstyle
basicstyle
int
basicstyle
getOrd () { basicstyle  des champs servant au stockage des données internes de ses
return ord;
basicstyle
basicstyle basicstyle
instances,
basicstyle
}basicstyle basicstyle
basicstyle
//
basicstyle
... basicstyle  du code d'initialisation placé dans des constructeurs,

permettant l'initialisation automatique des champs lors de

la création d'instances,

 du code de gestion des données stockées dans les instances

de cette classe, placés dans des méthodes, permettant de

modier les données internes d'un objet.

Programmation en Java 42 Programmation en Java 44


5. Extensions de classes
 en pratique, les champs sont:
5.1. Principe de l'extension de Classe
 inaccessibles (private),
 extension de classe ≡ permet de dénir une nouvelle classe
 initialisés via les constructeurs,
 à partir d'une classe déjà écrite,
 modiés via les méthodes.
 en récupérant les implémentations de ses méthodes,
l'utilisateur n'a a priori aucune connaissance de la
i.e.
 en modiant éventuellement certaines d'entre elles,
représentation interne des données, mais seulement de l'eet
 en ajoutant éventuellement d'autres champs et méthodes
de l'invocation de tel ou tel constructeur ou méthode.
 objectifs :

 réutiliser du code déjà écrit,

 adapter une classe générique à un besoin particulier,

 écrire plusieurs variantes d'une même classe, en écrivant une

seule fois le code commun à ses variantes.

Programmation en Java 45 Programmation en Java 47

PARTIE II - Héritage 5.2. Syntaxe de l'extension


basicstyle
class
basicstyle
Point2D { basicstyle
int abs, ord;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void afficher () { basicstyle
basicstyle
basicstyle
System.out.println (abs + " " + ord); basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

... variante par extension (extends) : points colorés.

class Point2DColore extends Point2D {


basicstyle
basicstyle basicstyle
basicstyle
basicstyle
int col; basicstyle
basicstyle
basicstyle
void afficherCouleur () { basicstyle
basicstyle
basicstyle
System.out.println (col); basicstyle
}
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 46 Programmation en Java 48


basicstyle
Point2DColore
basicstyle pc = new Point2DColore (); basicstyle
l'implémentation invoquée pour une instance donnée sera
pc.abs = 10;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
pc.ord = 42; basicstyle toujours celle de sa classe :
pc.col = 255;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle ();
pc.afficher // affiche 10 42 basicstyle basicstyle
basicstyle
Point2D p = new Point2D () basicstyle
pc.afficherCouleur
basicstyle
basicstyle (); // affiche 255 basicstyle basicstyle
p.abs
basicstyle
= 23; basicstyle
basicstyle
p.ord
basicstyle
= 37 basicstyle
p.afficher
basicstyle (); // invoque l'implementation de
basicstyle basicstyle
les instances de Point2DColore disposent de tous les champs
basicstyle
basicstyle // la classe Point2D : "23 17" basicstyle
et méthodes dénies dans la classe Point2D : basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle
 la classe Point2DColore hérite de ces champs et méthodes. basicstyle
Point2DColore
basicstyle pc = new Point2DColore (); basicstyle
basicstyle
pc.abs
basicstyle
= 10; basicstyle
terminologie pour les liens de parenté :
pc.ord = 42;
basicstyle
basicstyle basicstyle
basicstyle
pc.col
basicstyle
= 255; basicstyle
 Point2DColore est une extension/une classe héritìere de
basicstyle
pc.afficher
basicstyle (); // invoque l'implementation de basicstyle
Point2D basicstyle
basicstyle // la classe Point2DColore : "10 42 255" basicstyle
 Point2D est une classe parente/un ancêtre de Point2DColore

Programmation en Java 49 Programmation en Java 51

5.3. Redénitions de méthodes  Les méthodes de nouvelles signatures ajoutées à une extension

sont considérées comme nouvelles :


 Une extension peut redénir certaines des méthodes

de sa classe parente : basicstyle


class
basicstyle
Point2D { basicstyle
basicstyle
basicstyle
int abs, ord; basicstyle
class Point2D {
basicstyle
basicstyle basicstyle // methode set en (int, int)
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
int abs, ord; basicstyle basicstyle
basicstyle
void set (int abs, int ord) { basicstyle
basicstyle
basicstyle
void afficher () { // ancienne implementation basicstyle basicstyle
basicstyle
this.abs = abs; this.ord = ord; basicstyle
basicstyle
basicstyle
System.out.println (abs + " " + ord); basicstyle }
basicstyle
basicstyle basicstyle
}
basicstyle
basicstyle basicstyle basicstyle
}basicstyle basicstyle
basicstyle
}basicstyle basicstyle basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle
basicstyle
basicstyle basicstyle int col;
basicstyle
basicstyle basicstyle
basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle basicstyle
basicstyle
// nouvelle methode set en (int, int, int) basicstyle
basicstyle
basicstyle
int col; basicstyle basicstyle
basicstyle
void set (int abs, int ord, int col) { basicstyle
basicstyle
basicstyle
void afficher () { // nouvelle implementation basicstyle basicstyle
basicstyle
set (abs, ord); // invocation du set en (int, int), basicstyle
basicstyle
basicstyle
System.out.println (abs + " " + ord + " " + col); basicstyle basicstyle
basicstyle
herite. basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
this.col = col; basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 50 Programmation en Java 52


5.4. Accès aux anciennes implémentations : super  dans ce cas, un constructeur en () doit être déni dans la classe

 lorsqu'une méthode est redénie par une extension, son parente. l'erreur suivante est classique :

ancienne implémentation reste accessible via super. + nom


basicstyle
basicstyle
class Point2D { basicstyle
de méthode : basicstyle
basicstyle
int abs, ord; // pas de constructeur en () basicstyle
basicstyle
basicstyle
?!... basicstyle
basicstyle
class
basicstyle
Point2D { basicstyle Point2D (int abs,int ord) {
basicstyle
basicstyle basicstyle
int abs, ord;
basicstyle
basicstyle basicstyle basicstyle
basicstyle
this.abs = abs; basicstyle
basicstyle
basicstyle
void afficher () { System.out.println (abs + " " + ord); } basicstyle basicstyle
basicstyle
this.ord = ord; basicstyle
basicstyle
}basicstyle basicstyle }
basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle basicstyle
}basicstyle basicstyle
basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle
int col;
basicstyle
basicstyle basicstyle int col;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void afficher () { // nouvelle implementation basicstyle basicstyle
basicstyle
Point2DColore (int col) { this.col = col } basicstyle
super.afficher ();
basicstyle
basicstyle // appel de l'ancienne, puis basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
System.out.println (col); // affichage supplementaire. basicstyle basicstyle
basicstyle basicstyle
}
basicstyle
basicstyle basicstyle basicstyle
//
basicstyle
erreur de compilation ! le constructeur de Point2DColore basicstyle
basicstyle
}basicstyle basicstyle basicstyle
//
basicstyle
appelle implicitement Point2D () {}... non implemente. basicstyle

Programmation en Java 53 Programmation en Java 55

5.5. Appel implicite du constructeur en () de la classe 5.6. Appel explicite d'un autre constructeur
parente
 un constructeur de Point2DColore peut demander explicitement
 par défaut, l'éxécution d'un constructeur de Point2DColore l'appel d'un autre constructeur que celui en () de sa classe
est précédée de celle du constructeur en () de sa classe parente. parente, via
basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
basicstyle
int abs, ord; basicstyle  this (...) (c.f. Partie I)

Point2D () { System.out.println ("Point2D !"); }


basicstyle
basicstyle basicstyle qui appelle le constructeur de la même classe spécié par les
basicstyle
}basicstyle basicstyle types des arguments.
basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle
basicstyle
basicstyle
int col; basicstyle  super (...)
basicstyle
basicstyle
Point2DColore () { basicstyle qui appelle le constructeur de la classe parente spécié par
basicstyle
basicstyle
// appel implicite de Point2D () avant l'instruction qui basicstyle
les types des arguments.
basicstyle
basicstyle
// suit : new Point2DColore () affiche "Point2D !", puis basicstyle
basicstyle
basicstyle
System.out.println ("Point2DColore !"); } basicstyle
 dans les deux cas, l'appel doit être la première instruction du
basicstyle
}basicstyle basicstyle
basicstyle
...
basicstyle basicstyle constructeur, et cette forme d'appel n'est pas renouvelable.
basicstyle
Point2DColore
basicstyle pc = new Point2DColore (); basicstyle
basicstyle
//
basicstyle
affiche "Point2D !", puis "Point2DColore !" basicstyle

Programmation en Java 54 Programmation en Java 56


basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
class
basicstyle
Point2D { basicstyle basicstyle
basicstyle
// abs et ord sont visibles dans cette classe, basicstyle
basicstyle
basicstyle
int abs, ord; // valeurs nulles par defaut basicstyle basicstyle
basicstyle
// pas dans les classes heritieres basicstyle
Point2D () {}
basicstyle
basicstyle basicstyle private int abs, ord;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Point2D (int abs,int ord) { basicstyle basicstyle
basicstyle basicstyle
this.abs = abs;
basicstyle
basicstyle basicstyle int getAbs () { return abs; }
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
this.ord = ord; basicstyle basicstyle
basicstyle
int getOrd () { return ord; } basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
void set(int abs, int ord) { basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
this.abs = abs; basicstyle
class Point2DColore extends Point2D {
basicstyle
basicstyle basicstyle this.ord = ord;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
int col; basicstyle basicstyle
basicstyle
} basicstyle
Point2DColore () {}
basicstyle
basicstyle // appel implicite de Point2D () basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
Point2DColore (int col) { basicstyle basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle
basicstyle
basicstyle
this (0, 0, col) // appel de Point2DColore(int, basicstyle basicstyle
basicstyle basicstyle
basicstyle
basicstyle
int, int) basicstyle basicstyle
basicstyle
// ... basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
void set (int abs, int ord, int col) { basicstyle
basicstyle
basicstyle
Point2DColore (int abs, int ord, int col) { basicstyle set (abs, ord);
basicstyle
basicstyle // invocation du set en (int,int) qui, basicstyle
basicstyle
basicstyle
super (abs, ord); // appel de Point2D (int, int) basicstyle basicstyle
basicstyle
this.col = col; // depuis sa classe, accede aux champs basicstyle
this.col = col;
basicstyle
basicstyle basicstyle basicstyle
basicstyle
} // masques basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
}basicstyle basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 57 Programmation en Java 59

5.7. Héritage et masquage basicstyle


Point2DColore
basicstyle pc = new Point2DColore (); basicstyle
basicstyle
pc.set
basicstyle
(10, 42, 255); basicstyle
 Les champs masqués (par private) d'une classe parente ne
int i = pc.getAbs (); // 10
basicstyle
basicstyle basicstyle
sont pas hérités par ses extensions  ils sont inaccessibles à basicstyle
int
basicstyle
j = pc.getOrd (); // 42 basicstyle
l'extérieur de la classe parente...
 les expressions pc.abs ou pc.ord sont incompilables, même si

 ...mais ces champs existent dans les instances de l'extension, tout point coloré dispose bien de ces deux champs.

même s'ils sont inaccessibles dans l'extension elle-même.


 les méthodes getAbs, getOrd sont héritées par Point2DColore
. elles sont implémentées dans Point2D, donc accèdent
 ...et les méthodes de la classe parente héritées par l'extension
librement aux deux champs depuis leur classe.
continuent à accéder librement à ces champs (puisqu'elles les

voient depuis la classe parente).  la nouvelle méthode set invoque une implémentation de set
héritée de Point2D qui accède librement aux deux champs

depuis sa classe.

Programmation en Java 58 Programmation en Java 60


 les constructeurs d'une classe ou ses méthodes peuvent basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
basicstyle
private int abs, ord; basicstyle
également être dénis private (plus rare).
...
basicstyle
basicstyle basicstyle
 les règles sont les mêmes qu'avec les champs (non hérités,
basicstyle
}basicstyle basicstyle
basicstyle
class
basicstyle
Point2DColore extends Point2D { basicstyle
accessibles indirectement via les implémentations héritées). basicstyle
basicstyle
private int col; // un champ de plus... basicstyle
basicstyle
basicstyle
... basicstyle
basicstyle
}basicstyle basicstyle
class Point2DColoreNomme extends Point2DColore {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
private char nom; // encore un champ de plus... basicstyle
...
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle
// etc.. basicstyle
basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
Point2D est parente de Point2DColore et de basicstyle
basicstyle
//
basicstyle
Point2DColoreNomme, basicstyle
basicstyle
//
basicstyle
Point2DColore est parente de Point2DColoreNomme ... basicstyle

Programmation en Java 61 Programmation en Java 63

5.8. Extensions multiples et extensions d'extensions  hiérarchie de classes ≡ une classe, et l'ensemble de ses

 une même classe peut avoir un nombre arbitraire d'extensions. descendants (directs ou indirects)

 toute extension de classe peut elle-même être étendue.  une classe peut avoir plusieurs classes ancêtres (classe parente,

classe parente de cette classe parente, etc.) par convention, les


 restrictions pour super.+ méthode et super(...) : une
ancêtres d'une classe incluent la classe elle-même.
classe ne peut accéder qu'à l'implémentation (héritée ou non)

d'un constructeur ou d'une méthode de son ancêtre immédiat  une classe prédénie est implicitement ancêtre de toutes les

: on ne peut pas écrire super.super... autres : la classe Object.


 un programme java se conçoit en général en concevant

un ensemble de hiérarchies de classes (classes génériques,

spécialisations de ces classes, spécialisations des spécialisations...)

Programmation en Java 62 Programmation en Java 64


PARTIE III - Classes Abstraites 7. Extension de classe abstraite - un exemple

 on souhaite dénir une classe abstraite permettant de

représenter des formes géométriques, sans précision de leur

nature exacte (cercle, rectangle, carré . . . ).

 toute forme est dénie relativement à un certain point de

référence (deux champs x et y communs à toutes les formes).

 toute forme doit pouvoir acher sa description (au moins les

valeurs des champs x et y).


 toute forme occupe une certaine surface... qui ne peut se

calculer qu'en connaissant la nature exacte de cette forme.

Programmation en Java 65 Programmation en Java 67

6. Notion de classe abstraite basicstyle


abstract
basicstyle
class Forme { // "abstract", i.e. abstraite basicstyle
basicstyle
basicstyle
private int x, y; // champs communs basicstyle
 classe abstraite ≡ classe incomplète dont certaines parties basicstyle
basicstyle
Forme () {} // constructeurs basicstyle
basicstyle
basicstyle
Forme (int x, int y) { basicstyle
restent à écrire :
this.x = x;
basicstyle
basicstyle basicstyle
 non instantiable (pas de new possible) mais elle peut contenir basicstyle
basicstyle
this.y = y; basicstyle
basicstyle
basicstyle
} basicstyle
des champs, des constructeurs et des méthodes, basicstyle
basicstyle
int getX () { return x; } // accesseurs pour les basicstyle
int getY () { return y; }
basicstyle
basicstyle // champs communs basicstyle
 elle peut mentionner des noms de méthodes non encore
basicstyle
basicstyle
void setXY (int x, int y) { basicstyle
implémentées, appelées méthodes abstraites, basicstyle
basicstyle
this.x = x; basicstyle
basicstyle
basicstyle
this.y = y; basicstyle
 une classe abstraite est uniquement destinée à être étendue basicstyle
basicstyle
} basicstyle
en classes concrètes (instantiables), qui implémenteront les basicstyle
basicstyle
void afficher () { basicstyle
basicstyle
basicstyle
System.out.println ("base : " + x + "," + y); basicstyle
parties manquantes.
basicstyle
basicstyle
} basicstyle
 objectif : toujours le même, écrire une seule fois les
basicstyle
basicstyle
// methode abstraite : a implementer par les basicstyle
basicstyle
basicstyle
// heritiers concrets de cette classe abstraite. basicstyle
éléments communs à toutes les extensions, écrire ensuite les basicstyle
basicstyle
abstract double surface (); // pas d'implementation. basicstyle
spécialisations concrètes. basicstyle
}basicstyle basicstyle

Programmation en Java 66 Programmation en Java 68


basicstyle
class
basicstyle
Rectangle extends Forme { basicstyle
basicstyle
basicstyle
private int hauteur, largeur; // champs ajoutes basicstyle basicstyle
class
basicstyle
Cercle extends Forme { basicstyle
basicstyle
basicstyle
Rectangle () {} // constructeurs basicstyle private int rayon;
basicstyle
basicstyle // champ ajoute basicstyle
Rectangle (int x, int y, int hauteur, int largeur) {
basicstyle
basicstyle basicstyle Cercle () {}
basicstyle
basicstyle // constructeurs basicstyle
basicstyle
basicstyle
super (x,y); basicstyle Cercle (int x, int y, int rayon) {
basicstyle
basicstyle basicstyle
this.hauteur = hauteur; this.largeur = largeur;
basicstyle
basicstyle basicstyle super (x,y);
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
this.rayon = rayon; basicstyle
basicstyle
basicstyle
int getHauteur () { return hauteur; } // accesseurs basicstyle }
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
ajoutes basicstyle basicstyle
basicstyle
int getRayon () { return rayon; } // accesseurs ajoutes basicstyle
int getLargeur () { return largeur; }
basicstyle
basicstyle basicstyle basicstyle
basicstyle
void setRayon (int rayon) { basicstyle
basicstyle
basicstyle
void setDimension (int hauteur, int largeur) { basicstyle this.rayon = rayon;
basicstyle
basicstyle basicstyle
this.hauteur = hauteur; this.largeur = largeur;
basicstyle
basicstyle basicstyle }
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
void afficher () { // redefinition de l'affichage basicstyle
basicstyle
basicstyle
void afficher () { // redefinition de l'affichage basicstyle basicstyle
basicstyle
super.afficher (); basicstyle
basicstyle
basicstyle
super.afficher (); // appel de l'implementation de Forme basicstyle System.out.println ("rayon : " + r);
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
, basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle
System.out.println ("hauteur : " + hauteur); basicstyle basicstyle
basicstyle
double surface () { // implementation de la methode basicstyle
basicstyle
basicstyle
System.out.println ("largeur : " + largeur); basicstyle basicstyle
basicstyle
return Math.PI * rayon * rayon; // abstraite de Forme. basicstyle
}
basicstyle
basicstyle basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle
double surface () { // implementation de la methode basicstyle basicstyle
}basicstyle basicstyle
basicstyle
basicstyle
return hauteur * largueur; // abstraite de Forme. basicstyle

Programmation en Java 69 Programmation en Java 71

basicstyle
basicstyle
} basicstyle
 règles d'héritage, de constructions, d'accessibilité des champs,
basicstyle
}basicstyle basicstyle
etc. : les mêmes que pour une extension de classe concrète.

 toute classe abstraite ou concrète peut être étendue en

une classe concrète ou abstraite, toutes les extensions sont

extensibles.

 une extension abstraite peut laisser abstraites une partie des

méthodes abstraite de sa classe parente et en introduire de

nouvelles.

 seule contrainte sur les extensions : toute extension concrète

doit fournir une implémentation de chaque méthode encore

abstraite dans sa classe parente (héritée ou non).

Programmation en Java 70 Programmation en Java 72


PARTIE IV - Liaison dynamique 8. Conversions de références
8.1. Conversion ascendante de référence
 Règle de déclaration libre : on peut déclarer des références vers

n'importe quelle classe, même abstraite.

basicstyle
Forme
basicstyle
f; // legal, meme si Forme est abstraite basicstyle

 Regle de conversion ascendante : on peut référencer un objet

par toute référence vers l'une de ses classes ancêtres.

basicstyle
basicstyle
Forme f; basicstyle
Cercle c = new Cercle ();
basicstyle
basicstyle basicstyle
basicstyle
Rectangle
basicstyler = new Rectangle (); basicstyle
basicstyle
basicstyle basicstyle
basicstyle
fbasicstyle
= c; // conversion "ascendante" de c basicstyle
basicstyle
basicstyle // en une reference vers Forme... legal. basicstyle
basicstyle
fbasicstyle
= r; // conversion "ascendante" de r... legal. basicstyle

Programmation en Java 73 Programmation en Java 75

8.2. Conversion descendante


 Règle de conversion descendante : on peut convertir

explicitement une référence dans la direction opposée, pourvu

que la référence-cible soit vers une classe ancêtre de celle de

l'objet.

basicstyle
Forme
basicstyle
f = new Cercle (); basicstyle
basicstyle
//
basicstyle
valide, il s'agit bien d'un Cercle basicstyle
basicstyle
Cercle
basicstyle
c = (Cercle) f; basicstyle
// erreur d'execution !! :
basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
Rectangle r = (Rectangle) f; basicstyle
basicstyle
basicstyle basicstyle
fbasicstyle
= new Carre ()
basicstyle basicstyle
basicstyle
//
basicstyle
valide, Rectangle est ancetre de Carre : basicstyle
basicstyle
Rectangle
basicstyler = (Rectangle) f; basicstyle

 ces conversions ne changent pas les classes des objets, mais

simplement le type des références qui servent à les manipuler.

Programmation en Java 74 Programmation en Java 76


8.3. Vérication de la validité d'une conversion 8.4. Accessibilité des noms suivant le type des références
 on peut vérier (à l'exécution seulement) la validité d'une
 lorsqu'un objet est référencé par une référence vers une
conversion descendante à l'aide de instanceof :
certaine classe, seuls les champs et méthodes de cette classe
basicstyle
Forme
basicstyle
f = Math.random () > .5 ? new Cercle () : new Carre () basicstyle (non masqués, dans la classe ou hérités) sont accessibles et
basicstyle
basicstyle
; basicstyle
invocables via cette référence.
basicstyle
Rectangle
basicstyler = null; basicstyle
if (f instanceof Rectangle) {
basicstyle
basicstyle basicstyle basicstyle
Forme
basicstyle
f = new Cercle (); basicstyle
basicstyle
basicstyle
r = (Rectangle) f; basicstyle basicstyle
basicstyle basicstyle
}basicstyle
basicstyle basicstyle basicstyle
f.afficher
basicstyle (); // legal : afficher est dans Forme basicstyle
// f.setRayon (10); // erreur !! Forme ne contient pas
basicstyle
basicstyle basicstyle
 f instanceof Rectangle vaut true si et seulement si basicstyle
basicstyle // cette methode, definie dans Cercle. basicstyle
Rectangle est ancêtre de la classe de f  i.e. si la conversion basicstyle
basicstyle basicstyle
basicstyle
Cercle
basicstyle
c = (Cercle) f; // descente vers Cercle basicstyle
(Rectangle) f est valide. basicstyle
c.setRayon
basicstyle (10); // legal. basicstyle
 instanceof ne permet pas de déterminer la classe exacte d'un
objet, mais simplement de vérier si une classe est ancêtre de

celle-ci. en pratique, son usage est réservé à la vérication de

Programmation en Java 77 Programmation en Java 79

validité d'une conversion. 9. Liaison dynamique


9.1. Règle de liaison dynamique  la règle centrale
 lorsqu'une méthode est invoquée sur une référence, quel que

soit son type, l'implémentation choisie est toujours celle de la

classe de l'objet référencé (écrite dans sa classe, ou héritée).

Cercle c = new Cercle ();


basicstyle
basicstyle basicstyle
basicstyle
basicstyle
Forme f = c; basicstyle
f.afficher
basicstyle ();
basicstyle // dans les deux cas, l'implementation basicstyle
basicstyle
basicstyle ();
c.afficher // choisie est celle de Cercle. basicstyle
basicstyle
basicstyle basicstyle
basicstyle
fbasicstyle
= Math.random () > .5 ? new Cercle () : new Rectangle (); basicstyle
basicstyle
f.afficher
basicstyle (); // implementation choisie a l'execution ! basicstyle

afficher () sera lié (associé) dynamiquement (à l'exécution)


à une certaine implémentation, suivant la classe de l'objet.

Programmation en Java 78 Programmation en Java 80


basicstyle
//
basicstyle
exemple precedent, tres simplifie : basicstyle 9.2. Règle de choix d'implémentation des méthodes
basicstyle
basicstyle
abstract class Forme { basicstyle
 Si l'on invoque un nom de méthode sur des arguments de types
abstract void afficher ();
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle U1,. . . , Un, la méthode choisie sera celle de signature T1,. . . , Tn,
class Rectangle extends Forme {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
void afficher () { System.out.println ("Rectangle"); } basicstyle où chaque Ti est le plus proche ancêtre de Ui.
basicstyle
}basicstyle basicstyle class A {...}
basicstyle
basicstyle basicstyle
basicstyle
class
basicstyle
Cercle extends Forme { basicstyle basicstyle
basicstyle
class B extends A {...} basicstyle
void afficher () { System.out.println ("Cercle");
basicstyle
basicstyle basicstyle basicstyle
class
basicstyle
C extends B {...} basicstyle
basicstyle
}basicstyle basicstyle class D extends C {...}
basicstyle
basicstyle basicstyle
Rectangle
basicstyler = new Rectangle ();
basicstyle basicstyle basicstyle
//
basicstyle
... dans une classe E : surcharge du nom de methode m basicstyle
basicstyle
Forme
basicstyle
f = r; basicstyle basicstyle
basicstyle
void m (A a) {...} basicstyle
basicstyle
f.afficher
basicstyle (); // affiche "Rectangle", comme r.afficher () basicstyle basicstyle
basicstyle
void m (C c) {...} basicstyle
basicstyle
Cercle
basicstyle
c = new Cercle (); basicstyle basicstyle
//
basicstyle
... et ailleurs : basicstyle
basicstyle
fbasicstyle
= c; basicstyle basicstyle
basicstyle
D d = new D (); C c = d; B b = d; A a = d; basicstyle
basicstyle
f.afficher
basicstyle (); // affiche "Cercle", comme c.afficher () basicstyle basicstyle
basicstyle
e.m (d); // methode invoquee : celle en (C) basicstyle
basicstyle
basicstyle basicstyle basicstyle
basicstyle
e.m (c); // methode invoquee : celle en (C) basicstyle
Forme[]
basicstyledessin = {new Rectangle (), new Carre ()};
basicstyle basicstyle basicstyle
basicstyle
e.m (b); // methode invoquee : celle en (A) basicstyle
basicstyle
basicstyle
for (int i = 0; i < 2; i++) dessin[i].afficher (); basicstyle e.m (a);
basicstyle
basicstyle // methode invoquee : celle en (A) basicstyle
basicstyle
//
basicstyle
affiche "Rectangle" puis "Cercle" basicstyle

Programmation en Java 81 Programmation en Java 83

basicstyle
//
basicstyle
autre exemple : type de donnees abstrait basicstyle PARTIE V - Interfaces
basicstyle
abstract
basicstyle
class Pile { basicstyle
abstract int pop ();
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
abstract void push (int n); basicstyle
basicstyle
basicstyle
abstract boolean isEmpty (); basicstyle
basicstyle
}basicstyle basicstyle
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
... // ailleurs : classe(s) concrete(s) etendant Pile... basicstyle
// implementation(s) par tableau, liste chainee, etc.
basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle
basicstyle
...
basicstyle
// et quelque part dans une autre classe : basicstyle
basicstyle
void
basicstyle
m (Pile p) { basicstyle
basicstyle
basicstyle
if (!p.isEmpty ()) { // invoquera les methodes de la basicstyle
basicstyle
basicstyle
int n = p.pop (); // classe (concrete) de p. basicstyle
basicstyle
basicstyle
// etc. basicstyle
basicstyle
basicstyle
} // la methode est dite "polymorphe" : elle accepte des basicstyle
basicstyle
}basicstyle
// objets de classes differentes, en ne se servant que basicstyle
basicstyle
basicstyle
// de leurs noms de methodes communs. basicstyle

Programmation en Java 82 Programmation en Java 84


10. Notion d'interface basicstyle
interface
basicstyleDeplacable { basicstyle
basicstyle
basicstyle
Point2D getPosition (); basicstyle
void setPosition (Point2D p);
basicstyle
basicstyle basicstyle
 interface ≡ similaire à une classe abstraite, mais encore plus basicstyle
basicstyle
void alignerAvec (Deplacable d); basicstyle
incomplète. une simple liste de noms de méthodes. }basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
... basicstyle
basicstyle
basicstyleDeplacable {
interface basicstyle basicstyle
abstract
basicstyleclass Forme implements Deplacable { basicstyle
basicstyle
basicstyle
Point2D getPosition (); basicstyle basicstyle
basicstyle
// champs x, y, constructeurs, etc. basicstyle
basicstyle
basicstyle
void setPosition (Point2D p); basicstyle public Point2D getPosition () {
basicstyle
basicstyle basicstyle
void alignerAvec (Deplacable d);
basicstyle
basicstyle basicstyle basicstyle
basicstyle
return new Point2D (getX (), getY ()) basicstyle
basicstyle
}basicstyle basicstyle }
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
public void setPosition (Point2D p) { basicstyle
 une classe implémente une interface lorsqu' elle implémente basicstyle
basicstyle
setX (p.getX ()); setY (p.getY ()); basicstyle
basicstyle
basicstyle
} basicstyle
chacune de ses méthodes.
basicstyle
basicstyle
public void alignerAvec (Deplacable d) { basicstyle
 une classe ne peut être l'extension que d'une seule classe, mais basicstyle
basicstyle
setPosition (d.getPosition ()); basicstyle
basicstyle
basicstyle
} basicstyle
elle peut implémenter plusieurs interfaces. }basicstyle
basicstyle basicstyle
basicstyle
basicstyle
class Cercle extends Forme { ... } // implemente basicstyle
basicstyle
basicstyle
implicitement Deplacable par heritage. basicstyle

Programmation en Java 85 Programmation en Java 87

basicstyle
interface
basicstyleDeplacable { basicstyle
basicstyle
basicstyle
Point2D getPosition (); basicstyle  pas de lien de parenté entre Segment et les héritiers concrets

basicstyle
basicstyle
void setPosition (Point2D p); basicstyle de Forme... mais "pont" créé entre toutes ces classes : une
basicstyle
basicstyle
void alignerAvec (Deplacable d); basicstyle
interface commune.
}basicstyle
basicstyle basicstyle
basicstyle
basicstyle basicstyle  alignerAvec accepte tout objet dont la classe implémente
basicstyle
class
basicstyle
Segment implements Deplacable { basicstyle
basicstyle
basicstyle
Point2D debut, fin; basicstyle Deplacable. tous ces objets sont référençables par des
// constructeurs, etc.
basicstyle
basicstyle basicstyle références de type Deplacable.
basicstyle
basicstyle
public Point2D getPosition () { basicstyle
basicstyle
basicstyle
return debut; basicstyle basicstyle
basicstyle d = new Cercle ();
Deplacable // conversion ascendante basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
Deplacable
basicstyle e = new Segment (); // conversion ascendante basicstyle
basicstyle
basicstyle
public void setPosition (Point2D p) { basicstyle basicstyle
d.alignerAvec
basicstyle (e); // legal basicstyle
basicstyle
basicstyle
debut.translater (p); basicstyle e.alignerAvec
basicstyle
basicstyle (d); // legal basicstyle
basicstyle
basicstyle
fin.translater (p); basicstyle basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
Segment
basicstyle
s = new Segment (); // conversion ascendante basicstyle
basicstyle
basicstyle
public void alignerAvec (Deplacable d) { basicstyle basicstyle
basicstyle
Cercle c = new Rectangle (); // de c en reference vers basicstyle
basicstyle
basicstyle
setPosition (d.getPosition ()); basicstyle s.alignerAvec
basicstyle
basicstyle (c); // Deplacable. legal. basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 86 Programmation en Java 88


11. Finalité de classes, champs, méthodes
 une classe peut implémenter plusieurs interfaces :
variables
basicstyle
basicstyle
class B extends C implements I, J, K {...} basicstyle
 final ≡ plus modiable, en plusieurs sens.

 une classe abstraite peut être marquée comme implémentant


 final class C {...} : la classe C n'est plus extensible.
une interface, mais ne pas implémenter toutes ses méthodes.
 class C { final int x; ... }
 les interfaces sont extensibles, et même multi-extensibles
le champ x doit être initialisé dès la création, et ne sera plus
basicstyle
interface
basicstyleI { ... } basicstyle
modiable.
basicstyle
interface
basicstyleJ { ... } basicstyle
basicstyle
interface
basicstyleK extends I, J { ... } basicstyle
 class C {... final int m () {...} }
 on peut ajouter des champs - implicitement final et static le méthode m () ne pourra pas être rédénie dans les extensions
(c.f. plus bas). de C.
 final permet de créer des objets non-mutables.

 variables en final ≡ const de C.

Programmation en Java 89 Programmation en Java 91

Annexe - Compléments 12. Champs et méthodes statiques


 champ statique ≡ partagé par toutes les instances d'une classe.

 un seul exemplaire de ce champ en mémoire. reservé dès

le lancement du programme, et indépendamment de toute

création d'objet.

basicstyle
class
basicstyle
Point2D { basicstyle
basicstyle
basicstyle
// compteur commun a tous les points : basicstyle
basicstyle
basicstyle
static int nbreInstancesCrees = 0; basicstyle
basicstyle
basicstyle
int abs, ord; basicstyle
basicstyle
basicstyle
Point2D () { nbreInstancesCrees++; } basicstyle
basicstyle
basicstyle
Point2D (int abs, int ord) { basicstyle
basicstyle
basicstyle
this (); basicstyle
basicstyle
basicstyle
this.abs = abs; basicstyle
basicstyle
basicstyle
this.ord = ord; basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 90 Programmation en Java 92


 accès à un champ statique :
12.1. Applications des champs et méthodes statiques
 librairie de fonctions utilitaires (comme en C)
 via le nom de la classe

 ou via une référence initialisée dont la classe voit ce champ class Divers {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
static final double Pi = 3.1415927; basicstyle
basicstyle
basicstyle
// lancement du programme basicstyle basicstyle
basicstyle
static int max (int x, int y) { basicstyle
basicstyle
System.out.println
basicstyle (Point2D.nbreInstancesCrees); basicstyle return x > y ? x : y;
basicstyle
basicstyle basicstyle
basicstyle
//
basicstyle
affiche 0 basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle basicstyle basicstyle
basicstyle
static int min (int x, int y) { basicstyle
basicstyle
basicstyle
// premiere instance creee basicstyle basicstyle
basicstyle
return x < y ? x : y; basicstyle
Point2D p = new Point2D ();
basicstyle
basicstyle basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
System.out.println
basicstyle (Point2D.nbreInstancesCrees); basicstyle basicstyle
basicstyle
private Divers () {} // unique constructeur prive... basicstyle
basicstyle
//
basicstyle
affiche 1 basicstyle }basicstyle
basicstyle // donc classe non instantiable, basicstyle
basicstyle
basicstyle basicstyle basicstyle
basicstyle // et non extensible ! basicstyle
basicstyle
//
basicstyle
etc. basicstyle

Programmation en Java 93 Programmation en Java 95

 méthode statique ≡ une méthode qui n'accède qu'à des champs  dénitions de constantes, et même constantes d'objets :

statiques. invocable indépendamment de tout objet. basicstyle


basicstyle
class Couleur { basicstyle
basicstyle
basicstyle
class Point2D { basicstyle basicstyle
basicstyle
static final basicstyle
basicstyle
basicstyle
static int nbreInstancesCrees = 0; // compteur commun basicstyle basicstyle
basicstyle
BLANC = new Couleur (255,255,255), basicstyle
basicstyle
basicstyle
int abs, ord; // a tous les points. basicstyle basicstyle
basicstyle
NOIR = new Couleur (0,0,0); basicstyle
Point2D () {
basicstyle
basicstyle basicstyle basicstyle
basicstyle
final int r, v, b; // champs non mutables basicstyle
basicstyle
basicstyle
nbreInstancesCrees++; basicstyle basicstyle
basicstyle basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
Couleur () { basicstyle
static void afficherNbreInstancesCrees () {
basicstyle
basicstyle basicstyle basicstyle
basicstyle
this (0,0,0); basicstyle
basicstyle
basicstyle
System.out.println (nbreInstancesCrees); basicstyle basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle
} basicstyle basicstyle
basicstyle
Couleur (int r, int v, int b) { basicstyle
}basicstyle
basicstyle basicstyle this.r = r;
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
this.v = v; basicstyle
basicstyle
basicstyle
this.b = b; basicstyle
 invocation via le nom de la classe (ou une référence initialisée).
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

basicstyle
Point2D.afficherNbreInstancesCrees
basicstyle (); basicstyle

Programmation en Java 94 Programmation en Java 96


 classe singleton : une, et une seule instance.  classe à deux éléments et seulement deux :

basicstyle
basicstyle
class Elvis { basicstyle basicstyle
basicstyle
class Boolean { basicstyle
basicstyle
basicstyle
private static final THE_KING = new Elvis (); basicstyle basicstyle
basicstyle
private final boolean b; basicstyle
private Elvis () {}
basicstyle
basicstyle // prive... pas d'autre new possible basicstyle private static final // deux instances, et pas plus
basicstyle
basicstyle basicstyle
basicstyle
basicstyle // pas d'extension possible. basicstyle basicstyle
basicstyle
Boolean TRUE = new Boolean (true), basicstyle
static Elvis getInstance () {
basicstyle
basicstyle basicstyle basicstyle FALSE = new Boolean (false);
basicstyle basicstyle
basicstyle
basicstyle
return THE_KING; basicstyle basicstyle
basicstyle basicstyle
}
basicstyle
basicstyle basicstyle private Boolean (Boolean b) {
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle basicstyle
basicstyle
this.b = b; basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
basicstyle
//"usine statique" basicstyle
static Boolean getInstance (boolean b) {
basicstyle
basicstyle basicstyle
basicstyle
basicstyle
return b ? TRUE : FALSE; basicstyle
basicstyle
basicstyle
} basicstyle
basicstyle
}basicstyle basicstyle

Programmation en Java 97 Programmation en Java 98