Académique Documents
Professionnel Documents
Culture Documents
De C à Java
V.Padovani, PPS, Paris-Diderot
1.1. Eléments de base du langage
éléments communs à C et Java :
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
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
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 +...
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
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).
1.4. Hiérarchie des types de base et conversions les conversions vériables dès la compilation sont inutiles :
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
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;.
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
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...
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).
basicstyle
basicstyle
} basicstyle Point2D p = new Point2D (42, 10);
basicstyle
basicstyle basicstyle
basicstyle
}basicstyle basicstyle
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éé.
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
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.
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
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
...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).
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,
la création d'instances,
5.3. Redénitions de méthodes Les méthodes de nouvelles signatures ajoutées à une extension
lorsqu'une méthode est redénie par une extension, son parente. l'erreur suivante est classique :
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)
...mais ces champs existent dans les instances de l'extension, tout point coloré dispose bien de ces deux champs.
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.
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,
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
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.
extensibles.
nouvelles.
basicstyle
Forme
basicstyle
f; // legal, meme si Forme est abstraite basicstyle
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
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
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
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
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
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
méthode statique ≡ une méthode qui n'accède qu'à des champs dénitions de constantes, et même constantes d'objets :
basicstyle
Point2D.afficherNbreInstancesCrees
basicstyle (); basicstyle
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