Programmation Orientée Objet Compléments sur les classes

publicité
Compléments sur les classes
Programmation Orientée Objet
Compléments sur les classes
Frédéric Mallet
http://deptinfo.unice.fr/~fmallet/
2013-2014
F. Mallet - POO
1
Compléments sur les classes
Objectifs/Plan
Méthode d’instance ou méthode de classe
Static
Final
Constructeurs
Types énumérés
Structures de contrôle
Les modificateurs
2013-2014
F. Mallet - POO
2
Compléments sur les classes
Calculatrice
Calculatrice.java
class Calculatrice {
double add(double v1, double v2) {
return v1+v2;
}
double mul(double v1, double v2) {
return v1*v2;
}
double inv(double v) {
return 1/v;
}
}
État : ?
Usage:
2013-2014
Calculatrice c = new Calculatrice();
c.add(12, 5);
F. Mallet - POO
3
Compléments sur les classes
Méthodes de classes : static
Calculatrice.java
class Calculatrice {
static double add(double v1, double v2) {
return v1+v2;
}
static double mul(double v1, double v2) {
return v1*v2;
}
static double inv(double v) {
return 1/v;
}
}
État : NON
Usage:
Calculatrice.add(12, 5);
2013-2014
F. Mallet - POO
4
Compléments sur les classes
Champs de classe : static
Calculatrice.java
class Calculatrice {
static double add(double v1, double v2) {
return v1+v2;
}
static double mul(double v1, double v2) {
return v1*v2;
}
static double inv(double v) {
return 1/v;
}
static double PI = 3.1415;
}
État : NON
Usage:
Calculatrice.add(12, 5);
Calculatrice.add(Calculatrice.PI, 5);
2013-2014
F. Mallet - POO
5
Compléments sur les classes
Constantes : final
Calculatrice.java
class Calculatrice {
static double add(double
return v1+v2;
}
static double mul(double
return v1*v2;
}
static double inv(double
return 1/v;
}
static final double PI =
}
v1, double v2) {
v1, double v2) {
v) {
3.1415;
État : NON
Accumulateur ?
Mémoire ?
Usage:
Calculatrice.add(12, 5);
Calculatrice.add(Calculatrice.PI, 5);
2013-2014
F. Mallet - POO
6
Compléments sur les classes
Méthodes d’instance et état
Calculatrice.java
class Calculatrice {
double accumulateur;
void add(double v) {
accumulateur += v;
}
void mul(double v) {
accumulateur *= v;
}
double inv() {
accumulateur = 1/accumulateur;
}
static final double PI = 3.1415;
}
Usage:
2013-2014
15.1415
12.0
État : OUI
Calculatrice c = new Calculatrice();
c.add(12);
c.add(Calculatrice.PI);
F. Mallet - POO
7
Compléments sur les classes
Objectifs/Plan
Méthode d’instance ou méthode de classe
Constructeurs
Initialisation des champs
Surcharge du constructeur
Surcharge des paramètres
Mots clés this. et this(
Constructeur par défaut
Types énumérés
Structures de contrôle
Les modificateurs
2013-2014
F. Mallet - POO
8
Compléments sur les classes
Initialisation par défaut
class Complexe {
double reelle, imaginaire; // valeur initiale ?
double norme() {
return reelle*reelle + imaginaire*imaginaire;
}
}
Initialisation par défaut des champs
Valeurs numériques (byte, short, int, long, float, double) : 0
Booléens (boolean) : false
Références : null
Usage
Complexe c1 = new Complexe();
2013-2014
F. Mallet - POO
9
Compléments sur les classes
Constructeur
class Complexe {
double reelle, imaginaire; // valeur initiale ?
Complexe(double re, double im) { // constructeur
reelle = re;
imaginaire = im;
}
}
Initialisation explicite des champs
Lorsqu’il n’y a pas de « bonne » valeur par défaut
Lorsque l’initialisation nécessite un calcul
Usage
Complexe c1 = new Complexe(0, 1);
2013-2014
F. Mallet - POO
10
Compléments sur les classes
Constructeur : this.
class Complexe {
double reelle, imaginaire; // valeur initiale ?
Complexe(double reelle, double imaginaire) {
this.reelle = reelle;
this.imaginaire = imaginaire;
}
}
Surcharge des variables
Lorsque le même nom désigne plusieurs variables
différentes
Usage
Complexe c1 = new Complexe(0, 1);
2013-2014
F. Mallet - POO
11
Compléments sur les classes
Constructeur : surcharge
class Complexe {
double reelle, imaginaire; // valeur initiale ?
Complexe(double re, double im) {
reelle = re;
imaginaire = im;
}
Complexe(double re) {
reelle = re;
imaginaire = 0.0;
}
}
Usage
Complexe c1 = new Complexe(0, 1);
Complexe c2 = new Complexe(6.5);
2013-2014
F. Mallet - POO
12
Compléments sur les classes
Constructeur : this()
class Complexe {
double reelle, imaginaire; // valeur initiale ?
Complexe(double re, double im) {
reelle = re;
imaginaire = im;
}
Complexe(double re) {
this(re, 0.0);
}
}
Usage
Complexe c1 = new Complexe(0, 1);
Complexe c2 = new Complexe(6.5);
Complexe c3 = new Complexe();
2013-2014
F. Mallet - POO
13
Compléments sur les classes
Instantiation et constructeur
Si un ou plusieurs constructeurs explicites
Il faut obligatoirement utiliser un de ces constructeurs
• Complexe c1 = new Complexe(0, 1);
• Complexe c2 = new Complexe(5);
• Complexe c3 = new Complexe(); // interdit
Le choix du constructeur dépend
Du nombre de paramètres effectifs
De leur type
2013-2014
F. Mallet - POO
14
Compléments sur les classes
Constructeur par défaut
Si un ou plusieurs constructeurs explicites
Il faut obligatoirement utiliser un de ces constructeurs
• Complexe c1 = new Complexe(0, 1);
• Complexe c2 = new Complexe(5);
• Complexe c3 = new Complexe(); // interdit
Si aucun constructeur n’est défini
Un constructeur « par défaut » est créé automatiquement
Il n’a pas de paramètre
class Complexe{
double re, im;
}
Complexe c = new Complexe();
2013-2014
F. Mallet - POO
15
Compléments sur les classes
Objectifs/Plan
Méthode d’instance ou méthode de classe
Constructeurs
Types énumérés
Structures de contrôle
L’alternative: if, if/else
Le choix multiple : switch
Les modificateurs
2013-2014
F. Mallet - POO
16
Compléments sur les classes
Types énumérés
Introduits par le JDK 5.0
Les types énumérés ressemblent à des classes
Leurs valeurs ressemblent à des champs statiques
Le compilateur construit des helpers (constructeurs, affichage, …)
Peut avoir des constructeurs, méthodes et champs
Exemple
[Couleur.java]
enum Couleur {
TREFLE, CARREAU, CŒUR, PIQUE;
}
[Test.java]
class Test {
static public void main(String[] args) {
Couleur c = Couleur.TREFLE;
Valeur v = Valeur.AS;
System.out.println(v+" "+c);
}
}
2013-2014
F. Mallet - POO
[Valeur.java]
enum Valeur {
SEPT, HUIT, NEUF, DIX,
VALET, DAME, ROI, AS;
}
> java Test
AS TREFLE
17
Compléments sur les classes
Couleur de cartes:
TREFLE, PIQUE, CŒUR, CARREAU
Sans les énumérés
[Couleur.java]
class Couleur {
int valeur;
Couleur(int v) {
this.valeur = v;
}
static final Couleur
static final Couleur
static final Couleur
static final Couleur
}
TREFLE = new Couleur(1);
PIQUE = new Couleur(2);
CŒUR = new Couleur(3);
CARREAU = new Couleur(4);
[Test.java]
class Test {
static public void main(String[] args) {
Couleur c = Couleur.TREFLE;
System.out.println(c);
}
}
2013-2014
F. Mallet - POO
18
Compléments sur les classes
Couleur de cartes:
TREFLE, PIQUE, CŒUR, CARREAU
Sans les énumérés
[Couleur.java]
class Couleur {
int valeur;
Couleur(int v) {
this.valeur = v;
}
static final Couleur TREFLE = new Couleur(1),
PIQUE = new Couleur(2),
CŒUR = new Couleur(3),
CARREAU = new Couleur(4);
}
[Test.java]
class Test {
static public void main(String[] args) {
Couleur c = Couleur.TREFLE;
System.out.println(c);
}
}
2013-2014
F. Mallet - POO
> java Test
Couleur@740355a4
19
Compléments sur les classes
Couleur de cartes:
TREFLE, PIQUE, CŒUR, CARREAU
class Couleur {
// [Couleur.java]
int valeur;
Couleur(int v) { this.valeur = v; }
static final Couleur TREFLE = new Couleur(1),
PIQUE = new Couleur(2), CŒUR = new Couleur(3),
CARREAU = new Couleur(4);
String nom() {
if (valeur==1) return
if (valeur==2) return
if (valeur==3) return
if (valeur==4) return
return "Erreur!";
}
"Trèfle";
"Pique";
"Coeur";
"Carreau";
}
System.out.println(Couleur.TREFLE.nom());
2013-2014
F. Mallet - POO
> java Test
Trèfle
20
Compléments sur les classes
Méthode toString()
class Couleur {
// [Couleur.java]
int valeur;
Couleur(int v) { this.valeur = v; }
static final Couleur TREFLE = new Couleur(1),
PIQUE = new Couleur(2), CŒUR = new Couleur(3),
CARREAU = new Couleur(4);
public String toString() {
if (valeur==1) return "Trèfle";
if (valeur==2) return "Pique";
if (valeur==3) return "Coeur";
if (valeur==4) return "Carreau";
return "Erreur!";
}
}
System.out.println(Couleur.TREFLE);
2013-2014
F. Mallet - POO
> java Test
Trèfle
21
Compléments sur les classes
Alternative: synopsis
If
si … alors ….
if (condition booléenne) {
instructions à exécuter si la condition est vraie [true]
}
If/else
si … alors … sinon …
if (condition booléenne) {
instructions à exécuter si la condition est vraie [true]
} else {
instructions à exécuter si la condition est fausse [false]
}
Blocs d’instructions { … }
Les accolades ne sont pas obligatoires que s’il y a 1 seule
instruction
2013-2014
F. Mallet - POO
22
Compléments sur les classes
Alternative: if, if/else
class Couleur {
// [Couleur.java]
… // cf. planche [21]
public String toString() {
if (valeur==1) {
return "Trèfle";
} else {
if (valeur==2) {
return "Pique";
} else {
if (valeur==3) {
return "Coeur";
} else {
if (valeur==4) {
return "Carreau";
} else {
return "Erreur!";
}
}
}
}
}
}
2013-2014
F. Mallet - POO
23
Compléments sur les classes
Alternative: if, if/else
class Couleur {
// [Couleur.java]
… // cf. planche [21]
public String toString() {
if (valeur==1)
return "Trèfle";
else if (valeur==2)
return "Pique";
else if (valeur==3)
return "Coeur";
else if (valeur==4)
return "Carreau";
else return "Erreur!";
}
}
Instruction return
Termine immédiatement l’exécution de la méthode !
2013-2014
F. Mallet - POO
24
Compléments sur les classes
Alternative: if, if/else
class Couleur {
// [Couleur.java]
… // cf. planche [21]
public String toString() {
if (valeur==1)
return "Trèfle";
else if (valeur==2)
return "Pique";
else if (valeur==3)
return "Coeur";
else if (valeur==4)
return "Carreau";
else return "Erreur!";
}
}
Instruction return
Termine immédiatement l’exécution de la méthode ! (cf. planche 21)
2013-2014
F. Mallet - POO
25
Compléments sur les classes
Alternative: synopsis
Switch/case
switch (expression) {
case v1:
instructions à exécuter si expression == v1
case v2:
instructions à exécuter si expression == v2
default:
instructions à exécuter si aucun des blocs cases ne l’est
}
Règle
L’expression du switch est évaluée pour choisir le cas (entier, ou
énuméré) [String depuis JDK 1.7]
L’instruction break permet d’arrêter l’exécution du switch
Le switch termine au break, au return ou à l’accolade fermante!
2013-2014
F. Mallet - POO
26
Compléments sur les classes
Alternative: switch/case
// [Couleur.java]
class Couleur {
… // cf. planche [21]
public String toString() {
switch (valeur) {
case 1:
return "Trèfle";
case 2:
return "Pique";
case 3:
return "Coeur";
case 4:
return "Carreau";
default:
return "Erreur!";
}
}
Instruction return
2013-2014
Termine immédiatement l’exécution de la méthode ! (cf. page 21)
F. Mallet - POO
27
Compléments sur les classes
Rappels: constructeur
class Couleur {
// [Couleur.java]
String nom;
Couleur(String nom) {
this.nom = nom;
}
static final Couleur TREFLE = new Couleur("Trèfle"),
PIQUE = new Couleur("Pique"),
CŒUR = new Couleur("Coeur"),
CARREAU = new Couleur("Carreau");
public String toString() {
return nom;
}
}
2013-2014
F. Mallet - POO
28
Compléments sur les classes
Alternative: switch/case
class Valeur {
// [Valeur.java]
int valeur;
Valeur(int v) { valeur = v; }
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11), DAME = new Valeur(12),
ROI = new Valeur(13), AS = new Valeur(14);
public String toString() {
switch (valeur) {
case 7: case 8: case 9: case 10:
return valeur + "";
case 11: return "Valet";
case 12: return "Dame";
case 13: return "Roi";
case 14: return "As";
default:
return "Erreur!";
}
}
}
2013-2014
F. Mallet - POO
29
Compléments sur les classes
Alternative: switch/case
class Valeur {
// [Valeur.java]
int valeur;
Valeur(int v) { valeur = v; }
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11), DAME = new Valeur(12),
ROI = new Valeur(13), AS = new Valeur(14);
int maValeur() {
int v = 0;
switch (valeur) {
case 11: case 12: case 13:
v = valeur - 9;
case 14:
v = valeur - 3;
default:
}
return v;
}
}
2013-2014
F. Mallet - POO
30
Compléments sur les classes
Alternative: switch/case
class Valeur {
// [Valeur.java]
int valeur;
Valeur(int v) { valeur = v; }
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11), DAME = new Valeur(12),
ROI = new Valeur(13), AS = new Valeur(14);
int maValeur() {
int v = 0;
switch (valeur) {
case 11: case 12: case 13:
v = valeur - 9;
break;
case 14:
v = valeur - 3;
break;
default:
}
return v;
}
}
2013-2014
F. Mallet - POO
31
Compléments sur les classes
Rappels : constructeurs
class Valeur {
// [Valeur.java]
int ordre;
String nom;
Valeur(int o) {
this(o, o+"");
}
Valeur(int o, String nom) {
ordre = v;
this.nom = nom;
}
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11, "Valet"),
DAME = new Valeur(12, "Dame"),
ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As");
public String toString() {
return nom;
}
}
2013-2014
F. Mallet - POO
32
Compléments sur les classes
Rappels : final
class Valeur {
// [Valeur.java]
Valeur.AS = new Valeur(1);
int ordre;
Valeur.AS.ordre = 1;
String nom;
Valeur(int o) {
Valeur.AS.estSupérieureA(Valeur.ROI);
this(o, o+"");
}
False!
Valeur(int o, String nom) {
ordre = v;
this.nom = nom;
}
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11, "Valet"),
DAME = new Valeur(12, "Dame"),
ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As");
boolean estSupérieureA(Valeur autre) {
return this.ordre > autre.ordre;
}
}
2013-2014
F. Mallet - POO
33
Compléments sur les classes
Le modificateur private
class Valeur {
// [Valeur.java]
Valeur.AS = new Valeur(1);
private int ordre;
Valeur.AS.ordre = 1;
private String nom;
Valeur(int o) {
Valeur.AS.estSupérieureA(Valeur.ROI);
this(o, o+"");
}
True!
Valeur(int o, String nom) {
ordre = v;
this.nom = nom;
}
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11, "Valet"),
DAME = new Valeur(12, "Dame"),
ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As");
boolean estSupérieureA(Valeur autre) {
return this.ordre > autre.ordre;
}
}
2013-2014
F. Mallet - POO
34
Compléments sur les classes
Le modificateur private
class Valeur {
// [Valeur.java]
class X {
private int ordre;
static public void main(String[] args) {
private String nom;
Valeur v1 = new Valeur(1);
private Valeur(int o) {
Valeur v2 = Valeur.AS;
this(o, o+"");
}
}
private Valeur(int o, String nom) { }
ordre = v;
this.nom = nom;
}
static final Valeur SEPT = new Valeur(7), HUIT = new Valeur(8),
NEUF = new Valeur(9), DIX = new Valeur(10),
VALET = new Valeur(11, "Valet"),
DAME = new Valeur(12, "Dame"),
ROI = new Valeur(13, "Roi"), AS = new Valeur(14, "As");
public String toString() {
return nom;
}
}
2013-2014
F. Mallet - POO
35
Compléments sur les classes
Les modificateurs
Le modificateur public
Membres (champ, méthode, constructeur) accessibles de
n’importe où
Le modificateur private
Membres accessibles seulement depuis le bloc de déclaration
de classe
class MaClasse {
// bloc de déclaration de classe
}
Pas de modificateur
Le plus souvent => package
• Membres accessibles depuis n’importe quel bloc d’une classe
appartement au même paquetage
Parfois public ou private selon le contexte
2013-2014
F. Mallet - POO
36
Compléments sur les classes
Bilan sur les énumérés
Sans les énumérés (<JDK1.5)
Avec les énumérés
enum Couleur {
TREFLE,
CARREAU,
CŒUR,
PIQUE;
}
Couleur
- nom : String
TREFLE : Couleur
PIQUE : Couleur
COEUR : Couleur
CARREAU : Couleur
- Couleur(String)
+ toString() : String
2013-2014
class Couleur {
private String nom;
private Couleur(String nom) {
this.nom = nom;
}
static final Couleur
TREFLE = new Couleur("TREFLE"),
PIQUE = new Couleur("PIQUE"),
COEUR = new Couleur("COEUR"),
CARREAU = new Couleur("CARREAU");
public String toString() {
return nom;
}
}
+ : public - : private rien : package
F. Mallet - POO
37
Compléments sur les classes
Compléments sur les énumérés
On peut ajouter des champs et des méthodes
enum Couleur {
private boolean estNoire;
TREFLE(true), PIQUE(true),
CARREAU(false), COEUR(false);
Couleur(boolean b) { // constructeur private!
estNoire = b;
}
boolean estNoire() { return estNoire; }
boolean estRouge() { return !estNoire; }
}
Test
Couleur c = Couleur.TREFLE;
System.out.println(c+" "+c.estNoire?"noir":"rouge");
2013-2014
F. Mallet - POO
38
Compléments sur les classes
Objectifs/Plan
Méthode d’instance ou méthode de classe
Constructeurs
Types énumérés
Structures de contrôle
Les modificateurs
Les expressions booléennes
2013-2014
F. Mallet - POO
39
Compléments sur les classes
Conditions booléennes
6 opérateurs de comparaison (int,long,float,double)
<
<=
>
>=
!=
==
inférieur
inférieur ou égal
supérieur
supérieur ou égal
différent
égal
3 opérateurs logiques (boolean)
&&
||
!
2013-2014
et logique
ou logique
non logique
(différent de &)
(différent de |)
(différent de ~)
F. Mallet - POO
40
Compléments sur les classes
Egalité de littéraux
Entiers, booléens, caractères
if (x == y – 2) …
Nombres approchés (float, double)
0.1+0.1+0.1+0.1+ 0.1+0.1+0.1 == 0.7
0.1+0.1+0.1+0.1+ 0.1+0.1+0.1+0.1 == 0.8
if (x == 0.8) …
if (Math.abs(x – 0.8) < 1e-6) …
true
false
NON !
OUI !
Enumérés (préfixer le littéral par le nom de l’enum !)
c == Couleur.TREFLE
2013-2014
F. Mallet - POO
41
Compléments sur les classes
Egalité de références
Le test d’égalité entre références ne compare pas les
objets !
Couleur c1 = new Couleur(1);
Couleur c2 = new Couleur(1);
c1 == c2 ?
Couleur
valeur : int
c1 != c2
c1
c2
: Couleur
valeur = 1
: Couleur
valeur = 1
2013-2014
F. Mallet - POO
42
Compléments sur les classes
Egalité de références
Le test d’égalité entre références ne compare pas les
objets !
Couleur c3 = new Couleur(1);
Couleur c4 = c3;
c3 == c4
c3
Couleur
valeur : int
c4
: Couleur
valeur = 1
2013-2014
F. Mallet - POO
43
Compléments sur les classes
Comparaison en profondeur
Créer une méthode qui compare
class Couleur {
int valeur;
Couleur(int v) { valeur = v; }
boolean estLaMêmeCouleurQue(Couleur c) {
if (this.valeur == c.valeur)
return true;
else
return false;
}
}
Usage
if (c1.estLaMêmeCouleurQue(c2)) …
2013-2014
F. Mallet - POO
44
Compléments sur les classes
Comparaison en profondeur
Créer une méthode qui compare
class Couleur {
int valeur;
Couleur(int v) { valeur = v; }
boolean estLaMêmeCouleurQue(Couleur c) {
return (this.valeur == c.valeur);
}
}
Usage
if (c1.estLaMêmeCouleurQue(c2)) …
2013-2014
F. Mallet - POO
45
Compléments sur les classes
Comparaison en profondeur
Créer une méthode qui compare
class Couleur {
private int valeur;
Couleur(int v) { valeur = v; }
boolean estLaMêmeCouleurQue(Couleur c) {
return (this.valeur == c.valeur);
}
}
Usage
if (c1.estLaMêmeCouleurQue(c2)) …
2013-2014
F. Mallet - POO
46
Compléments sur les classes
Egalité de chaînes de caractères
Les chaînes de caractères sont des références
String s1 = "rouge";
String s2 = "ro" + "uge";
s1 == s2 ?
s1.equals(s2) ?
s1
s2
: String
= "rouge"
: String
= "rouge"
2013-2014
F. Mallet - POO
47
Téléchargement