Vous êtes sur la page 1sur 148

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 / 76


Plan
1 Rappel
2 Classe
La méthode toString()
Le setter
Le getter
Le constructeur
Les attributs et méthodes statiques
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 2 / 76
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
I c
E
Elle représente un ensemble d’objets ayant lesH
L mêmes propriétés
statiques (attributs) et dynamiques O U
L M (méthodes)
r e E
f d’instance
Qu’est ce que c’est lah
A c notion ?
c correspond à un objet créé à partir d’une classe (via
Une instance
le constructeur)

H & H: Research and Training 3 / 76


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
I c
E
Elle représente un ensemble d’objets ayant lesH
L mêmes propriétés
statiques (attributs) et dynamiques O U
L M (méthodes)
r e E
f d’instance
Qu’est ce que c’est lah
A c notion ?
c correspond à un objet créé à partir d’une classe (via
Une instance
le constructeur)
L’instanciation : création d’un objet d’une classe

H & H: Research and Training 3 / 76


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
I c
E
Elle représente un ensemble d’objets ayant lesH
L mêmes propriétés
statiques (attributs) et dynamiques O U
L M (méthodes)
r e E
f d’instance
Qu’est ce que c’est lah
A c notion ?
c correspond à un objet créé à partir d’une classe (via
Une instance
le constructeur)
L’instanciation : création d’un objet d’une classe
instance ≡ objet

H & H: Research and Training 3 / 76


Rappel

Java

De quoi est composé une classe ?

NomClasse

I c

les attributs
ELH
U
L MO
r e f E
les méthodes

ch
c A

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 4 / 76


Classe

Java

Particularité du Java
Toutes les classes héritent implicitement (pas besoin d’ajouter
extends) d’une classe mère Object. I c
H
EL telles que
La classe Object contient plusieurs mU éthodes
toString() (pour transformerM
O
fE L un objet en chaı̂ne de caractère),

h r e
clone() (pour cloner)...
c permet de désigner l’objet courant.
c A
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 5 / 76


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 I c

H
EL file puis
U
Décocher la case Create module-info.java
cliquer sur Finish
L MO
h r e fE
A c
c

H & H: Research and Training 6 / 76


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 I c

H
EL file puis
U
Décocher la case Create module-info.java
cliquer sur Finish
L MO
h r e fE
A c org.eclipse.test et
c
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 6 / 76
Classe

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

I c

H
Une classe Main dans org.eclipse.test contenant le
EL
U
public static void main dans lequel on instanciera la
classe Personne
L MO
f E
chre
c A

H & H: Research and Training 7 / 76


Classe

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

I c

H
Une classe Main dans org.eclipse.test contenant le
EL
U
public static void main dans lequel on instanciera la
classe Personne
L MO
f E
A c hre
c
Créons les classes

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 7 / 76
Classe

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

public class Personne {


int num;
I c

String nom;
String prenom;
ELH
U
MO
}

f E L
hre
Remarques

A c
c
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 8 / 76


Classe

Java

Nouveau contenu de la classe Personne

I c

package org.eclipse.model;
ELH
U
public class Personne {
L MO
public int num;
f E
public String nom;
chre
} c A
public String prenom;

H & H: Research and Training 9 / 76


Classe

Java

Contenu de la classe Main


package org.eclipse.test;
I c

ELH
public class Main {
U
L MO
f E
public static void main(String[] args) {
chre
// TODO Auto-generated method stub

}
c A

}

H & H: Research and Training 10 / 76


Classe

Java
Hypothèse

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


valeurs 1, wick et john
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 11 / 76


Classe

Java
Hypothèse

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


valeurs 1, wick et john
I c

EéLé)H
U
Étape 1 : déclaration d’un objet (objet non cr
L MO
fE
Personne personne;

c h r e
c A

H & H: Research and Training 11 / 76


Classe

Java
Hypothèse

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


valeurs 1, wick et john
I c

EéLé)H
U
Étape 1 : déclaration d’un objet (objet non cr
L MO
fE
Personne personne;

h r e
c de la classe Personne (objet créé)
c A
Étape 2 : instanciation
personne = new Personne();

H & H: Research and Training 11 / 76


Classe

Java
Hypothèse

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


valeurs 1, wick et john
I c

EéLé)H
U
Étape 1 : déclaration d’un objet (objet non cr
L MO
fE
Personne personne;

h r e
c de la classe Personne (objet créé)
c A
Étape 2 : instanciation
personne = new Personne();

On peut faire déclaration + instanciation


Personne personne = new Personne();

H & H: Research and Training 11 / 76


Classe

Java

Affectons les valeurs aux différents attributs


personne.num = 1;
I c

personne.nom = "wick";
ELH
personne.prenom = "john";
U
L MO
f E
chre
c A

H & H: Research and Training 12 / 76


Classe

Java

Affectons les valeurs aux différents attributs


personne.num = 1;
I c

personne.nom = "wick";
ELH
personne.prenom = "john";
U
L MO
f E
chre
c A
Pour être sûr que les valeurs ont bien été affectées aux attributs,
on affiche
System.out.println(personne)

H & H: Research and Training 12 / 76


Classe

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new U
Personne();
L M
E
personne.num = 1;
ref= "wick";
personne.nom
A c h
personne.prenom = "john";
c
System.out.println(personne);
}
}

H & H: Research and Training 13 / 76


Classe

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new U
Personne();
L M
E
personne.num = 1;
ref= "wick";
personne.nom
A c h
personne.prenom = "john";
c
System.out.println(personne);
}
}

En exécutant, le résultat est :


org.eclipse.model.Personne@7852e922
H & H: Research and Training 13 / 76
Classe La méthode toString()

Java
Explication

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


toString() soit implémentée
I c

H
Pour la générer, clic droit sur la classe Personne, aller dans
EL
U
source > Generate toString()..., sélectionner les
champs à afficher puis valider.
L MO
f E
chre
c A

H & H: Research and Training 14 / 76


Classe La méthode toString()

Java
Explication

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


toString() soit implémentée
I c

H
Pour la générer, clic droit sur la classe Personne, aller dans
EL
U
source > Generate toString()..., sélectionner les
champs à afficher puis valider.
L MO
f E
A chre
Le code de la méthode toString()

@Override
c
public String toString() {
return "Personne [num=" + num + ", nom=" + nom +
", prenom=" + prenom + "]";
}

H & H: Research and Training 14 / 76


Classe La méthode toString()

Java

@Override

I c
Une annotation (appelé aussi décorateur par MicroSoft)

H
EL qui appartient à
Pour nous rappeler qu’on redéfinit une méthode
U
MO
la classe mère (ici Object)

fE L
c h r e
c A

H & H: Research and Training 15 / 76


Classe La méthode toString()

Java

@Override

I c
Une annotation (appelé aussi décorateur par MicroSoft)

H
EL qui appartient à
Pour nous rappeler qu’on redéfinit une méthode
U
MO
la classe mère (ici Object)

fE L
c h r e
c A
En exécutant, le résultat est :
Personne [num=1, nom=wick, prenom=john]

H & H: Research and Training 15 / 76


Classe Le setter

Java
Hypothèse

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

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 16 / 76


Classe Le setter

Java
Hypothèse

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

I c
Démarche
EL H
U
1

L MO la visibilité à private)
Bloquer l’accès directe aux attributs (mettre

2
r e f E qui contrôlent l’affectation de valeurs
Définir des méthodes publiques
h
aux attributs (lescsetter)
c A

H & H: Research and Training 16 / 76


Classe Le setter

Java
Hypothèse

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

I c
Démarche
EL H
U
1

L MO la visibilité à private)
Bloquer l’accès directe aux attributs (mettre

2
r e f E qui contrôlent l’affectation de valeurs
Définir des méthodes publiques
h
aux attributs (lescsetter)
c A
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 16 / 76
Classe Le 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;
I c

private String prenom;
ELH
U
@Override
L MO
public String toString() {
f E
hre
return "Personne [num=" + num + ", nom=" + nom + ",
c
c A
prenom=" + prenom + "]";

}
}

H & H: Research and Training 17 / 76


Classe Le 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;
I c

private String prenom;
ELH
U
@Override
L MO
public String toString() {
f E
hre
return "Personne [num=" + num + ", nom=" + nom + ",
c
c 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 17 / 76


Classe Le setter

Java

Explication

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

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 18 / 76


Classe Le setter

Java

Explication

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

I c

ELH
U
Solution : générer les setters
L MO
f E
hre
Faire clic droit sur la classe Personne
c
c A

Aller dans Source > Generate Getters and Setters...
Cliquer sur chaque attribut et cocher la case
setNomAttribut(...)
Valider

H & H: Research and Training 18 / 76


Classe Le 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;
I c

public void setPrenom(String prenom) {
ELH
this.prenom = prenom;
U
}
L MO
f E
chre
c A

H & H: Research and Training 19 / 76


Classe Le 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;
I c

public void setPrenom(String prenom) {
ELH
this.prenom = prenom;
U
}
L MO
E
Modifions setNum() pour ne plus accepter de valeurs inférieures à 1
f
public void setNum(int num) {
chre
c 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 19 / 76
Classe Le setter

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new UPersonne();
L M
ref E
personne.setNum(1);
personne.setNom("wick");
c h
c A
personne.setPrenom("john");

System.out.println(personne);
}
}

H & H: Research and Training 20 / 76


Classe Le setter

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new UPersonne();
L M
ref E
personne.setNum(1);
personne.setNom("wick");
c h
c 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 20 / 76
Classe Le setter

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new UPersonne();
L M
ref E
personne.setNum(-1);
personne.setNom("wick");
c h
c A
personne.setPrenom("john");

System.out.println(personne);
}
}

H & H: Research and Training 21 / 76


Classe Le setter

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

public class Main {


I c

H
public static void main(String[]Largs) {
E
O
Personne personne = new UPersonne();
L M
ref E
personne.setNum(-1);
personne.setNom("wick");
c h
c 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 21 / 76
Classe Le getter

Java

Hypothèse

c

Si on voulait afficher les attributs (privés) de la classe Personne, un
I
ELH
par un, dans la classe Main sans passer par le toString()
U
L MO
f E
chre
c A

H & H: Research and Training 22 / 76


Classe Le getter

Java

Hypothèse

c

Si on voulait afficher les attributs (privés) de la classe Personne, un
I
ELH
par un, dans la classe Main sans passer par le toString()
U
L MO
f E
Démarche A c hre
c
Définir des méthodes qui retournent les valeurs des attributs (les
getter)

H & H: Research and Training 22 / 76


Classe Le getter

Java

Pour générer les getters


I c

Faire clic droit sur la classe Personne
E LH
Aller dans Source > Generate O U
L MGetters and Setters...
r e f Eet cocher la case
Cliquer sur chaque attribut
h
A c
getNomAttribut()
Valider c

H & H: Research and Training 23 / 76


Classe Le getter

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

I c

public static void main(String[] args) {
ELH
Personne personne = new Personne();
U
personne.setNum(1);
L MO
personne.setNom("wick");
f E
hre
personne.setPrenom("john");
c
c A
System.out.println(personne.getNum() + " " + personne.

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

H & H: Research and Training 24 / 76


Classe Le getter

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

I c

public static void main(String[] args) {
ELH
Personne personne = new Personne();
U
personne.setNum(1);
L MO
personne.setNom("wick");
f E
hre
personne.setPrenom("john");
c
c A
System.out.println(personne.getNum() + " " + personne.

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

En exécutant, le résultat est :


1 wick john

H & H: Research and Training 24 / 76


Classe Le constructeur

Java
Remarques

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


paramètre

I c

Pour simplifier la création d’objets, on peut définir un nouveau
ELH
constructeur qui prend en paramètre plusieurs attributs de la
U
classe
L MO
f E
chre
c A

H & H: Research and Training 25 / 76


Classe Le constructeur

Java
Remarques

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


paramètre

I c

Pour simplifier la création d’objets, on peut définir un nouveau
ELH
constructeur qui prend en paramètre plusieurs attributs de la
U
classe
L MO
f E
A c hre
Pour générer un constructeur avec paramètre
1
c
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 25 / 76
Classe Le constructeur

Java
Le constructeur généré
public Personne(int num, String nom, String prenom) {
super();
this.num = num;
this.nom = nom;
I c

this.prenom = prenom;
ELH
}
U
L MO
f E
chre
c A

H & H: Research and Training 26 / 76


Classe Le constructeur

Java
Le constructeur généré
public Personne(int num, String nom, String prenom) {
super();
this.num = num;
this.nom = nom;
I c
this.prenom = prenom;
EL H
}
U
L
Pour préserver la cohérence, il faut MleOconstructeur contrôle la
que
valeur de l’attribut num
h r e fE
A
public Personne(int c num, String nom, String prenom) {

super();c
if (num >= 1){
this.num = num;
}
this.nom = nom;
this.prenom = prenom;
}
H & H: Research and Training 26 / 76
Classe Le constructeur

Java

On peut aussi appelé le setter dans le constructeur

I c

public Personne(int num, String nom, String prenom)
{ ELH
U
super();
L MO
this.setNum(num);
f E
this.nom = nom;
chre
} c A
this.prenom = prenom;

H & H: Research and Training 27 / 76


Classe Le constructeur

Java

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


Personne personne = new Personne();
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 28 / 76


Classe Le constructeur

Java

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


Personne personne = new Personne();
I c

ELH
U
Explication
L MO
f E
Le constructeur par défaut a été écrasé (il n’existe plus)
chre
c A

H & H: Research and Training 28 / 76


Classe Le constructeur

Java

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


Personne personne = new Personne();
I c

ELH
U
Explication
L MO
f E
Le constructeur par défaut a été écrasé (il n’existe plus)
chre
Solution
c A

Générer un constructeur sans paramètre

H & H: Research and Training 28 / 76


Classe Le constructeur

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

public static void main(String[] args) {


I c

Personne personne = new Personne();
ELH
personne.setNum(1);
U
personne.setNom("wick");
personne.setPrenom("john");
L MO
f E
System.out.println(personne.getNum() + " " + personne.getNom()

hre
+ " " + personne.getPrenom());
c
c A
Personne personne2 = new Personne(2, "bob", "mike");

}
System.out.println(personne2);

H & H: Research and Training 29 / 76


Classe Le constructeur

Java
Mettons à jour la classe Main

package org.eclipse.test;

public class Main {

public static void main(String[] args) {


I c

Personne personne = new Personne();
ELH
personne.setNum(1);
U
personne.setNom("wick");
personne.setPrenom("john");
L MO
f E
System.out.println(personne.getNum() + " " + personne.getNom()

hre
+ " " + personne.getPrenom());
c
c A
Personne personne2 = new Personne(2, "bob", "mike");

}
System.out.println(personne2);

En exécutant, le résultat est :


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

H & H: Research and Training 29 / 76


Classe Les 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
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 30 / 76


Classe Les 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
I c

ELH
U
Hypothèse
L MO
f E
hre
Et si nous voudrions qu’un attribut ait une valeur partagée par toutes
c
les instances (le nombre d’objets instanciés de la classe Personne)
c A

H & H: Research and Training 30 / 76


Classe Les 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
I c

ELH
U
Hypothèse
L MO
f E
hre
Et si nous voudrions qu’un attribut ait une valeur partagée par toutes
c
les instances (le nombre d’objets instanciés de la classe Personne)
c 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 30 / 76


Classe Les attributs et méthodes statiques

Java

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

H & H: Research and Training 31 / 76


Classe Les attributs et méthodes statiques

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

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 32 / 76


Classe Les attributs et méthodes statiques

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

I c

H
Incrémentons notre compteur de personnes dans les constructeurs
EL
U
MO
public Personne() {
super();
nbrPersonnes++;
f E L
}
chre
super(); c A
public Personne(int num, String nom, String prenom) {

this.setNum(num);
this.nom = nom;
this.prenom = prenom;
nbrPersonnes++;
}

H & H: Research and Training 32 / 76


Classe Les attributs et méthodes statiques

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

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 33 / 76


Classe Les 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


I c

Personne personne = new Personne();
ELH
personne.setNum(1);
U
MO
personne.setNom("wick");
personne.setPrenom("john");

f E L
System.out.println(personne.getNum() + " " +personne.getNom() + " " +
personne.getPrenom());
chre
c A
System.out.println(Personne.getNbrPersonnes());


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

H & H: Research and Training 33 / 76


Classe Les 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


I c

Personne personne = new Personne();
ELH
personne.setNum(1);
U
MO
personne.setNom("wick");
personne.setPrenom("john");

f E L
System.out.println(personne.getNum() + " " +personne.getNom() + " " +
personne.getPrenom());
chre
c A
System.out.println(Personne.getNbrPersonnes());


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 33 / 76
Classe Les 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
I c

H
Définir un constructeur avec trois paramètres, les getters, les
EL
setters et la méthode toString() U
Oattribut adresse de type
L Mun
f E constructeur à quatre paramètres
Dans la classe Personne, ajouter
Adresse et définir run
h e nouveau
A
et le getter et lecsetter de ce nouvel attribut
c
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 34 / 76


Associations particulières entre classes Héritage

Java

I c

L’héritage, quand ?
H
ELplusieurs attributs
U
MO
Lorsque deux ou plusieurs classes partagent
(et méthodes)
fE L
c h
Lorsqu’une Classe1 r eest une sorte de Classe2
c A

H & H: Research and Training 35 / 76


Associations particulières entre classes Héritage

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

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 36 / 76


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 I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 36 / 76


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 I c

H
ELune sorte de
U
Sémantiquement, enseignant et étudiant sont
personne
L MO
h r e fE
A c
c

H & H: Research and Training 36 / 76


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 I c
H
ELune sorte de
U
Sémantiquement, enseignant et étudiant sont
personne
L MO
h r e f E plusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom c
c

H & H: Research and Training 36 / 76


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 I c
H
ELune sorte de
U
Sémantiquement, enseignant et étudiant sont
personne
L MO
h r e f E plusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom c
c
Donc, on peut mettre en commun les attributs numéro, nom et
prénom dans une classe Personne

H & H: Research and Training 36 / 76


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 I c
H
ELune sorte de
U
Sémantiquement, enseignant et étudiant sont
personne
L MO
h r e f E plusieurs attributs tels que numéro,
En plus, les deux partagent
A
nom et prénom c
c
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 36 / 76


Associations particulières entre classes Héritage

Java

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

H & H: Research and Training 37 / 76


Associations particulières entre classes Héritage

Java

Créons les classes Etudiant et Enseignant


Aller dans File > New > Class
I c

Choisir le package org.eclipse.model
ELH
U
Saisir le nom de la classe
L MO
f E
A c
puis sélectionner Personne hre
Dans la section Superclass, cliquer sur Browse et chercher

c
Cliquer sur Ok et enfin Finish
Refaire la même chose pour la seconde classe

H & H: Research and Training 38 / 76


Associations particulières entre classes Héritage

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

public class Enseignant extends Personne {


I c

}
ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 39 / 76


Associations particulières entre classes Héritage

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

public class Enseignant extends Personne {


I c

}
ELH
U
L MO
Contenu de la classe Etudiant f E
c hre
c A
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 39 / 76
Associations particulières entre classes Héritage

Java

Ensuite
I c

E H
L puis générer
Créer un attribut niveau dans la classe Etudiant
U
les getter et setter
L MO
e f Edans la classe Enseignant puis
Créer un attribut salaire
h r
A c et setter
générer les getter
c

H & H: Research and Training 40 / 76


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");
I c

enseignant.setPrenom("jonas");
ELH
enseignant.setSalaire(1700);
U
System.out.println(enseignant);
L MO
f E
c hre
c A

H & H: Research and Training 41 / 76


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");
I c

enseignant.setPrenom("jonas");
ELH
enseignant.setSalaire(1700);
U
System.out.println(enseignant);
L MO
f E
reest :
c h
En exécutant, le résultat
A nom=green, prenom=jonas]
Personne c
[num=3,

H & H: Research and Training 41 / 76


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");
I c

enseignant.setPrenom("jonas");
ELH
enseignant.setSalaire(1700);
U
System.out.println(enseignant);
L MO
f E
reest :
c h
En exécutant, le résultat
A nom=green, prenom=jonas]
Personne c
[num=3,

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 41 / 76
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 + "]";
} I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 42 / 76


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 + "]";
} I c
EL H
O U
Pour appeler le toString() deLlaM
classe mère à partir de classe
fille (Enseignant)
h r e fE
@Overridec A
c

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 42 / 76
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...

I c

Dans Select super constructor to invoke, sélectionner le constructeur à trois
paramètres
ELH
U
MO
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée
et valider

f E L
c hre
c A

H & H: Research and Training 43 / 76


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...

I c

Dans Select super constructor to invoke, sélectionner le constructeur à trois
paramètres
ELH
U
MO
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée
et valider

f E L
c hre
c A
Le constructeur généré


public Enseignant(int num, String nom, String prenom, int salaire) {
super(num, nom, prenom);
this.salaire = salaire;
}

H & H: Research and Training 43 / 76


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...

I c

Dans Select super constructor to invoke, sélectionner le constructeur à trois
paramètres
ELH
U
MO
Dans Select fields to initialize, vérifier que la case salaire est sélectionnée
et valider

f E L
c hre
c A
Le constructeur généré


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 43 / 76


Associations particulières entre classes Héritage

Java

À partir de la classe Enseignant

I c
H
On ne peut avoir accès direct à un attribut de la classe mère
ELles attributs ont une
U
MO
C’est-à-dire, on ne peut faire this.num car
visibilité private L
fd’unEattribut privé de la classe mère, il faut
Pour modifier la valeur
c h r e
c A
les getters/setters
soit utiliser
soit mettre la visibilité des attributs de la classe mère à protected

H & H: Research and Training 44 / 76


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);

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 45 / 76


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);

I c

ELH
U
MO
Ou ainsi

f E L
Personne enseignant = new Enseignant(3, "green", "
jonas", 1700);
c hre
c A

H & H: Research and Training 45 / 76


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);

I c

ELH
U
MO
Ou ainsi

f E L
Personne enseignant = new Enseignant(3, "green", "
jonas", 1700);
c hre
c A

Ceci est faux
Enseignant enseignant = new Personne(3, "green", "
jonas");

H & H: Research and Training 45 / 76


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

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 46 / 76


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

I c

EL H
Exemple U
L MO
jonas", 1700); ef
r E
Personne enseignant = new Enseignant(3, "green", "

A c h
System.out.println(enseignant instanceof Enseignant)
; c
// affiche true
System.out.println(enseignant instanceof Personne);
// affiche true
System.out.println(personne instanceof Enseignant);
// affiche false
H & H: Research and Training 46 / 76
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.
I c

2

ELH
Parcourir le tableau et afficher pour chacun soit le salaire soit le
niveau
U
L MO
f E
c hre
c A

H & H: Research and Training 47 / 76


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.
I c

2

ELH
Parcourir le tableau et afficher pour chacun soit le salaire soit le
niveau
U
L MO
f E
re on peut utiliser le raccourci de for
Pour parcourir unc h
tableau,
A [] = { personne, personne2,
Personne cpersonnes
enseignant };
for(Personne perso : personnes) {
System.out.println(perso);
}

H & H: Research and Training 47 / 76


Associations particulières entre classes Agrégation et composition

Java

L’agrégation

C’est une association non-symétrique


I c

Elle représente une relation de type ensemble/élément
ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 48 / 76


Associations particulières entre classes Agrégation et composition

Java

L’agrégation

C’est une association non-symétrique


I c

Elle représente une relation de type ensemble/élément
ELH
U
L MO
f E
La composition
A c hre
c
agrégation forte
C’est une
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 48 / 76


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
I c

ELH
U
L MO
f E
c hre
Moteur c A
Chssis

num id
poids matière

H & H: Research and Training 49 / 76


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() {
I c

return id;
ELH
} U
public void setId(int id) {
L MO
this.id = id;
f E
}
c hre
c A
public String getMatiere() {

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

H & H: Research and Training 50 / 76


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() {
I c

return num;
ELH
} U
public void setNum(int num) {
L MO
this.num = num;
f E
}
c hre
c A
public float getPoids() {

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

H & H: Research and Training 51 / 76


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;
I c

}
ELH
public void setMoteur(Moteur moteur) {
U
}
this.moteur = moteur;
L MO
f E
hre
}

c
c A

H & H: Research and Training 52 / 76


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;
I c

}
ELH
public void setMoteur(Moteur moteur) {
U
}
this.moteur = moteur;
L MO
f E
hre
}

c
Explication c 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 52 / 76


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();
I c

chassis.setId(100);
ELH
chassis.setMatiere("fer");
U
Vehivule vehivule = new Vehivule(chassis);
L MO
Moteur moteur = new Moteur();
f E
moteur.setNum(100);
c hre
c 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 53 / 76


Classe et méthode abstraites

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

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 54 / 76


Classe et méthode abstraites

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

ELH
U
MO{
Si on déclare la classe Personne abstraite

fE
public abstract class Personne L
...
c h r e
}
c A

H & H: Research and Training 54 / 76


Classe et méthode abstraites

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

ELH
U
MO{
Si on déclare la classe Personne abstraite

fE
public abstract class Personne L
...
c h r e
}
c A
Tout ce code sera souligné en rouge
Personne personne = new Personne();
...
Personne personne2 = new Personne(2, "bob", "mike");
H & H: Research and Training 54 / 76
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
I c
H
EéeLpar les classes filles
U
Une méthode abstraite doit être implément
de la classe abstraite
L MO
h r e fE
A c
c

H & H: Research and Training 55 / 76


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
I c
H
EéeLpar les classes filles
U
Une méthode abstraite doit être implément
de la classe abstraite
L MO
h r e fE
c abstraite afficherDetails() dans
c A
Déclarons une méthode
Personne
public abstract void afficherDetails();

H & H: Research and Training 55 / 76


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
I c
H
EéeLpar les classes filles
U
Une méthode abstraite doit être implément
de la classe abstraite
L MO
h r e fE
c abstraite afficherDetails() dans
c A
Déclarons une méthode
Personne
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 55 / 76
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

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 56 / 76


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() {
I c

// TODO Auto-generated method stub
ELH
}
U
L MO
f E
c hre
c A

H & H: Research and Training 56 / 76


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() {
I c

// TODO Auto-generated method stub
ELH
}
U
L MO
Dans Enseignant
f E
@Override
c hre
c A
public void afficherDetails() {

}
System.out.println(getPrenom() + " " + getNom() + " " + salaire);

H & H: Research and Training 56 / 76


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() {
I c

// TODO Auto-generated method stub
ELH
}
U
L MO
Dans Enseignant
f E
@Override
c hre
c 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 56 / 76


Classe et méthode abstraites

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
I c

"jonas", 1700);
ELH
U
MO
enseignant.afficherDetails();

f E L
c hre
c A

H & H: Research and Training 57 / 76


Classe et méthode abstraites

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
I c

"jonas", 1700);
ELH
U
MO
enseignant.afficherDetails();

f E L
A c
En exécutant, le résultat est :
hre
c
jonas green 1700

H & H: Research and Training 57 / 76


Classe et méthode finales

Java
Classe finale

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

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 58 / 76


Classe et méthode finales

Java
Classe finale

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

Pour tester
I c
H
EL dans les trois
Commençons par mettre en commentaire afficherNomComplet()
U
MO
classes Personne, Enseignant et Etudiant
L
h r e fE
A c
c

H & H: Research and Training 58 / 76


Classe et méthode finales

Java
Classe finale

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

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

H & H: Research and Training 58 / 76


Classe et méthode finales

Java
Classe finale

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

Pour tester
I c
H
EL dans les trois
Commençons par mettre en commentaire afficherNomComplet()
U
MO
classes Personne, Enseignant et Etudiant
L
h r e
Déclarons la classe Personne fE
finale
A cPersonne {
c
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 58 / 76


Classe et méthode finales

Java
Méthode finale

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

I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 59 / 76


Classe et méthode finales

Java
Méthode finale

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

Pour tester
I c

H
ELPersonne
Commençons par supprimer le mot-clé final dans la classe
U
L MO
h r e fE
A c
c

H & H: Research and Training 59 / 76


Classe et méthode finales

Java
Méthode finale

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

Pour tester
I c

H
ELPersonne
Commençons par supprimer le mot-clé final dans la classe
O U
L M
r e f E
Ajoutons une méthode finale afficherNomComplet() dans Personne

A ch
public final void afficherNomComplet() {

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

H & H: Research and Training 59 / 76


Classe et méthode finales

Java
Méthode finale

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

Pour tester
I c

H
ELPersonne
Commençons par supprimer le mot-clé final dans la classe
O U
L M
r e f E
Ajoutons une méthode finale afficherNomComplet() dans Personne

A ch
public final void afficherNomComplet() {

c
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 59 / 76


Classe et méthode finales

Java

Remarques
I c
H
Une classe abstraite ne doit pas forcément contenir une méthode
EL
abstraite U
O contenir une méthode
Mément
Une classe finale ne doit pasLforc
finale
h r e fE
c
Une m
finale
c Afinale ne doit pas forcément être dans une classe
éthode

H & H: Research and Training 60 / 76


Interface

Java

I c

En Java
E L H
U
MOseule classe
Une classe ne peut hériter que d’une
L
Mais elle peut hériterede
r E interfaces
f plusieurs
A c h
c

H & H: Research and Training 61 / 76


Interface

Java

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

EL H
comme une classe abstraite (impossible de l’instancier) dont :

O
toutes les méthodes sont abstraites U
L M
h r e fE
tous les attributs sont constants

A
un protocole, un c contrat : toute classe qui hérite d’une interface
c
doit implé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 62 / 76


Interface

Java

Pour créer une interface sous Eclipse


I c
Aller dans File > New > Interface
EL H
U
Saisir org.eclipse.interfaces
L MOdans Package name
r e E Name
fdans
h
Saisir IMiseEnForme
c
Valider c A

H & H: Research and Training 63 / 76


Interface

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

public interface IMiseEnForme {


I c

}
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 64 / 76


Interface

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

public interface IMiseEnForme {


I c

}
ELH
U
L MO
f E
Définissons la signature de deux méthodes dans l’interface
IMiseEnForme
chre
c A

package org.eclipse.interfaces;

public interface IMiseEnForme {


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

Java

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


public class Personne implements IMiseEnForme {
...
I c

}
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 65 / 76


Interface

Java

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


public class Personne implements IMiseEnForme {
...
I c

}
ELH
U
L MO
f E
hre
La classe Personne est soulignée en rouge
c
c A

Placer le curseur sur la classe Personne
Dans le menu affiché, sélectionner Add unimplemented
methods

H & H: Research and Training 65 / 76


Interface

Java

Le code généré
@Override
public void afficherNomMajuscule() {
I c

// TODO Auto-generated method stub
ELH
U
}
L MO
f E
@Override chre
c A

public void afficherPrenomMajuscule() {
// TODO Auto-generated method stub

H & H: Research and Training 66 / 76


Interface

Java

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


@Override
public void afficherNomMajuscule() {
I c

System.out.println(nom.toUpperCase());
ELH
U
}
L MO
f E
@Override
chre
c A
public void afficherPrenomMajuscule() {

System.out.println(prenom.toUpperCase());

H & H: Research and Training 67 / 76


Interface

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
"jonas", 1700); I c

enseignant.afficherNomMajuscule();
ELH
U
enseignant.afficherPrenomMajuscule();
L MO
f E
chre
c A

H & H: Research and Training 68 / 76


Interface

Java

Pour tester
Enseignant enseignant = new Enseignant(3, "green",
"jonas", 1700); I c

enseignant.afficherNomMajuscule();
ELH
U
enseignant.afficherPrenomMajuscule();
L MO
f E
chre
c A

En exécutant, le résultat est :
GREEN
JONAS

H & H: Research and Training 68 / 76


Interface

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

public interface IMiseEnForme {


I c

ELH
int i = 5;
U
L MO
f E
public void afficherNomMajuscule();
chre
public void afficherPrenomMajuscule();

}
c A

H & H: Research and Training 69 / 76


Interface

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

public interface IMiseEnForme {


I c

ELH
int i = 5;
U
L MO
f E
public void afficherNomMajuscule();
chre
public void afficherPrenomMajuscule();

}
c A

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


H & H: Research and Training 69 / 76
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 { I c


int i = 5;
EL H
O U
L MafficherNomMajuscule()
re f E
default public void
System.out.println("Doe");
{

c h
c A void afficherPrenomMajuscule();
}

public
}

H & H: Research and Training 70 / 76


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 { I c


int i = 5;
EL H
O U
L MafficherNomMajuscule()
re f E
default public void
System.out.println("Doe");
{

c h
c 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 70 / 76
Interface

Java

Remarques

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


d’une classe)
I c

E
Pour cela, il faut utiliser le mot-clé extends
H
Let pas implements
U
MO de méthodes.
car une interface n’implémente jamais
L
h r e fE
A c
c

H & H: Research and Training 71 / 76


Interface

Java

Remarques

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


d’une classe)
I c

E
Pour cela, il faut utiliser le mot-clé extends
H
Let pas implements
U
MO de méthodes.
car une interface n’implémente jamais
L
h r e fE
A c
c
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 71 / 76


Énumération

Java

Énumération

est un ensemble de constantes

introduit depuis Java 5

I c

ELH
peut être déclarée, dans une fichier toute seule, dans une classe ou dans une interface

U
L MO
f E
c hre
c A

H & H: Research and Training 72 / 76


Énumération

Java

Énumération

est un ensemble de constantes

introduit depuis Java 5

I c

ELH
peut être déclarée, dans une fichier toute seule, dans une classe ou dans une interface

U
L MO
f E
c hre
c 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 72 / 76


Énumération

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

public enum Sport {

I c

}
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 73 / 76


Énumération

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

public enum Sport {

I c

}
E LH
U
O Sport
M
Ajoutons des constantes à cette énumération
L
package org.eclipse.enums;
h r e fE
A c{
c
public enum Sport
FOOT,
RUGBY,
TENNIS,
CROSS_FIT,
BASKET
}

H & H: Research and Training 73 / 76


Énumération

Java

Pour utiliser cette énumération dans la classe Main

I c

Sport sport = Sport.BASKET;
ELH
System.out.println(sport); // affiche BASKET
U
L MO
f E
chre
c A

H & H: Research and Training 74 / 76


Énumération

Java

Pour utiliser cette énumération dans la classe Main

I c

Sport sport = Sport.BASKET;
ELH
System.out.println(sport); // affiche BASKET
U
L MO
f E
re l’énumération dans la classe Main
c h
N’oublions pas d’importer
c A
import org.eclipse.enums.Sport;

H & H: Research and Training 74 / 76


É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),
I c

RUGBY("rugby", 7),
TENNIS("tennis", 3),
ELH
U
MO
CROSS_FIT("cross_fit", 4),
BASKET("basket", 6) ;
private final String nom;
f E L
private final int code;
chre
c 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 75 / 76


É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
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 76 / 76


É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
I c
L H
El’énum
O
Récupérer l’indice de la constante BASKET U
dans ération
L M
Sport sport = Sport.BASKET;
e f
rici E
h
System.out.println(sport.ordinal());
c
c A
// affiche l’indice 4

H & H: Research and Training 76 / 76


É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
I c
L H
El’énum
O
Récupérer l’indice de la constante BASKET U
dans ération
L M
Sport sport = Sport.BASKET;
e f
rici E
h
System.out.println(sport.ordinal());
c
c A
// affiche l’indice 4

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 76 / 76

Vous aimerez peut-être aussi