Classes et objets Plan Programme/application Java Exécution d`un

Transcription

Classes et objets Plan Programme/application Java Exécution d`un
ƒ Objectif de cette partie : écrire ses propres
classes
Classes et objets
Université de Nice - Sophia Antipolis
Richard Grin
Version 1.0.1 – 23/11/10
Richard Grin
Plan
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Classes et objets
page 2
Programme/application Java
ƒ Une application Java est composée d’une ou
plusieurs classes
ƒ Le plus souvent il est composé de plusieurs classes
principale
p
dont la
ƒ Une des classes est la classe p
méthode main est lancée pour lancer l’application
Classe
Constructeurs
Méthodes
Variables
« this »
Protection des accès
Variables et méthodes de classe
Richard Grin
Classes et objets
page 3
Richard Grin
Classes et objets
page 4
Exécution d’un programme
ƒ Au début de l’exécution, seule la classe principale
est chargée en mémoire centrale
ƒ Les autres classes sont chargées au fur et à
mesure, lorsque le programme a besoin d’elles
ƒ Le plus souvent une classe est chargée
lorsqu’une instance de la classe est créée par le
programme
Richard Grin
Classes et objets
page 5
Les classes
Richard Grin
Classes et objets
page 6
1
Eléments d’une classe
Regrouper les objets
ƒ Les objets qui collaborent dans une application sont
souvent très nombreux
ƒ On peut dégager des types d’objets
ƒ Par exemple, tous les livres dans une application de
gestion d’une
d une bibliothèque
ƒ La notion de classe correspond à cette notion de
types d’objets
Richard Grin
Classes et objets
7
ƒ Les constructeurs (il peut y en avoir plusieurs)
servent à créer des objets appelés instances de la
classe
ƒ Quand une instance est créée, son état est conservé
dans les variables d’instance
ƒ Les méthodes déterminent le comportement des
instances de la classe quand elles reçoivent un
message
Richard Grin
Exemple : classe Livre
Variables d’instance
class TestLivre {
public static void main(String[] args) {
Livre livre =
new Livre("Les Misérables", "Victor Hugo");
livre.setNbPages(450);
System.out.println(livre.getAuteur());
}
}
Constructeurs
Méthodes
Classes et objets
9
Richard Grin
Rôles d’une classe
Classes et objets
Classes et objets
page 10
Une classe est un type
ƒ Une classe est
ƒ un type qui décrit une structure (variables d’état)
et un comportement (méthodes)
ƒ un module pour décomposer une application en
entités plus petites
ƒ un générateur d’objets (par ses constructeurs)
ƒ Une classe permet d’encapsuler les objets : les
membres public sont vus de l’extérieur mais les
membres private sont cachés
Richard Grin
8
Utilisation d’une classe
public class Livre {
private String titre, auteur;
private int nbPages;
// Constructeur
public Livre(String unTitre, String unAuteur) {
titre = unTitre;
auteur = unAuteur;
}
public String getAuteur() {
// accesseur
return auteur;
}
public void setNbPages(int nb) { // modificateur
nbPages = nb;
}
}
Richard Grin
Classes et objets
11
ƒ Comme les types primitifs, une classe peut être
utilisée pour typer une variable dans sa
déclaration ou pour typer un tableau
ƒ Exemples :
Livre l;
Livre[] livres; (un tableau dont chaque
élément est un livre)
livres = new Livre[100]; (crée un tableau
de 100 livres et l’affecte à la variable livres ; les
100 éléments sont initialisés à null)
Richard Grin
Classes et objets
page 12
2
Conventions pour les identificateurs
ƒ Les noms de classes commencent par une
majuscule (ce sont les seuls avec les constantes) :
Cercle, Object
ƒ Les mots contenus dans un identificateur
commencent par une majuscule :
UneClasse, uneMethode, uneAutreVariable
ƒ Les constantes sont en majuscules avec les mots
séparés par le caractère souligné « _ » :
Les constructeurs
UNE_CONSTANTE
Richard Grin
Classes et objets
13
15
Plusieurs constructeurs (surcharge)
Classes et objets
Richard Grin
Classes et objets
16
Désigner un constructeur par this()
public class Employe {
private String nom, prenom;
private double salaire;
// 2 Constructeurs
public Employe(String n, String p) {
nom = n;
prenom = p;
}
public Employe(String n, String p, double s) {
nom = n;
prenom = p;
salaire = s;
}
. . .
e1 = new Employe("Dupond", "Pierre");
e2 = new Employe("Durand", "Jacques", 1500);
Richard Grin
14
public class Employe {
variables
private String nom, prenom;
private double salaire;
d’instance
// Constructeur
public Employe(String n, String p) {
nom = n;
prenom = p;
}
. . .
public static void main(String[] args) {
Employe e1;
e1 = new Employe("Dupond", "Pierre");
e1.setSalaire(1200);
création d’une instance
. . .
de Employe
}
}
ƒ Chaque classe a un ou plusieurs constructeurs qui
servent à
ƒ créer les instances
ƒ initialiser l’état
l état de ces instances
ƒ Un constructeur
ƒ a le même nom que la classe
ƒ n’a pas de type retour
Classes et objets
Classes et objets
Création d’une instance
Constructeurs d’une classe
Richard Grin
Richard Grin
public class Employe {
private String nom, prenom;
private double salaire;
// Ce constructeur appelle l'autre constructeur
public Employe(String n, String p) {
this(n, p, 0);
}
public Employe(String n
n, String p
p, double s) {
nom = n;
prenom = p;
salaire = s;
}
. . .
e1 = new Employe("Dupond", "Pierre");
e2 = new Employe("Durand", "Jacques", 1500);
17
Richard Grin
Classes et objets
18
3
Constructeur par défaut
ƒ Lorsque le code d’une classe ne comporte pas de
constructeur, un constructeur sera automatiquement
ajouté par Java
ƒ Pour une classe Classe, ce constructeur par défaut
est :
[public] Classe() { }
Les méthodes
Même accessibilité que
la classe (public ou non)
Richard Grin
Classes et objets
19
Richard Grin
Classes et objets
20
Accesseurs
Autres types de méthode
ƒ Deux types de méthodes servent à donner accès aux
variables depuis l’extérieur de la classe :
ƒ les accesseurs en lecture pour lire les valeurs des
variables ; « accesseur en lecture » est souvent
abrégé
b é é en « accesseur » ; getter
tt en anglais
l i
ƒ les accesseurs en écriture, ou modificateurs, pour
modifier leur valeur ; setter en anglais
ƒ La plupart des méthodes permettent aux instances
de la classe d’offrir des services plus complexes aux
autres instances
ƒ Enfin, des méthodes (private) servent de « sousprogrammes » utilitaires aux autres méthodes de la
classe
Richard Grin
Classes et objets
21
Richard Grin
Paramètres d’une méthode
Classes et objets
22
Type retour d’une méthode
ƒ Souvent les méthodes ou les constructeurs ont besoin
qu’on leur passe des données initiales sous la forme de
paramètres
ƒ On doit indiquer le type des paramètres dans la
déclaration de la méthode :
setSalaire(double unSalaire)
calculerSalaire(int indice, double prime)
ƒ Quand la méthode renvoie une valeur, on doit indiquer le
type de la valeur renvoyée dans la déclaration de la
méthode :
double calculSalaire(int indice, double prime)
ƒ Le pseudo
pseudo-type
type void indique qu
qu’aucune
aucune valeur n’est
n est
renvoyée :
void setSalaire(double unSalaire)
ƒ Quand la méthode ou le constructeur n’a pas de
paramètre, on ne met rien entre les parenthèses :
getSalaire()
Richard Grin
Classes et objets
23
Richard Grin
Classes et objets
24
4
Exemples de méthodes
Surcharge d’une méthode
public class Employe {
Modificateur
. . .
public void setSalaire(double unSalaire) {
if (unSalaire >= 0.0)
salaire = unSalaire;
}
public double getSalaire() {
return salaire;
Accesseur
}
public boolean accomplir(Tache t) {
...
}
}
Richard Grin
Classes et objets
ƒ En Java, on peut surcharger une méthode, c’est-àdire, ajouter une méthode qui a le même nom mais
pas la même signature qu’une autre méthode :
calculerSalaire(int)
calculerSalaire(int, double)
indice dans
la grille des
salaires
25
Richard Grin
Surcharge d’une méthode (2)
Classes et objets
R. Grin
Introduction à Java
26
ƒ On a vu qu’en Java les paramètres sont passés
par valeur et qu’une méthode ne peut donc
modifier les valeurs des paramètres effectifs
qu’on lui passe en paramètre (la méthode utilise
une copie
i d
de lla valeur
l
d
du paramètre)
èt )
ƒ Si le paramètre n’est pas de type primitif, c’est
l’adresse de l’objet qui est copiée dans l’espace
mémoire de la méthode
ƒ La méthode peut donc modifier l’état de l’objet
passé en paramètre
27
Exemple de passage de paramètres
public static void m(int ip,
Employe e1p, Employe e2p) {
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);
}
public static void main(String[] args) {
Employe e1 = new Employe("Patrick", 1000);
Employe e2 = new Employe("Bernard", 1200);
int i = 10;
m(i, e1, e2);
System.out.println(i + '\n' + e1.salaire
+ '\n' + e2.nom);
}
Classes et objets
Passage d’objets en paramètre
ƒ En Java, il est interdit de surcharger une méthode en
changeant seulement le type de retour
ƒ Autrement dit, on ne peut différencier 2 méthodes par
leur type retour
ƒ Par
P exemple,
l il estt interdit
i t dit d’avoir
d’
i ces 2 méthodes
éth d
dans une classe :
int calculerSalaire(int)
double calculerSalaire(int)
Richard Grin
prime accordées
aux commerciaux
Richard Grin
Classes et objets
main() :
Employe e1 = new Employe("Patrick", 1000);
Employe e2 = new Employe("Bernard", 1200);
int i = 10;
page 28
Passage de
paramètres
Que
sera-t-il
affiché ?
Patrick
P
t i k
1000
Il sera
affiché
10
800.0
Bernard
i
10
main
e1
e2
Pile
29
Bernard
1200
R. Grin
Tas
Introduction à Java
30
5
Passage de
paramètres
main() :
m(i, e1, e2);
ip e1p
10
e2p
m
(pas de variables locales)
i
10
main
ip e1p
100
e2p
i
10
main
e2
Tas
Introduction à Java
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);
m
(pas de variables locales)
i
10
main
e1
Pile
31
Passage de
paramètres
m() :
ip e1p
100
e2p
Introduction à Java
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);
R. Grin
i
10
main
Introduction à Java
System.out.println(i + '\n' + e1.salaire
+ '\n' + e2.nom);
Pile
33
Bernard
1200
e2
Pile
R. Grin
Bernard
1200
Tas
Introduction à Java
34
toString()
ƒ Il est conseillé d’inclure une méthode toString
dans toutes les classes que l’on écrit
ƒ Cette méthode renvoie une chaîne de caractères
qui décrit l’instance
ƒ Cette description peut être très utile lors de la
mise au point des programmes
ƒ La description doit être compacte et précise
ƒ System.out.println(objet) affiche la
valeur retournée par objet.toString()
Patrick
P
t i k
800
e1
R. Grin
Passage de
paramètres
Pierre
900
i
10
e1
Patrick
P
t i k
800
e2
Tas
main() :
main
Pierre
900
ip e1p
100
e2p
(pas de variables locales)
Bernard
1200
32
Passage de
paramètres
m() :
m
Patrick
P
t i k
800
Tas
R. Grin
e2
Pile
Bernard
1200
e1
e2
Pile
R. Grin
Patrick
P
t i k
1000
(pas de variables locales)
Bernard
1200
e1
ip = 100;
e1p.salaire = 800;
e2p = new Employe("Pierre", 900);
m
Patrick
P
t i k
1000
Passage de
paramètres
m() :
Tas
Introduction à Java
35
Richard Grin
Classes et objets
page 36
6
Exemple
public class Livre {
...
public String toString() {
return "Livre [titre=" + titre
+ ",auteur=
auteur=" + auteur
+ ",nbPages=" + nbPages
+ "]";
}
}
Richard Grin
Classes et objets
Les variables
page 37
Richard Grin
ƒ Les variables d’instances
ƒ sont déclarées en dehors de toute méthode
ƒ conservent l’état d’un objet, instance de la classe
ƒ sont accessibles et partagées par toutes les méthodes de la
classe
ƒ Les variables locales
ƒ sont déclarées à l’intérieur d’une méthode
ƒ conservent une valeur utilisée pendant l’exécution de la
méthode
ƒ ne sont accessibles que dans le bloc dans lequel elles ont
été déclarées
Classes et objets
39
Initialisation d’une variable
Classes et objets
ƒ Il arrive d’hésiter entre référencer une valeur
ƒ par une variable locale d’une méthode
d instance de la classe
ƒ ou par une variable d’instance
ƒ Si la valeur est utilisée par plusieurs méthodes de la
classe, elle devra être référencée par une variable
d’instance
Richard Grin
Classes et objets
40
Initialisation d’une variable (2)
ƒ Une variable doit être initialisée (recevoir une valeur)
avant d’être utilisée dans une expression
ƒ Si elle n’est pas initialisée par le code, une variable
d’instance (idem pour les variables de classe étudiées
plus loin) reçoit la valeur par défaut de son type (0 pour
les types numériques, par exemple)
ƒ L’utilisation d’une variable locale non initialisée par le
code provoque une erreur (pas d’initialisation par
défaut)
Richard Grin
38
Variable locale
ou variable d’instance ?
Types de variables
Richard Grin
Classes et objets
41
ƒ On peut initialiser une variable en la déclarant
ƒ La formule d’initialisation peut être une expression
complexe :
Employe e1 = new Employe(
Employe("Dupond",
Dupond , "Jean");
Jean );
double salaire = prime + 500.0;
Richard Grin
Classes et objets
42
7
Déclaration / création
Déclaration / création (2)
public static void main(String[] args) {
Employe e1;
e1.setSalaire(1200);
provoque une erreur
…
OK ? NullPointerException
}
ƒ Il aurait fallu écrire :
public static void main(String[] args) {
Employe e1;
e1 = new Employe("Dupond", "Pierre");
e1.setSalaire(1200);
. . .
}
ƒ Il ne faut pas confondre
ƒ déclaration d
d’une
une variable
ƒ création d’un objet référencé par cette variable
ƒ « Employe e1; »
ƒ déclare que l’on va utiliser une variable e1 qui référencera
un objet de la classe Employe,
ƒ mais aucun objet n’est créé
Richard Grin
Classes et objets
43
Richard Grin
Classes et objets
44
Désigner les variables d’une instance
ƒ Soit un objet o1 ; la valeur d’une variable v de o1 est
désignée par o1.v
ƒ Par exemple,
Accès aux membres d’une
d une classe
Cercle c1 = new Cercle(p1, 10);
System.out.println(c1.rayon); // affiche 10
ƒ Remarque : le plus souvent les variables sont private
et on ne peut pas y accéder directement en dehors de
leur classe
Richard Grin
Classes et objets
45
Richard Grin
ƒ private : seule la classe dans laquelle il est déclaré a
accès (à ce membre ou constructeur)
ƒ public : toutes les classes sans exception y ont accès
ƒ Sinon, par défaut, seules les classes du même
paquetage
t
que la
l classe
l
d
dans llequell il estt dé
déclaré
l é y ontt
accès (un paquetage est un regroupement de classes ;
cette notion sera étudiée plus loin dans le cours)
ƒ Java permet plusieurs degrés d’encapsulation
pour les membres (variables et méthodes) et les
constructeurs d’une classe
Classes et objets
46
Types d’autorisation d’accès
Degrés d’encapsulation
Richard Grin
Classes et objets
47
Richard Grin
Classes et objets
48
8
Protection de l’état interne d’un objet
Granularité de la protection des
attributs d’une classe
ƒ Autant que possible l’état d’un objet (les variables
d’instance) doit être private
ƒ En Java, la protection des membres se fait classe par
classe, et pas objet par objet
j a accès à tous les membres d’un objet
j de la
ƒ Un objet
même classe, même les membres privés
Richard Grin
Classes et objets
49
ƒ Si on veut autoriser la lecture d’une variable depuis
l’extérieur de la classe, on lui associe un accesseur,
avec le niveau d’accessibilité que l’on veut
ƒ Si on veut autoriser la modification d’une variable, on
lui associe un modificateur, qui permet la modification
tout en contrôlant la validité de la modification
Richard Grin
Classes et objets
50
this
ƒ Le code d’une méthode d’instance désigne
ƒ l’instance qui a reçu le message (l’instance
courante), par le mot-clé this
Désigner l’instance qui reçoit le
message « this
message,
thi »
Richard Grin
Classes et objets
ƒ donc, les membres de l’instance courante en les
préfixant par « this. »
ƒ Lorsqu’il n’y a pas d’ambiguïté, this est optionnel
pour désigner un membre de l’instance courante
51
Richard Grin
public class Employe {
private double salaire;
. . .
public void setSalaire(double unSalaire) {
salaire = unSalaire;
}
Implicitement
public double getSalaire() {
this.salaire
return salaire;
}
Implicitement
. . .
this.salaire
}
Classes et objets
52
this explicite
Exemple de this implicite
Richard Grin
Classes et objets
53
ƒ this est utilisé surtout dans 2 occasions :
ƒ pour distinguer une variable d’instance et un
paramètre qui ont le même nom :
public void setSalaire(double salaire)
this.salaire = salaire;
}
ƒ un objet passe une référence de lui-même à un
autre objet :
salaire = comptable.calculeSalaire(this);
Dans quelle classe peut-on
trouver ce code ?
Richard Grin
Comptable, calcule le salaire de moi
Classes et objets
54
9
Variables de classe
ƒ Certaines variables sont partagées par toutes les
instances d’une classe. Ce sont les variables de
classe (modificateur static)
ƒ Si une variable de classe est initialisée dans sa
déclaration cette initialisation est exécutée une
déclaration,
seule fois quand la classe est chargée en mémoire
Méthodes et variables de classe
R. Grin
Introduction à Java
55
R. Grin
ƒ Une méthode de classe (modificateur static en
Java) exécute une action indépendante d’une
instance particulière de la classe
ƒ Une méthode de classe peut être considérée comme
un message envoyé à une classe
ƒ Exemple :
public class Employe {
private String nom, prenom;
private double salaire;
private static int nbEmployes = 0;
// Constructeur
public Employe(String n, String p) {
nom = n;
prenom = p;
nbEmployes++;
}
. . .
}
Introduction à Java
56
Méthodes de classe
Exemple de variable de classe
R. Grin
Introduction à Java
public static int getNbEmployes() {
return nbEmployes;
}
57
R. Grin
Désigner une méthode de classe
Introduction à Java
58
Méthodes de classe
ƒ Pour désigner une méthode static depuis une
autre classe, on la préfixe par le nom de la classe :
int n = Employe.getNbEmploye();
ƒ Comme une méthode de classe exécute une action
indépendante d’une instance particulière de la
classe, elle ne peut utiliser de référence à une
instance courante (this)
ƒ Il serait,
it par exemple,
l iinterdit
t dit d’é
d’écrire
i
static double tripleSalaire() {
return this.salaire * 3;
}
R. Grin
Introduction à Java
59
R. Grin
Introduction à Java
60
10

Documents pareils