1
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
COURS 2 : Programmation impérative
Résumé du cours précédentRésumé du cours précédent
2Accès aux attributs des objets : OID versus this
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
this:Domino
d4: Domino
m1 = 2m2 = 5
Visionexterne
Visioninterne
En de
hors
de l’
obje
t,on
util
isel’o
bjet
Dan
sl’o
bjet
,on
"es
t"
l’obj
et
classe MainDominos
+$ main(String[])
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
+ = public$ = static
3
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes et objets simples : VISION EXTERNE
classe MainDominos
Quand le code en cours d’exécution se trouve
Un domino
m1 = 2m2 = 5
Un domino
m1 = 3m2 = 4
d2d4
Visionexterne
+ = public$ = static
4
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes et objets simples: VISION INTERNE
classe Domino
m1 : intm2 : int
Quand le code en cours d’exécution se trouve
Dominos déjà construits
m1 = 3m2 = 4
Visioninterne
+ = public
5
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Résumé des classes et objets vus en TD
Classes & Objets = ATTRIBUTS + CONSTRUCTEURS
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
classe Livre
titre : Stringauteur : Stringediteur : StringnbPages : intisbn : ISBN
+Livre(String,String,String,int,ISBN)
classe ISBN
groupeA : intgroupeB : intgroupeC : StringgroupeD : String
+ISBN(int,int,String,String)
un domino
m1 = 2m2 = 5
un livre
titre = "Fourmis sans ombre"auteur = "Maurice COYAUD"
editeur= "Phébus"nbPages = 320
isbn : ObjRéf (<ISBN>)
un isbn
groupeA = 2groupeB = 85940groupeC = "017"groupeD = "6"
d1 l1Objet <ISBN> en
dépendance d’un livre
6
un livre
titre = ObjRéfauteur = ObjRéfediteur= ObjRéfnbPages = 320isbn : ObjRéf
un isbn
groupeA = 2groupeB = 85940groupeC = ObjRéfgroupeD = ObjRéf
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&Objets = ATTRIBUTS + CONSTRUCTEURS
classe Livre
titre : Stringauteur : Stringediteur : StringnbPages : intisbn : ISBN
+Livre(String,String,String,int,ISBN)
classe ISBN
groupeA : intgroupeB : intgroupeC : StringgroupeD : String
+ISBN(int,int,String,String)
l1 6 objets en dépendance d’un livre
5 String
un string
"Maurice COYAUD"
un string
"017"
un string
"6"
un string
"Phébus"
un string
"Fourmis sans ombre"
1 ISBN
7Objectifs de ce cours (I21)
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Maintenant !Maintenant !
8
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : PEUT MIEUX FAIRE !
ils ne contiennent que des attributs valuéset les constructeurs capables de les initialiser
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
9
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : PEUT MIEUX FAIRE !
Prenons un exemple (vu en TD) :
La méthode : public static boolean estDouble(Domino d)(écrite dans la classe MainDominos) teste si le domino fourni en paramètre est un double et renvoie un booléen en conséquence.
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() { Domino d4 = new Domino(3,4); if ( estDouble(d4) ) { // faire quelque chose... }}+$ boolean estDouble(Domino d) { return ( d.m1 == d.m2 );}
Dans ce paradigme, on préfèrera penser que le domino est lui-
même le mieux placé pour « savoir » s’il est ou non un
double !
cette méthode n’est pas à sa place en Orienté-Objet !
10
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : COMMENT FAIRE MIEUX ?
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() {...}
+$ boolean estDouble(Domino d) { return ( d.m1 == d.m2 );}
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
+estDouble(): boolean
① le paramètre « d »a disparu !
② la déclaration « static » ($) a disparu !
11
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : COMMENT FAIRE MIEUX ?
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() {
Domino d4 = new Domino(3,4);
}
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
public boolean estDouble(){ }
② Ici, l’invocation de la méthode peut maintenant être effectuée sur la base de la référence externe au domino (c’est la seule chose dont dispose la méthode test1() – on doit utiliser la notation pointée)
return ( == );this.m1 this.m2 ① emploi de « this »
if ( ) { // faire quelque chose... }
d4.estDouble()
② invocation de la méthodesur la base de la référence à
un domino (ici, d4)
12
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() {
Domino d4 = new Domino(3,4); if ( ) { // faire quelque chose... }}
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
public boolean estDouble(){ }return ( == );this.m1 this.m2
① invocation de la méthode
② mise à jour de « this »
③ exécution de la méthode
Maintenant « this » réfère à d4
③ Et ce n’est qu’ensuite que Java exécute la méthode dans sa classe propre.
d4.estDouble()
13
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : METHODES d’INSTANCE
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() { Domino d4 = new Domino(3,4);
}
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
+estDouble() : boolean
public String dominoToString(){ }public int valeur() {
}
if (d4.estDouble() ) { // afficher le domino
}return "("+this.m1+","+this.m2+")";
if (d4.valeur() > 5){ // afficher le domino System.out.println( d4.dominoToString());}
return this.m1 + this.m2;
System.out.println( d4.dominoToString());
Quelques invocations de méthodes d’instance de la classe Domino
Méthodes d’instancede la classe Domino
14
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : METHODES d’INSTANCE
classe MainDominos
+$ main(String[]) { test1(); }
+$ test1() { Domino d4 = new Domino(3,4); Domino d5 = new Domino(5,2);
classe Domino
m1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
+estDouble() : boolean+dominoToString() : String+valeur() : int
if ( d5.plusGrandQue(d4) ){
}
// afficher le plus grand dominoSystem.out.println( d5.dominoToString() + " est plus grand que " + d4.dominoToString() ); Il faut maintenant
écrire cette méthode
+plusGrandQue(Domino d) : int
Par convention : d1.plusGrandQue(d2) devra retourner : +1 quand d1 est plus grand que d2, 0 quand les 2 dominos sont égaux, -1 quand d1 est plus petit que d2.
15
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets : METHODES d’INSTANCE
Classe Domino
...public int plusGrandQue(Domino d) {
}
if ( this.valeur() != d.valeur() ) {
return (this.valeur() > d.valeur()
? +1 : -1);}else {
if ( this.plusGrandeMarque()!= d.plusGrandeMarque() )
return (this.plusGrandeMarque()>
d.plusGrandeMarque()
? +1 : -1); else
return 0;}
Par convention : d1.plusGrandQue(d2) devra retourner : +1 quand d1 est plus grand que d2, 0 quand les 2 dominos sont égaux, -1 quand d1 est plus petit que d2.
Les 2 dominos ont même valeur !
Les 2 dominos ont des valeurs différentes !
La plus grande fournit le plus grand domino.
Ce cas ne peut arriver que lorsque les 2 dominos ont exactement les mêmes marques ou lorsque this et d sont un seul et même objet.
Il restera à écrire cette méthode
très simple
16
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets: CONSTRUCTEURS, VARIABLES et METHODES D’INSTANCE
classe Dominom1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
Classes & Objets = VARIABLES D’INSTANCES (=ATTRIBUTS)+ CONSTRUCTEURS + METHODES D’INSTANCES
+dominoToString(): String+estDouble(): boolean+valeur() : int+plusGrandQue(Domino d) : int+plusGrandeMarque() : int
CONSTRUCTEURS
METHODESD’INSTANCE
C’est de cette manière que les objets et leurs classes
doivent être conçus dans le paradigme Orienté-Objet.
VARIABLESD’INSTANCE
ATTRIBUTS ou ETAT
En Orienté-Objet, un objet est vu comme une entité qui encapsule un état interne (ensemble des valeurs des var. d’inst.) et qui fournit des services (méth. d’inst.)
par rapport à cet état.
17
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Classes&objets: CONSTRUCTEURS, VARIABLES et METHODES D’INSTANCE
classe Dominom1 : intm2 : int
+Domino(int,int)+Domino(int)+Domino()
classe Book (anglicisée)
title : Stringautor : Stringeditor : StringnbPages : intisbn : ISBN
+Book(String,String,String,int,ISBN)
classe ISBN (anglicisée)
groupA : intgroupB : intgroupC : StringgroupD : String
+ISBN(int,int,String,String)
+dominoToString(): String+estDouble(): boolean+valeur(): int+plusGrandQue(Domino d): int+plusGrandeMarque(): int
+bookToString(): String+hasAutor(String firstname, String lastname): boolean+isFrancophone(): boolean+isEditedBy (String): boolean+isEditedBy(int): boolean
+isbnToString(): String+isFrancophone(): boolean+isEditedBy (int): boolean
classe MainDominoset classe MainBooks
+$main(String[]): void+$test1(): void+$test2(): void
FIRST NAME : prénom / LAST NAME : nom de famille / MIDDLE NAMES : autres prénoms
18Objectifs de ce cours (I21)
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Maintenant !Maintenant !
19Conventions de nommage : variables, méthodes, classes
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Java pose un certain nombre de conventions pour l’écriture du codeet en particulier pour le nommage des entités
En JAVA ClasseVariable
ou constanted’instance
Méthoded’instance
Variable« static »
Constantes« static »
Méthode« static »
MAJUSCULEen début de nom
TOUJOURS JAMAIS JAMAIS JAMAIS JAMAIS JAMAIS
Minusculeen début de nom
JAMAIS TOUJOURS TOUJOURS TOUJOURS JAMAIS TOUJOURS
TOUT en MAJUSCULE
POSSIBLE JAMAIS JAMAIS JAMAIS TOUJOURS JAMAIS
Le respect de ces conventions facilite l’apprentissage de Javaet notamment celui des librairies standards associées
20Conventions de nommage : préfixes de méthodes
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Conventions pour le nommage des méthodes :
En JAVA Préfixes de METHODES Exemples de noms de METHODES
Méthode renseignant sur l’état d’un objet
et retournant un booléen
« PREDICAT »
is
has
isDouble(), isEmpty(),isEditedBy(<that editor>), ...
hasAutor(<that autor>), ...
Méthode retournant une partie de l’état d’un
objet sans le modifier
« GETTER »get
getMark1(),getTitle(),
getEditorName(), ...
Méthode modifiant une partie de l’état d’un
objet
« SETTER »set
setMark1(<new mark>),setTitle(<new title>),
setEditorName(<new name>), ...
Le respect de ces conventions facilite la lisibilité du codeet donc la maintenance des programmes par des équipes tierces
21Plus à propos de Java (JDK, JRE, ...)
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
➽ « SDK » est le sigle de « Java Development Kit » publié par Sun Microsystem®.Il comprend : – le compilateur Java (javac), – la machine virtuelle java (java), – un générateur de documentation (javadoc), – un compresseur de classes Java (jar), – les librairies standards de Java en code source (packages java, javax, ...) ainsi que le JRE et de nombreux autres outils.
➽ « JRE » est le sigle pour « Java Runtime Environment » ; c’est la version exécutable minimale qui doit être installée sur une machine pour faire tourner des applications Java.
22Le « garbage collector »* de Java
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Le Garbage Collector est un processus dont l’exécution est « parallèle » à celle de l’application Java.
* « Garbage collector » signifie littéralement « collecteur d'ordures » ; on parle aussi de « ramasse miettes » mais, ici, cela prend le sens de « nettoyage de l’espace mémoire ».
Chaque application Java est lancée dans un processus. Le ramasse miette en est un au même titre que notre programme.Rq: si on lance plusieurs programmes Java sur une machine, cela lance plusieurs machines virtuelles Java (une pour chaque programme) et donc également un GC pour chacune d’elles.
Rôle du GC:Le GC permet de nettoyer l’espace mémoire utilisé par la machine virtuelle Java.
Pourquoi doit-on nettoyer l’espace mémoire ?Le nettoyage en question concerne les espaces de la mémoire qui ont été utilisés MAIS qui ne servent plus au programme.
23Le « garbage collector » de Java
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
+$ main(String[] args) { test1(); test2(); }+$ test1() { Livre l1 = new Book( "Fourmis sans ombre", "Maurice COYAUD", "Phébus", 320, new ISBN(2, 85940, "017", "6") ); }+$ test2() { Domino[] miniJeu = { new Domino(0,0), new Domino(0,1), new Domino(0,2) }; }
1 ISBN
1 Book
3 Domino
3 String
2 String
1 Domino[ ]
a) Dénombrons les objets instanciés dans ce programme (12 au total)
①
②
③
④
⑤
⑥
⑦ ⑧
1 String[ ]
b) Envisageons l’ordre d’exécution (avant, au début, pendant, à la fin ou après les méthodes)
c) Simulons l’exécution tout en dénombrant, au moment considéré, les objets existants (NbE) et ceux d’entre eux qui ne sont plus accessibles par le programme (NbNA)
n° étape NbE NbNA ① 1 0 ② 1 0 ③ 8 (+7) 0 ④ 1 (-7) 7 (+7) ⑤ 1 7 ⑥ 5 (+4) 7 ⑦ 1 (-4) 11 (+4) ⑧ 0 (-1) 12 (+1)
Tout objet devenu inaccessible au programme sera, tôt ou tard, détruit par le GC.
24
Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde
Acta est fabula* * « La pièce est jouée. » On annonçait ainsi la fin de la représentation dans le théâtre antique.
Top Related