Vous êtes sur la page 1sur 158

Java : classes et interfaces

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en Programmation par contrainte (IA)
Ingénieur en Génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 84


Plan

1 Rappel

2 Classe
toString()
Setter
Getter
Constructeur
equals() et hashCode()
Attributs et méthodes statiques

H & H: Research and Training 2 / 84


Plan

3 Associations particulières entre classes


Héritage
Agrégation et composition

4 Classe et méthode abstraites

5 Classe et méthode finales

6 Interface

7 Énumération

H & H: Research and Training 3 / 84


Rappel

Java
Qu’est ce qu’une classe en POO ?

Ça correspond à un plan, un moule, une usine...


C’est une description abstraite d’un type d’objets
H I ©
EL
Elle représente un ensemble d’objets ayant les mêmes propriétés
U
O
statiques (attributs) et dynamiques (méthodes)

f E LM
ch r e
Qu’est ce que c’est la notion d’instance ?
©A
Une instance correspond à un objet créé à partir d’une classe (via
le constructeur)

H & H: Research and Training 4 / 84


Rappel

Java
Qu’est ce qu’une classe en POO ?

Ça correspond à un plan, un moule, une usine...


C’est une description abstraite d’un type d’objets
H I ©
EL
Elle représente un ensemble d’objets ayant les mêmes propriétés
U
O
statiques (attributs) et dynamiques (méthodes)

f E LM
ch r e
Qu’est ce que c’est la notion d’instance ?
©A
Une instance correspond à un objet créé à partir d’une classe (via
le constructeur)
L’instanciation : création d’un objet d’une classe

H & H: Research and Training 4 / 84


Rappel

Java
Qu’est ce qu’une classe en POO ?

Ça correspond à un plan, un moule, une usine...


C’est une description abstraite d’un type d’objets
H I ©
EL
Elle représente un ensemble d’objets ayant les mêmes propriétés
U
O
statiques (attributs) et dynamiques (méthodes)

f E LM
ch r e
Qu’est ce que c’est la notion d’instance ?
©A
Une instance correspond à un objet créé à partir d’une classe (via
le constructeur)
L’instanciation : création d’un objet d’une classe
instance ≡ objet

H & H: Research and Training 4 / 84


Rappel

Java

De quoi est composé une classe ?

NomClasse

H I ©
EL
les attributs

O U
L M
ref E
les méthodes

A ch
©
Attribut : [visibilité] + type + nom
Méthode : [visibilité] + valeur de retour + nom + arguments ≡
signature : exactement comme les fonctions en procédurale

H & H: Research and Training 5 / 84


Classe

Java

Particularité du Java
Toutes les classes héritent implicitement (pas besoin d’ajouter
extends) d’une classe mère Object.
H I ©
La classe Object contient plusieurs mU EL telles que
éthodes
toString() (pour transformerM un O
objet en chaı̂ne de caractère),
f
clone() (pour cloner)... E L
c h r e
© A permet de désigner l’objet courant.
Le mot-clé this
Contrairement à certains LOO, le this n’est pas obligatoire si
aucune ambiguité ne se présente.

H & H: Research and Training 6 / 84


Classe

Java
Commençons par créer un nouveau projet Java
Aller dans File > New > Java Project
Remplir le champ Project name: avec cours-poo puis cliquer
sur Next
H I ©
U EL file puis
Décocher la case Create module-info.java
cliquer sur Finish
L MO
r e f E
A ch
©

H & H: Research and Training 7 / 84


Classe

Java
Commençons par créer un nouveau projet Java
Aller dans File > New > Java Project
Remplir le champ Project name: avec cours-poo puis cliquer
sur Next
H I ©
U EL file puis
Décocher la case Create module-info.java
cliquer sur Finish
L MO
r e f E
A chorg.eclipse.test et
Créons deux packages
©
org.eclipse.model
Aller dans File > New > Package
Saisir le nom du premier package et valider
Refaire la même chose pour le second
H & H: Research and Training 7 / 84
Classe

Java
Créons deux classes
Une classe Personne dans org.eclipse.model contenant
trois attributs : num, nom et prénom

I ©
Une classe Main dans org.eclipse.test contenant le
H
EL
public static void main dans lequel on instanciera la
U
O
LM
classe Personne

r e f E
ch
©A

H & H: Research and Training 8 / 84


Classe

Java
Créons deux classes
Une classe Personne dans org.eclipse.model contenant
trois attributs : num, nom et prénom

I ©
Une classe Main dans org.eclipse.test contenant le
H
EL
public static void main dans lequel on instanciera la
U
O
LM
classe Personne

r e f E
A
Créons les classes ch
©
Aller dans File > New > Class
Saisir le nom du package et celui de la classe
Pour la classe Main, cocher la case public static void
main (String[] args)
H & H: Research and Training 8 / 84
Classe

Java
Contenu de la classe Personne
package org.eclipse.model;

public class Personne {


int num;
String nom;
H I ©
String prenom;
U EL
}
O
f E LM
Remarques

ch r e
A
En Java, toute classe a un constructeur par défaut sans paramètres.
©
Par défaut, la visibilité des attributs, en Java, est package.

Donc, les attributs ne seront pas accessibles depuis la classe Main qui se situe
dans un package différent (org.eclipse.test)

Donc, changeons la visibilité des trois attributs de la classe Personne

H & H: Research and Training 9 / 84


Classe

Java

Nouveau contenu de la classe Personne


package org.eclipse.model;
H I ©
UEL
public class Personne { O
public int num;
f E LM
public String nom;
ch r e
©A
public String prenom;
}

H & H: Research and Training 10 / 84


Classe

Java

Contenu de la classe Main


package org.eclipse.test;
H I ©
EL
OU
public class Main {

public static voidE L M


e f main(String[] args) {

A chr
// TODO Auto-generated method stub

} ©
}

H & H: Research and Training 11 / 84


Classe

Java
Hypothèse

Si on voulait créer un objet de la classe Personne avec les


valeurs 1, wick et john

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 12 / 84


Classe

Java
Hypothèse

Si on voulait créer un objet de la classe Personne avec les


valeurs 1, wick et john

H I ©
U
Étape 1 : déclaration d’un objet (objet non EéLé)
cr
Personne personne; L MO
r e f E
A ch
©

H & H: Research and Training 12 / 84


Classe

Java
Hypothèse

Si on voulait créer un objet de la classe Personne avec les


valeurs 1, wick et john

H I ©
U
Étape 1 : déclaration d’un objet (objet non EéLé)
cr
Personne personne; L MO
r e f E
A ch de la classe Personne (objet créé)
©
Étape 2 : instanciation
personne = new Personne();

H & H: Research and Training 12 / 84


Classe

Java
Hypothèse

Si on voulait créer un objet de la classe Personne avec les


valeurs 1, wick et john

H I ©
U
Étape 1 : déclaration d’un objet (objet non EéLé)
cr
Personne personne; L MO
r e f E
A ch de la classe Personne (objet créé)
©
Étape 2 : instanciation
personne = new Personne();

On peut faire déclaration + instanciation


Personne personne = new Personne();

H & H: Research and Training 12 / 84


Classe

Java

Affectons les valeurs aux différents attributs


personne.num = 1;
personne.nom = "wick";
H I ©
personne.prenom = "john";
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 13 / 84


Classe

Java

Affectons les valeurs aux différents attributs


personne.num = 1;
personne.nom = "wick";
H I ©
personne.prenom = "john";
U EL
O
f E LM
Pour être sûr que c r e
hvaleurs ont bien été affectées aux attributs,
les
on affiche © A
System.out.println(personne)

H & H: Research and Training 13 / 84


Classe

Java
Contenu de la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.num = 1;
f E LM
r
personne.nom = "wick";
ch e
©A
personne.prenom = "john";
System.out.println(personne);
}
}

H & H: Research and Training 14 / 84


Classe

Java
Contenu de la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.num = 1;
f E LM
r
personne.nom = "wick";
ch e
©A
personne.prenom = "john";
System.out.println(personne);
}
}

En exécutant, le résultat est :


org.eclipse.model.Personne@7852e922
H & H: Research and Training 14 / 84
Classe toString()

Java
Explication

Pour afficher les détails d’un objet, il faut que la méthode


toString() soit implémentée

H I ©
Pour la générer, clic droit sur la classe Personne, aller dans
source > Generate toString()..., sélectionner les
U EL
O
LM
champs à afficher puis valider.

r e f E
ch
©A

H & H: Research and Training 15 / 84


Classe toString()

Java
Explication

Pour afficher les détails d’un objet, il faut que la méthode


toString() soit implémentée

H I ©
Pour la générer, clic droit sur la classe Personne, aller dans
source > Generate toString()..., sélectionner les
U EL
O
LM
champs à afficher puis valider.

r e f E
Le code de la mA ch toString()
éthode
@Override
©
public String toString() {
return "Personne [num=" + num + ", nom=" + nom +
", prenom=" + prenom + "]";
}

H & H: Research and Training 15 / 84


Classe toString()

Java

@Override
Une annotation (appelé aussi décorateur par MicroSoft)
H I ©
EL
Pour nous rappeler qu’on redéfinit une méthode qui appartient à
U
la classe mère (ici Object)
O
f E LM
ch r e
©A

H & H: Research and Training 16 / 84


Classe toString()

Java

@Override
Une annotation (appelé aussi décorateur par MicroSoft)
H I ©
EL
Pour nous rappeler qu’on redéfinit une méthode qui appartient à
U
la classe mère (ici Object)
O
f E LM
ch r e
© A
En exécutant, le résultat est :
Personne [num=1, nom=wick, prenom=john]

H & H: Research and Training 16 / 84


Classe Setter

Java
Hypothèse

Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 17 / 84


Classe Setter

Java
Hypothèse

Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne

Démarche
H I ©
UEL
O
LM
1 Bloquer l’accès directe aux attributs (mettre la visibilité à private)

2
r e f E
Définir des méthodes publiques qui contrôlent l’affectation de valeurs
ch
©A
aux attributs (les setter)

H & H: Research and Training 17 / 84


Classe Setter

Java
Hypothèse

Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne

Démarche
H I ©
UEL
O
LM
1 Bloquer l’accès directe aux attributs (mettre la visibilité à private)

2
r e f E
Définir des méthodes publiques qui contrôlent l’affectation de valeurs
ch
©A
aux attributs (les setter)

Convention

Mettre la visibilité private ou protected pour tous les attributs

Mettre la visibilité public pour toutes les méthodes


H & H: Research and Training 17 / 84
Classe Setter

Java
Mettons la visibilité private pour tous les attributs de la classe Personne
package org.eclipse.model;

public class Personne {


private int num;
private String nom;
H I ©
EL
private String prenom;

O U
LM
@Override
public String toString() {

r e f E
return "Personne [num=" + num + ", nom=" + nom + ",
ch
©A
prenom=" + prenom + "]";
}
}

H & H: Research and Training 18 / 84


Classe Setter

Java
Mettons la visibilité private pour tous les attributs de la classe Personne
package org.eclipse.model;

public class Personne {


private int num;
private String nom;
H I ©
EL
private String prenom;

O U
LM
@Override
public String toString() {

r e f E
return "Personne [num=" + num + ", nom=" + nom + ",
ch
©A
prenom=" + prenom + "]";
}
}

Dans la classe Main, les trois lignes suivantes sont soulignées en rouge
personne.num = 1;
personne.nom = "wick";
personne.prenom = "john";

H & H: Research and Training 18 / 84


Classe Setter

Java

Explication

Les attributs sont privés, donc aucun accès direct ne sera autorisé

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 19 / 84


Classe Setter

Java

Explication

Les attributs sont privés, donc aucun accès direct ne sera autorisé

H I ©
UEL
O
LM
Solution : générer les setters

r e f E
Faire clic droit sur la classe Personne
ch
©A
Aller dans Source > Generate Getters and Setters...
Cliquer sur chaque attribut et cocher la case
setNomAttribut(...)
Valider

H & H: Research and Training 19 / 84


Classe Setter

Java
Les trois méthodes générées
public void setNum(int num) {
this.num = num;
}
public void setNom(String nom) {
this.nom = nom;
}
H I ©
EL
public void setPrenom(String prenom) {

}
this.prenom = prenom;
O U
f E LM
ch r e
©A

H & H: Research and Training 20 / 84


Classe Setter

Java
Les trois méthodes générées
public void setNum(int num) {
this.num = num;
}
public void setNom(String nom) {
this.nom = nom;
}
H I ©
EL
public void setPrenom(String prenom) {

}
this.prenom = prenom;
O U
E LM
Modifions setNum() pour ne plus accepter de valeurs inférieures à 1
f
public void setNum(int num) {
ch r e
©A
if (num >= 1){
this.num = num;
}
}
public void setNom(String nom) {
this.nom = nom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
H & H: Research and Training 20 / 84
Classe Setter

Java
Mettons à jour la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.setNum(1);
f E LM
r e
personne.setNom("wick");
ch
©A
personne.setPrenom("john");
System.out.println(personne);
}
}

H & H: Research and Training 21 / 84


Classe Setter

Java
Mettons à jour la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.setNum(1);
f E LM
r e
personne.setNom("wick");
ch
©A
personne.setPrenom("john");
System.out.println(personne);
}
}

En exécutant, le résultat est :


Personne [num=1, nom=wick, prenom=john]
H & H: Research and Training 21 / 84
Classe Setter

Java
Mettons à jour la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.setNum(-1);
f E LM
r e
personne.setNom("wick");
ch
©A
personne.setPrenom("john");
System.out.println(personne);
}
}

H & H: Research and Training 22 / 84


Classe Setter

Java
Mettons à jour la classe Main
package org.eclipse.test;

public class Main {

H I ©
public static void main(String[] args) {
UEL
O
Personne personne = new Personne();
personne.setNum(-1);
f E LM
r e
personne.setNom("wick");
ch
©A
personne.setPrenom("john");
System.out.println(personne);
}
}

En exécutant, le résultat est :


Personne [num=0, nom=wick, prenom=john]
H & H: Research and Training 22 / 84
Classe Getter

Java

Hypothèse

H I ©
Si on voulait afficher les attributs (privés) de la classe Personne, un
par un, dans la classe Main sans passer par le toString()
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 23 / 84


Classe Getter

Java

Hypothèse

H I ©
Si on voulait afficher les attributs (privés) de la classe Personne, un
par un, dans la classe Main sans passer par le toString()
UEL
O
f E LM
ch r e
Démarche
© A
Définir des méthodes qui retournent les valeurs des attributs (les
getter)

H & H: Research and Training 23 / 84


Classe Getter

Java

Pour générer les getters


Faire clic droit sur la classe Personne H I ©
UEL
O
Aller dans Source > Generate Getters and Setters...

f E LM
ch r e
Cliquer sur chaque attribut et cocher la case

©A
getNomAttribut()
Valider

H & H: Research and Training 24 / 84


Classe Getter

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

H I ©
EL
public static void main(String[] args) {
Personne personne = new Personne();
O U
LM
personne.setNum(1);
personne.setNom("wick");

r e f
personne.setPrenom("john"); E
ch
System.out.println(personne.getNum() + " " + personne.

} ©A
getNom() + " " + personne.getPrenom());

H & H: Research and Training 25 / 84


Classe Getter

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

H I ©
EL
public static void main(String[] args) {
Personne personne = new Personne();
O U
LM
personne.setNum(1);
personne.setNom("wick");

r e f
personne.setPrenom("john"); E
ch
System.out.println(personne.getNum() + " " + personne.

} ©A
getNom() + " " + personne.getPrenom());

En exécutant, le résultat est :


1 wick john

H & H: Research and Training 25 / 84


Classe Constructeur

Java
Remarques

Par défaut, toute classe en Java a un constructeur par défaut sans


paramètre

I ©
Pour simplifier la création d’objets, on peut définir un nouveau
H
EL
constructeur qui prend en paramètre plusieurs attributs de la
U
classe
O
f E LM
ch r e
©A

H & H: Research and Training 26 / 84


Classe Constructeur

Java
Remarques

Par défaut, toute classe en Java a un constructeur par défaut sans


paramètre

I ©
Pour simplifier la création d’objets, on peut définir un nouveau
H
EL
constructeur qui prend en paramètre plusieurs attributs de la
U
classe
O
f E LM
r e
ch avec paramètre
Pour générer un constructeur
© A
1 Faire clic droit sur la classe Personne
2 Aller dans Source > Generate Constructor using
Fields...
3 Vérifier que toutes les cases sont cochées et valider
H & H: Research and Training 26 / 84
Classe Constructeur

Java
Le constructeur généré
public Personne(int num, String nom, String prenom) {
super();
this.num = num;
this.nom = nom;
this.prenom = prenom;
H I ©
}
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 27 / 84


Classe Constructeur

Java
Le constructeur généré
public Personne(int num, String nom, String prenom) {
super();
this.num = num;
this.nom = nom;
this.prenom = prenom;
H I ©
}
U EL
O
f E LM
Pour préserver la cohérence, il faut que le constructeur contrôle la

r e
valeur de l’attribut num
ch num, String nom, String prenom) {
©
super();
A
public Personne(int

if (num >= 1){


this.num = num;
}
this.nom = nom;
this.prenom = prenom;
}
H & H: Research and Training 27 / 84
Classe Constructeur

Java

On peut aussi appelé le setter dans le constructeur


public Personne(int num, String nom, String prenom)
H I ©
{
U EL
super(); O
this.setNum(num);
f E LM
this.nom = nom;
ch r e
©A
this.prenom = prenom;
}

H & H: Research and Training 28 / 84


Classe Constructeur

Java

Dans la classe Main, la ligne suivante est soulignée en rouge


Personne personne = new Personne();
H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 29 / 84


Classe Constructeur

Java

Dans la classe Main, la ligne suivante est soulignée en rouge


Personne personne = new Personne();
H I ©
EL
Explication
M OU
é L
Le constructeur par défaut a étE
r e f écrasé (il n’existe plus)

A ch
©

H & H: Research and Training 29 / 84


Classe Constructeur

Java

Dans la classe Main, la ligne suivante est soulignée en rouge


Personne personne = new Personne();
H I ©
EL
Explication
M OU
é L
Le constructeur par défaut a étE
r e f écrasé (il n’existe plus)

A ch
Solution
©
Générer un constructeur sans paramètre

H & H: Research and Training 29 / 84


Classe Constructeur

Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

public static void main(String[] args) {


Personne personne = new Personne();
personne.setNum(1);
personne.setNom("wick");
H I ©
personne.setPrenom("john");
U EL
O
System.out.println(personne.getNum() + " " + personne.getNom()

LM
+ " " + personne.getPrenom());

r e E
Personne personne2 = new Personne(2, "bob", "mike");
f
System.out.println(personne2);
}
ch
©A
}

H & H: Research and Training 30 / 84


Classe Constructeur

Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

public static void main(String[] args) {


Personne personne = new Personne();
personne.setNum(1);
personne.setNom("wick");
H I ©
personne.setPrenom("john");
U EL
O
System.out.println(personne.getNum() + " " + personne.getNom()

LM
+ " " + personne.getPrenom());

r e E
Personne personne2 = new Personne(2, "bob", "mike");
f
System.out.println(personne2);
}
ch
©A
}

En exécutant, le résultat est :

1 wick john
Personne [num=2, nom=bob, prenom=mike]

H & H: Research and Training 30 / 84


Classe equals() et hashCode()

Java

En testant l’égalité entre les deux objets suivants


Personne personne2 = new Personne(2, "bob", "mike");
H I ©
EL
Personne personne3 = new Personne(2, "bob", "mike");
System.out.println(personne2.equals(personne3));
O U
f E LM
ch r e
©A

H & H: Research and Training 31 / 84


Classe equals() et hashCode()

Java

En testant l’égalité entre les deux objets suivants


Personne personne2 = new Personne(2, "bob", "mike");
H I ©
EL
Personne personne3 = new Personne(2, "bob", "mike");
System.out.println(personne2.equals(personne3));
O U
f E LM
ch r e
Le résultat est ©A
false

H & H: Research and Training 31 / 84


Classe equals() et hashCode()

Java

Explication

Par défaut, deux objets d’une même classe sont égaux s’ils
pointent sur le même espace mémoire (identiques).

H I ©
Pour comparer les valeurs, il faut redéfinir les méthodes
equals() et hashCode().
U EL
O
f E LM
equals() permet de définir comment tester sémantiquement
e
l’égalité de deux objets.
r
(elle©
Achpermet de retourner la valeur de hachage d’un objet
hashCode()
ne retourne pas un identifiant unique).

Si une classe redéfinit equals(), alors elle doit aussi redéfinir


hashCode().
equals() et hashCode() doivent utiliser les mêmes attributs.

H & H: Research and Training 32 / 84


Classe equals() et hashCode()

Java

equals() et hashCode() doivent respecter les contraintes suivantes

H I ©
Symétrie : si a.equals(b) retourne true alors b.equals(a) aussi.
EL
OU
Réflexivité : a.equals(a) retourne true si a est un objet non null.
M
Transitivité : si a.equals(b)E
f L
et b.equals(c) alors a.equals(c).
e
chr alors a.hashCode() == b.hashCode().
A
Consistance : si a.equals(b)
©
a.equals(null) retourne false.

H & H: Research and Training 33 / 84


Classe equals() et hashCode()

Java

Code par défaut de equals() dans Object


H I ©
U EL
public boolean equals(Object obj) {
O
return (this == obj);
f E LM
}
ch r e
©A

H & H: Research and Training 34 / 84


Classe equals() et hashCode()

Java

Génération sous Eclipse


H I ©
Faire clic droit sur la classe Personne,
U EL
O
f E LM
Aller dans source > Generate hashCode() and
equals(),
ch r e
©A
Sélectionner les champs à utiliser puis valider.

H & H: Research and Training 35 / 84


Classe equals() et hashCode()
Le code généré

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nom == null) ? 0 : nom.hashCode());
result = prime * result + num;
result = prime * result + ((prenom == null) ? 0 : prenom.hashCode());
return result;
}

©
@Override
public boolean equals(Object obj) {

H I
EL
if (this == obj)
return true;
if (obj == null)
return false;
O U
LM
if (getClass() != obj.getClass())

e E
return false;

f
Personne other = (Personne) obj;

r
ch
if (nom == null) {
if (other.nom != null)

©A
return false;
} else if (!nom.equals(other.nom))
return false;
if (num != other.num)
return false;
if (prenom == null) {
if (other.prenom != null)
return false;
} else if (!prenom.equals(other.prenom))
return false;
return true;
}

H & H: Research and Training 36 / 84


Classe equals() et hashCode()

Java

En retestant le code précédent


Personne personne2 = new Personne(2, "bob", "mike");
H I ©
EL
Personne personne3 = new Personne(2, "bob", "mike");
System.out.println(personne2.equals(personne3));
O U
f E LM
ch r e
©A

H & H: Research and Training 37 / 84


Classe equals() et hashCode()

Java

En retestant le code précédent


Personne personne2 = new Personne(2, "bob", "mike");
H I ©
EL
Personne personne3 = new Personne(2, "bob", "mike");
System.out.println(personne2.equals(personne3));
O U
f E LM
ch r e
Le résultat est ©A
true

H & H: Research and Training 37 / 84


Classe Attributs et méthodes statiques

Java
Récapitulatif

Les instances d’une même classe ont toutes les mêmes attributs mais
pas les mêmes valeurs.

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 38 / 84


Classe Attributs et méthodes statiques

Java
Récapitulatif

Les instances d’une même classe ont toutes les mêmes attributs mais
pas les mêmes valeurs.

H I ©
EL
Hypothèse
M OU
f E Lait une valeur partagée par toutes
Et si nous voudrions qu’un attribut
e
chrd’objets instanciés de la classe Personne).
les instances (le nombre
© A

H & H: Research and Training 38 / 84


Classe Attributs et méthodes statiques

Java
Récapitulatif

Les instances d’une même classe ont toutes les mêmes attributs mais
pas les mêmes valeurs.

H I ©
EL
Hypothèse
M OU
f E Lait une valeur partagée par toutes
Et si nous voudrions qu’un attribut
e
chrd’objets instanciés de la classe Personne).
les instances (le nombre
© A
Définition
Un attribut dont la valeur est partagée par toutes les instances de la
classe est appelée : attribut statique ou attribut de classe.

H & H: Research and Training 38 / 84


Classe Attributs et méthodes statiques

Java

Exemple
H I ©
Pour créer un attribut contenant le nombreE
U L objets créés à
des
partir de la classe Personne.
L MO
r e f E sinon chaque objet pourrait avoir sa
Cet attribut doit être static,
A chcet attribut.
propre valeur pour
©

H & H: Research and Training 39 / 84


Classe Attributs et méthodes statiques

Java
Ajoutons un attribut statique nbrPersonnes à la liste d’attributs de la
classe Personne
private static int nbrPersonnes;

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 40 / 84


Classe Attributs et méthodes statiques

Java
Ajoutons un attribut statique nbrPersonnes à la liste d’attributs de la
classe Personne
private static int nbrPersonnes;

Incrémentons notre compteur de personnes dans les constructeurs


H I ©
public Personne() { U EL
O
super();
nbrPersonnes++;
f E LM
}
ch r e
©A
public Personne(int num, String nom, String prenom) {
super();
this.setNum(num);
this.nom = nom;
this.prenom = prenom;
nbrPersonnes++;
}

H & H: Research and Training 40 / 84


Classe Attributs et méthodes statiques

Java
Générons un getter pour l’attribut static nbrPersonnes
public static int getNbrPersonnes() {
return nbrPersonnes;
}

H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 41 / 84


Classe Attributs et méthodes statiques

Java
Générons un getter pour l’attribut static nbrPersonnes
public static int getNbrPersonnes() {
return nbrPersonnes;
}

Testons cela dans la classe Main


Personne personne = new Personne();
H I ©
personne.setNum(1);
U EL
personne.setNom("wick");
O
LM
personne.setPrenom("john");

personne.getPrenom());
r e E
System.out.println(personne.getNum() + " " +personne.getNom() + " " +
f
ch
System.out.println(Personne.getNbrPersonnes());

©A
Personne personne2 = new Personne(2, "bob", "mike");
System.out.println(personne2);
System.out.println(Personne.getNbrPersonnes());

H & H: Research and Training 41 / 84


Classe Attributs et méthodes statiques

Java
Générons un getter pour l’attribut static nbrPersonnes
public static int getNbrPersonnes() {
return nbrPersonnes;
}

Testons cela dans la classe Main


Personne personne = new Personne();
H I ©
personne.setNum(1);
U EL
personne.setNom("wick");
O
LM
personne.setPrenom("john");

personne.getPrenom());
r e E
System.out.println(personne.getNum() + " " +personne.getNom() + " " +
f
ch
System.out.println(Personne.getNbrPersonnes());

©A
Personne personne2 = new Personne(2, "bob", "mike");
System.out.println(personne2);
System.out.println(Personne.getNbrPersonnes());

Le résultat est
1 wick john
1
Personne [num=2, nom=bob, prenom=mike]
2
H & H: Research and Training 41 / 84
Classe Attributs et méthodes statiques

Java

Exercice
Définir une classe Adresse avec trois attributs privés (rue,
codePostal et ville de type chaı̂ne de caractère

H I ©
Définir un constructeur avec trois paramètres, les getters, les
setters et la méthode toString()
U EL
M O
f E L constructeur
Dans la classe Personne, ajouter un attribut adresse de type
Adresse et définir un
h r e nouveau
lecsetter de ce nouvel attribut
à quatre paramètres

©A
et le getter et
Dans la classe Main, créer deux objets, un objet de type
Adresse et un de type Personne et lui attribuer l’adresse créée
précédemment
Afficher tous les attributs de cet objet de la classe Personne

H & H: Research and Training 42 / 84


Associations particulières entre classes Héritage

Java

L’héritage, quand ?
H I ©
Lorsque deux ou plusieurs classes partagent plusieurs attributs UEL
O
(et méthodes)
f E LM
ch r e
Lorsqu’une Classe1 est une sorte de Classe2
©A

H & H: Research and Training 43 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et et un
niveau
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et et un
niveau
H I ©
U
Sémantiquement, enseignant et étudiant ELune sorte de
sont
personne
L MO
r e f E
A ch
©

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et et un
niveau
H I ©
U
Sémantiquement, enseignant et étudiant ELune sorte de
sont
personne
L MO
r e f Eplusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom ch
©

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et et un
niveau
H I ©
U
Sémantiquement, enseignant et étudiant ELune sorte de
sont
personne
L MO
r e f Eplusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom ch
©
Donc, on peut mettre en commun les attributs numéro, nom et
prénom dans une classe Personne

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et et un
niveau
H I ©
U
Sémantiquement, enseignant et étudiant ELune sorte de
sont
personne
L MO
r e f Eplusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom ch
©
Donc, on peut mettre en commun les attributs numéro, nom et
prénom dans une classe Personne
Les classes Étudiant et Enseignant hériteront (extends) de
la classe Personne

H & H: Research and Training 44 / 84


Associations particulières entre classes Héritage

Java

Particularité du Java
H I ©
L’héritage multiple n’est pas permis parU le E
L
langage Java
M O
E L
C’est-à-dire, une classe ne peut
f hériter de plusieurs classes
différentes
ch r e
© A

H & H: Research and Training 45 / 84


Associations particulières entre classes Héritage

Java

Créons les classes Etudiant et Enseignant


Aller dans File > New > Class

H I ©
Choisir le package org.eclipse.model
UEL
O
LM
Saisir le nom de la classe

r e f E
Dans la section Superclass, cliquer sur Browse et chercher
A ch
puis sélectionner Personne
©
Cliquer sur Ok et enfin Finish
Refaire la même chose pour la seconde classe

H & H: Research and Training 46 / 84


Associations particulières entre classes Héritage

Java
Contenu de la classe Enseignant
package org.eclipse.model;

public class Enseignant extends Personne {

H I ©
}
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 47 / 84


Associations particulières entre classes Héritage

Java
Contenu de la classe Enseignant
package org.eclipse.model;

public class Enseignant extends Personne {

H I ©
}
UEL
L MO
f E
Contenu de la classe Etudiant
r e
A ch
package org.eclipse.model;
©
public class Etudiant extends Personne {

}
extends est le mot-clé à utiliser pour définir une relation d’héritage
entre deux classes
H & H: Research and Training 47 / 84
Associations particulières entre classes Héritage

Java

Ensuite
H I ©
Créer un attribut niveau dans la classe Etudiant puis générer
UEL
les getter et setter O
f E LM
ch r
générer les getter et setter
e
Créer un attribut salaire dans la classe Enseignant puis

©A

H & H: Research and Training 48 / 84


Associations particulières entre classes Héritage

Java
Pour créer un objet de type Enseignant
Enseignant enseignant = new Enseignant();
enseignant.setNum(3);
enseignant.setNom("green");
enseignant.setPrenom("jonas");
H I ©
enseignant.setSalaire(1700);
UEL
O
LM
System.out.println(enseignant);

r e f E
ch
©A

H & H: Research and Training 49 / 84


Associations particulières entre classes Héritage

Java
Pour créer un objet de type Enseignant
Enseignant enseignant = new Enseignant();
enseignant.setNum(3);
enseignant.setNom("green");
enseignant.setPrenom("jonas");
H I ©
enseignant.setSalaire(1700);
UEL
O
LM
System.out.println(enseignant);

r e f E
ch
En exécutant, le résultat est :

©A
Personne [num=3, nom=green, prenom=jonas]

H & H: Research and Training 49 / 84


Associations particulières entre classes Héritage

Java
Pour créer un objet de type Enseignant
Enseignant enseignant = new Enseignant();
enseignant.setNum(3);
enseignant.setNom("green");
enseignant.setPrenom("jonas");
H I ©
enseignant.setSalaire(1700);
UEL
O
LM
System.out.println(enseignant);

r e f E
ch
En exécutant, le résultat est :

©A
Personne [num=3, nom=green, prenom=jonas]

Mais on ne voit pas le salaire, pourquoi ?

car on a pas redéfini la méthode toString(), on a utilisé celle de la


classe mère
H & H: Research and Training 49 / 84
Associations particulières entre classes Héritage

Java
Et si on génère le toString() dans la classe Enseignant
@Override
public String toString() {
return "Enseignant [salaire=" + salaire + "]";
}
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 50 / 84


Associations particulières entre classes Héritage

Java
Et si on génère le toString() dans la classe Enseignant
@Override
public String toString() {
return "Enseignant [salaire=" + salaire + "]";
}
H I ©
U EL
M O
Pour appeler le toString() deLla classe mère à partir de classe
fille (Enseignant)
r e f E
A ch
@Override
©
public String toString() {
return super.toString() + " Enseignant [salaire
=" + salaire + "]";
}

Le mot-clé super permet d’appeler une méthode de la classe mère


H & H: Research and Training 50 / 84
Associations particulières entre classes Héritage

Java
Comment générer un constructeur à plusieurs paramètres et utiliser celui de la classe mère

Faire clic droit sur la classe Enseignant

Aller dans Source > Generate Constructor using Fields...

paramètres
H I ©
Dans Select super constructor to invoke, sélectionner le constructeur à trois

UEL
O
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée

LM
et valider

r e f E
ch
©A

H & H: Research and Training 51 / 84


Associations particulières entre classes Héritage

Java
Comment générer un constructeur à plusieurs paramètres et utiliser celui de la classe mère

Faire clic droit sur la classe Enseignant

Aller dans Source > Generate Constructor using Fields...

paramètres
H I ©
Dans Select super constructor to invoke, sélectionner le constructeur à trois

UEL
O
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée

LM
et valider

r e f E
Le constructeur généré
ch
©A
public Enseignant(int num, String nom, String prenom, int salaire) {
super(num, nom, prenom);
this.salaire = salaire;
}

H & H: Research and Training 51 / 84


Associations particulières entre classes Héritage

Java
Comment générer un constructeur à plusieurs paramètres et utiliser celui de la classe mère

Faire clic droit sur la classe Enseignant

Aller dans Source > Generate Constructor using Fields...

paramètres
H I ©
Dans Select super constructor to invoke, sélectionner le constructeur à trois

UEL
O
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée

LM
et valider

r e f E
Le constructeur généré
ch
©A
public Enseignant(int num, String nom, String prenom, int salaire) {
super(num, nom, prenom);
this.salaire = salaire;
}

Maintenant, on peut créer un enseignant ainsi


Enseignant enseignant = new Enseignant(3, "green", "jonas", 1700);

H & H: Research and Training 51 / 84


Associations particulières entre classes Héritage

Java

À partir de la classe Enseignant

On ne peut avoir accès direct à un attribut de la classe mère


H I ©
UEL
O
C’est-à-dire, on ne peut faire this.num car les attributs ont une
visibilité private
f E LM
ch r e
Pour modifier la valeur d’un attribut privé de la classe mère, il faut

©A
soit utiliser les getters/setters
soit mettre la visibilité des attributs de la classe mère à protected

H & H: Research and Training 52 / 84


Associations particulières entre classes Héritage

Java
On peut créer un objet de la classe Personne ainsi
Enseignant enseignant = new Enseignant(3, "green", "
jonas", 1700);

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 53 / 84


Associations particulières entre classes Héritage

Java
On peut créer un objet de la classe Personne ainsi
Enseignant enseignant = new Enseignant(3, "green", "
jonas", 1700);

H I ©
EL
Ou ainsi
M OU
Personne enseignant = E L Enseignant(3, "green", "
new
jonas", 1700); ref
A ch
©

H & H: Research and Training 53 / 84


Associations particulières entre classes Héritage

Java
On peut créer un objet de la classe Personne ainsi
Enseignant enseignant = new Enseignant(3, "green", "
jonas", 1700);

H I ©
EL
Ou ainsi
M OU
Personne enseignant = E L Enseignant(3, "green", "
new
jonas", 1700); ref
A ch
©
Ceci est faux
Enseignant enseignant = new Personne(3, "green", "
jonas");

H & H: Research and Training 53 / 84


Associations particulières entre classes Héritage

Java
Remarque
1 Pour connaı̂tre la classe d’un objet, on peut utiliser le mot-clé
instanceof

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 54 / 84


Associations particulières entre classes Héritage

Java
Remarque
1 Pour connaı̂tre la classe d’un objet, on peut utiliser le mot-clé
instanceof

H I ©
Exemple UEL
O
Personne enseignant = new Enseignant(3, "green", "
f E LM
jonas", 1700);
ch r e
©A
System.out.println(enseignant instanceof Enseignant)
;
// affiche true
System.out.println(enseignant instanceof Personne);
// affiche true
System.out.println(personne instanceof Enseignant);
// affiche false
H & H: Research and Training 54 / 84
Associations particulières entre classes Héritage

Java
Exercice
1 Créer deux objets de type Etudiant et deux objets de type
Enseignant et stocker les tous dans un seul tableau.
2 Parcourir le tableau et afficher pour chacun soit le salaire soit le
H I ©
niveau
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 55 / 84


Associations particulières entre classes Héritage

Java
Exercice
1 Créer deux objets de type Etudiant et deux objets de type
Enseignant et stocker les tous dans un seul tableau.
2 Parcourir le tableau et afficher pour chacun soit le salaire soit le
H I ©
niveau
UEL
O
f E LM
ch r e
Pour parcourir un tableau, on peut utiliser le raccourci de for
©A
Personne personnes [] = { personne, personne2,
enseignant };
for(Personne perso : personnes) {
System.out.println(perso);
}

H & H: Research and Training 55 / 84


Associations particulières entre classes Agrégation et composition

Java

L’agrégation

C’est une association non-symétrique


Elle représente une relation de type ensemble/élément
H I ©
U EL
O
f E LM
ch r e
©A

H & H: Research and Training 56 / 84


Associations particulières entre classes Agrégation et composition

Java

L’agrégation

C’est une association non-symétrique


Elle représente une relation de type ensemble/élément
H I ©
U EL
O
f E LM
La composition
ch r e
©A
C’est une agrégation forte
L’élément n’existe pas sans l’agrégat (l’élément est détruit lorsque
l’agrégat n’existe plus)

H & H: Research and Training 56 / 84


Associations particulières entre classes Agrégation et composition

Java
Comment coder des relations d’agrégation et de composition en Java ?
Véhicule
numImmat
marque
modèle
H I ©
U EL
O
f E LM
ch r e
Moteur ©A Chssis

num id
poids matière

H & H: Research and Training 57 / 84


Associations particulières entre classes Agrégation et composition

Java
La classe Châssis
public class Chassis {
private int id;
private String matiere;
public int getId() {
H I ©
EL
return id;
}
O U
LM
public void setId(int id) {
this.id = id;
r e f E
ch
}

©A
public String getMatiere() {
return matiere;
}
public void setMatiere(String matiere) {
this.matiere = matiere;
}
}

H & H: Research and Training 58 / 84


Associations particulières entre classes Agrégation et composition

Java
La classe Moteur
public class Moteur {
private int num;
private float poids;
public int getNum() {
H I ©
EL
return num;
}
O U
LM
public void setNum(int num) {
this.num = num;
r e f E
ch
}

©A
public float getPoids() {
return poids;
}
public void setPoids(float poids) {
this.poids = poids;
}
}

H & H: Research and Training 59 / 84


Associations particulières entre classes Agrégation et composition

La classe Véhicule
public class Vehivule {
private Moteur moteur;
private final Chassis chassis;
public Vehivule(Chassis chassis) {
this.chassis = chassis;
}
public Moteur getMoteur() {
return moteur;
H I ©
EL
}
public void setMoteur(Moteur moteur) {
this.moteur = moteur;
O U
}
}

f E LM
ch r e
©A

H & H: Research and Training 60 / 84


Associations particulières entre classes Agrégation et composition

La classe Véhicule
public class Vehivule {
private Moteur moteur;
private final Chassis chassis;
public Vehivule(Chassis chassis) {
this.chassis = chassis;
}
public Moteur getMoteur() {
return moteur;
H I ©
EL
}
public void setMoteur(Moteur moteur) {
this.moteur = moteur;
O U
}
}

f E LM
ch r e
Explication ©A
un composant est déclaré final et instanciable une seule fois au moment de
l’instanciation de l’objet composite

un composant n’a ni getter ni setter

lorsque le véhiculé est détruit, le châssis le sera aussi

H & H: Research and Training 60 / 84


Associations particulières entre classes Agrégation et composition

Java
Pour tester
public class Main {
public static void main(String[] args) {
Chassis chassis = new Chassis();
chassis.setId(100);
H I ©
chassis.setMatiere("fer");
U EL
O
LM
Vehivule vehivule = new Vehivule(chassis);
Moteur moteur = new Moteur();
r e f E
moteur.setNum(100);
ch
©A
moteur.setPoids(500f);
vehivule.setMoteur(moteur);
// pas de méthode permettant de modifier le châ
ssis d’un véhicule
}
}

H & H: Research and Training 61 / 84


Classe et méthode abstraites

Java
Classe abstraite
C’est une classe qu’on ne peut instancier
Les constructeurs peuvent donc être supprimés

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 62 / 84


Classe et méthode abstraites

Java
Classe abstraite
C’est une classe qu’on ne peut instancier
Les constructeurs peuvent donc être supprimés

H I ©
U
Si on déclare la classe Personne abstraite EL
M O
E L
public abstract class Personne
f
{
...
c h re
©A
}

H & H: Research and Training 62 / 84


Classe et méthode abstraites

Java
Classe abstraite
C’est une classe qu’on ne peut instancier
Les constructeurs peuvent donc être supprimés

H I ©
U
Si on déclare la classe Personne abstraite EL
M O
E L
public abstract class Personne
f
{
...
c h re
©A
}

Tout ce code sera souligné en rouge


Personne personne = new Personne();
...
Personne personne2 = new Personne(2, "bob", "mike");
H & H: Research and Training 62 / 84
Classe et méthode abstraites

Java
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe
abstraite
H I ©
U EéeLpar les classes filles
Une méthode abstraite doit être implément
de la classe abstraite
L MO
r e f E
A ch
©

H & H: Research and Training 63 / 84


Classe et méthode abstraites

Java
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe
abstraite
H I ©
U EéeLpar les classes filles
Une méthode abstraite doit être implément
de la classe abstraite
L MO
r e f E
ch abstraite afficherDetails() dans
Déclarons une méthode
Personne © A
public abstract void afficherDetails();

H & H: Research and Training 63 / 84


Classe et méthode abstraites

Java
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe
abstraite
H I ©
U EéeLpar les classes filles
Une méthode abstraite doit être implément
de la classe abstraite
L MO
r e f E
ch abstraite afficherDetails() dans
Déclarons une méthode
Personne © A
public abstract void afficherDetails();

Suite à la déclaration de afficherDetails() dans Personne, les


deux classes Etudiant et Enseignant sont signalées en rouge
H & H: Research and Training 63 / 84
Classe et méthode abstraites

Pour implémenter la méthode abstraite


Placer le curseur sur le nom de la classe
Dans le menu afficher, choisir Add unimplemented methods

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 64 / 84


Classe et méthode abstraites

Pour implémenter la méthode abstraite


Placer le curseur sur le nom de la classe
Dans le menu afficher, choisir Add unimplemented methods

Le code généré
@Override
public void afficherDetails() {
H I ©
EL
// TODO Auto-generated method stub
}
O U
f E LM
ch r e
©A

H & H: Research and Training 64 / 84


Classe et méthode abstraites

Pour implémenter la méthode abstraite


Placer le curseur sur le nom de la classe
Dans le menu afficher, choisir Add unimplemented methods

Le code généré
@Override
public void afficherDetails() {
H I ©
EL
// TODO Auto-generated method stub
}
O U
Dans Enseignant
f E LM
@Override
ch r e
©A
public void afficherDetails() {
System.out.println(getPrenom() + " " + getNom() + " " + salaire);
}

H & H: Research and Training 64 / 84


Classe et méthode abstraites

Pour implémenter la méthode abstraite


Placer le curseur sur le nom de la classe
Dans le menu afficher, choisir Add unimplemented methods

Le code généré
@Override
public void afficherDetails() {
H I ©
EL
// TODO Auto-generated method stub
}
O U
Dans Enseignant
f E LM
@Override
ch r e
©A
public void afficherDetails() {
System.out.println(getPrenom() + " " + getNom() + " " + salaire);
}

Dans Etudiant
@Override
public void afficherDetails() {
System.out.println(getPrenom() + " " + getNom() + " " + niveau);
}

H & H: Research and Training 64 / 84


Classe et méthode abstraites

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
H I ©
"jonas", 1700);
UEL
enseignant.afficherDetails();
O
f E LM
ch r e
©A

H & H: Research and Training 65 / 84


Classe et méthode abstraites

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
H I ©
"jonas", 1700);
UEL
enseignant.afficherDetails();
O
f E LM
r e
ch est :
En exécutant, leArésultat
©
jonas green 1700

H & H: Research and Training 65 / 84


Classe et méthode finales

Java
Classe finale

C’est une classe qui ne peut avoir de classes filles

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 66 / 84


Classe et méthode finales

Java
Classe finale

C’est une classe qui ne peut avoir de classes filles

Pour tester
H I ©
EL
Commençons par mettre en commentaire afficherNomComplet() dans les trois
U
classes Personne, Enseignant et Etudiant
O
f E LM
ch r e
©A

H & H: Research and Training 66 / 84


Classe et méthode finales

Java
Classe finale

C’est une classe qui ne peut avoir de classes filles

Pour tester
H I ©
EL
Commençons par mettre en commentaire afficherNomComplet() dans les trois
U
classes Personne, Enseignant et Etudiant
O
f E LM
r e
Déclarons la classe Personne finale
h
cPersonne
© A
public final class
...
{

H & H: Research and Training 66 / 84


Classe et méthode finales

Java
Classe finale

C’est une classe qui ne peut avoir de classes filles

Pour tester
H I ©
EL
Commençons par mettre en commentaire afficherNomComplet() dans les trois
U
classes Personne, Enseignant et Etudiant
O
f E LM
r e
Déclarons la classe Personne finale
h
cPersonne
© A
public final class
...
{

Les deux classes filles sont affichées en rouge

The type Enseignant cannot subclass the final class Personne

H & H: Research and Training 66 / 84


Classe et méthode finales

Java
Méthode finale

C’est une méthode qu’on ne peut redéfinir

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 67 / 84


Classe et méthode finales

Java
Méthode finale

C’est une méthode qu’on ne peut redéfinir

Pour tester
H I ©
EL
Commençons par supprimer le mot-clé final dans la classe Personne
U
O
f E LM
ch r e
©A

H & H: Research and Training 67 / 84


Classe et méthode finales

Java
Méthode finale

C’est une méthode qu’on ne peut redéfinir

Pour tester
H I ©
EL
Commençons par supprimer le mot-clé final dans la classe Personne

M OU
f E L
Ajoutons une méthode finale afficherNomComplet() dans Personne

chr e
public final void afficherNomComplet() {

© A
System.out.println(this.getPrenom() + " " + this.getNom());

H & H: Research and Training 67 / 84


Classe et méthode finales

Java
Méthode finale

C’est une méthode qu’on ne peut redéfinir

Pour tester
H I ©
EL
Commençons par supprimer le mot-clé final dans la classe Personne

M OU
f E L
Ajoutons une méthode finale afficherNomComplet() dans Personne

chr e
public final void afficherNomComplet() {

© A
System.out.println(this.getPrenom() + " " + this.getNom());

Si on essaye de redéfinir cette méthode dans Enseignant

Cannot override the final method from Personne

H & H: Research and Training 67 / 84


Classe et méthode finales

Java

Remarques

H I ©
Une classe abstraite ne doit pas forcément contenir une méthode
abstraite
U EL
M O
Une classe finale ne doit pasLforcément contenir une méthode
finale
r e f E
A ch ne doit pas forcément être dans une classe
finale
©
Une méthode finale

H & H: Research and Training 68 / 84


Interface

Java

En Java H I ©
UEL
O
Une classe ne peut hériter que d’une seule classe

f E LM
ch r e
Mais elle peut hériter de plusieurs interfaces

©A

H & H: Research and Training 69 / 84


Interface

Java

Une interface
déclarée avec le mot-clé interface

H I ©
comme une classe abstraite (impossible de l’instancier) dont :
EL
OU
toutes les méthodes sont abstraites
M
E L
tous les attributs sont constants
f
ch e
r : toute classe qui hérite d’une interface
doit impl©
A
un protocole, un contrat
émenter toutes ses méthodes
pouvant proposée une implémentation par défaut pour les
méthodes en utilisant le mot-clé default

H & H: Research and Training 70 / 84


Interface

Java

Pour créer une interface sous Eclipse


H I ©
Aller dans File > New > Interface
UEL
O
f E LM
Saisir org.eclipse.interfaces dans Package name

r e
Saisir IMiseEnForme dans Name
ch
Valider ©A

H & H: Research and Training 71 / 84


Interface

Java
Contenu généré de l’interface IMiseEnForme
package org.eclipse.interfaces;

public interface IMiseEnForme {

H I ©
}
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 72 / 84


Interface

Java
Contenu généré de l’interface IMiseEnForme
package org.eclipse.interfaces;

public interface IMiseEnForme {

H I ©
}
EL
M OU
Définissons la signature de E
f L méthodes dans l’interface
deux
IMiseEnForme
c hr e
© A
package org.eclipse.interfaces;

public interface IMiseEnForme {


public void afficherNomMajuscule();
public void afficherPrenomMajuscule();
}
H & H: Research and Training 72 / 84
Interface

Java

Pour hériter d’une interface, on utilise le mot-clé implements


public class Personne implements IMiseEnForme {
...
H I ©
}
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 73 / 84


Interface

Java

Pour hériter d’une interface, on utilise le mot-clé implements


public class Personne implements IMiseEnForme {
...
H I ©
}
UEL
O
f E LM
r e
La classe Personne est soulignée en rouge
ch
©A
Placer le curseur sur la classe Personne
Dans le menu affiché, sélectionner Add unimplemented
methods

H & H: Research and Training 73 / 84


Interface

Java

Le code généré
@Override
public void afficherNomMajuscule() {
// TODO Auto-generated method stub H I ©
UEL
O
}
f E LM
@Override
ch r e
©A
public void afficherPrenomMajuscule() {
// TODO Auto-generated method stub

H & H: Research and Training 74 / 84


Interface

Java

Modifions le code de deux méthodes générées


@Override
public void afficherNomMajuscule() {
H I ©
System.out.println(nom.toUpperCase());
UEL
}
O
f E LM
@Override
ch r e
©A
public void afficherPrenomMajuscule() {
System.out.println(prenom.toUpperCase());

H & H: Research and Training 75 / 84


Interface

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
"jonas", 1700);
H I ©
enseignant.afficherNomMajuscule();
UEL
enseignant.afficherPrenomMajuscule(); O
f E LM
ch r e
©A

H & H: Research and Training 76 / 84


Interface

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
"jonas", 1700);
H I ©
enseignant.afficherNomMajuscule();
UEL
enseignant.afficherPrenomMajuscule(); O
f E LM
ch r e
©A
En exécutant, le résultat est :
GREEN
JONAS

H & H: Research and Training 76 / 84


Interface

Java
Définissons un attribut i dans l’interface IMiseEnForme
package org.eclipse.interfaces;

public interface IMiseEnForme {


H I ©
EL
OU
int i = 5;

L M
f E
public void afficherNomMajuscule();
e
chr
public void afficherPrenomMajuscule();
A
} ©

H & H: Research and Training 77 / 84


Interface

Java
Définissons un attribut i dans l’interface IMiseEnForme
package org.eclipse.interfaces;

public interface IMiseEnForme {


H I ©
EL
OU
int i = 5;

L M
f E
public void afficherNomMajuscule();
e
chr
public void afficherPrenomMajuscule();
A
} ©

L’attribut i est, par définition static et final


H & H: Research and Training 77 / 84
Interface

Java
Il est possible de définir une implémentation par défaut pour une
méthode d’interface (depuis Java 8)
package org.eclipse.interfaces;

public interface IMiseEnForme {


H I ©
int i = 5;
U EL
M O
f E L afficherNomMajuscule() {
default public void

c h re
System.out.println("Doe");

© A void afficherPrenomMajuscule();
}
public
}

H & H: Research and Training 78 / 84


Interface

Java
Il est possible de définir une implémentation par défaut pour une
méthode d’interface (depuis Java 8)
package org.eclipse.interfaces;

public interface IMiseEnForme {


H I ©
int i = 5;
U EL
M O
f E L afficherNomMajuscule() {
default public void

c h re
System.out.println("Doe");

© A void afficherPrenomMajuscule();
}
public
}

Remarque
Les classes filles ne sont pas dans l’obligation d’implémenter les
méthodes d’une interface ayant une implémentation par défaut
H & H: Research and Training 78 / 84
Interface

Java

Remarques

Une interface peut hériter de plusieurs autres interfaces (mais pas


d’une classe)
H I ©
E
Pour cela, il faut utiliser le mot-clé extends
U L
et pas implements

L MO
car une interface n’implémente jamais de méthodes.

r e f E
A ch
©

H & H: Research and Training 79 / 84


Interface

Java

Remarques

Une interface peut hériter de plusieurs autres interfaces (mais pas


d’une classe)
H I ©
E
Pour cela, il faut utiliser le mot-clé extends
U L
et pas implements

L MO
car une interface n’implémente jamais de méthodes.

r e f E
A ch
©
Question : une interface est-elle vraiment une classe abstraite ?
Non, car toute classe abstraite hérite de la classe Object mais une
interface non

H & H: Research and Training 79 / 84


Énumération

Java

Énumération

est un ensemble de constantes

introduit depuis Java 5

H I ©
EL
peut être déclarée, dans une fichier toute seule, dans une classe ou dans une interface

O U
f E LM
ch r e
©A

H & H: Research and Training 80 / 84


Énumération

Java

Énumération

est un ensemble de constantes

introduit depuis Java 5

H I ©
EL
peut être déclarée, dans une fichier toute seule, dans une classe ou dans une interface

O U
f E LM
ch r e
©A
Pour créer une énumération sous Eclipse

Aller dans File > New > Enum

Saisir org.eclipse.enums dans Package name

Saisir Sport dans Name

Valider

H & H: Research and Training 80 / 84


Énumération

Java
Le code généré
package org.eclipse.enums;

public enum Sport {

}
H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 81 / 84


Énumération

Java
Le code généré
package org.eclipse.enums;

public enum Sport {

}
H I ©
UEL
MO
Ajoutons des constantes à cette énumération Sport
L
f
package org.eclipse.enums;
r e E
A ch{
public enum Sport
©
FOOT,
RUGBY,
TENNIS,
CROSS_FIT,
BASKET
}

H & H: Research and Training 81 / 84


Énumération

Java

Pour utiliser cette énumération dans la classe Main


Sport sport = Sport.BASKET;
H I ©
System.out.println(sport); // affiche BASKET
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 82 / 84


Énumération

Java

Pour utiliser cette énumération dans la classe Main


Sport sport = Sport.BASKET;
H I ©
System.out.println(sport); // affiche BASKET
UEL
O
f E LM
ch r e
N’oublions pas d’importer l’énumération dans la classe Main
©A
import org.eclipse.enums.Sport;

H & H: Research and Training 82 / 84


Énumération

Java
On peut aussi définir une énumération comme une classe avec un ensemble
d’attributs et de méthodes
public enum Sport {

FOOT("foot", 1),
RUGBY("rugby", 7),
H I ©
TENNIS("tennis", 3),
UEL
CROSS_FIT("cross_fit", 4),
O
BASKET("basket", 6) ;
private final String nom;
f E LM
private final int code;
ch r e
©A
Sport(String nom, int code) {
this.nom = nom;
this.code = code;
}
public String getNom(){ return this.nom; }
public int getCode(){ return this.code; }
};

H & H: Research and Training 83 / 84


Énumération

Java
Récupérer la valeur de l’attribut code de la constante BASKET
Sport sport = Sport.BASKET;
System.out.println(sport.getCode());
// affiche 6

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 84 / 84


Énumération

Java
Récupérer la valeur de l’attribut code de la constante BASKET
Sport sport = Sport.BASKET;
System.out.println(sport.getCode());
// affiche 6

H I ©
EL
OU
Récupérer l’indice de la constante BASKET dans l’énumération
M
Sport sport = Sport.BASKET;L
r e f E
ch ici 4
System.out.println(sport.ordinal());
A
// affiche l’indice
©

H & H: Research and Training 84 / 84


Énumération

Java
Récupérer la valeur de l’attribut code de la constante BASKET
Sport sport = Sport.BASKET;
System.out.println(sport.getCode());
// affiche 6

H I ©
EL
OU
Récupérer l’indice de la constante BASKET dans l’énumération
M
Sport sport = Sport.BASKET;L
r e f E
ch ici 4
System.out.println(sport.ordinal());
A
// affiche l’indice
©
Transformer l’énumération en tableau et récupérer l’élément d’indice 2
System.out.println(Sport.values()[2]);
// affiche Tennis

H & H: Research and Training 84 / 84

Vous aimerez peut-être aussi