Introduction à Java
Cours 3: Programmation Orientée Objet en Java
Stéphane Airiau
Université Paris-Dauphine
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 1
But : ne pas coder la même chose
1 public class Personnage {
2 public String nom;
3
4 // constructeur par défaut
5 public Personnage(){
6 nom = ”Inconnu";
7 }
8
9 public Personnage(String name){
10 nom = name;
11 }
12 }
On veut maintenant faire des classes Gaulois et Romain pour avoir
des comportements plus spécifiques.
Comment s’y prendre ?
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 2
But : ne pas coder la même chose
1 public class Personnage {
2 public String nom;
3
4 // constructeur par défaut
5 public Personnage(){
6 nom = ”Inconnu";
7 }
8
9 public Personnage(String name){
10 nom = name;
11 }
12 }
On veut maintenant faire des classes Gaulois et Romain pour avoir
des comportements plus spécifiques.
Comment s’y prendre ?
ë recopier ce qui a été fait dans la classe Personnage et ajouter des
méthodes spécifiques.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 3
But : ne pas coder la même chose
1 public class Personnage {
2 public String nom;
3
4 // constructeur par défaut
5 public Personnage(){
6 nom = ”Inconnu";
7 }
8
9 public Personnage(String name){
10 nom = name;
11 }
12 }
On veut maintenant faire des classes Gaulois et Romain pour avoir
des comportements plus spécifiques.
Comment s’y prendre ?
ë recopier ce qui a été fait dans la classe Personnage et ajouter des
méthodes spécifiques.
6 On ne veut pas dupliquer de code !
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 4
But : ne pas coder la même chose
1 public class Personnage {
2 public String nom;
3
4 // constructeur par défaut
5 public Personnage(){
6 nom = ”Inconnu";
7 }
8
9 public Personnage(String name){
10 nom = name;
11 }
12 }
On veut maintenant faire des classes Gaulois et Romain pour avoir
des comportements plus spécifiques.
Comment s’y prendre ?
ë recopier ce qui a été fait dans la classe Personnage et ajouter des
méthodes spécifiques.
6 On ne veut pas dupliquer de code !
Java propose l’héritage comme solution.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 5
Héritage
L’héritage permet à un objet d’acquérir les propriétés d’un autre objet ë
factorisation des connaissances :
la classe mère (ou classe de base) est plus générale
ë elle contient les propriétés communes à toutes les classes filles (ou
classes dérivées ou héritées).
Les classes filles ont des propriétés plus spécifiques.
ë On obtient une hierarchie de classes.
Pour exprimer qu’une classe est une classe fille, on utilise le mot-clé ex-
tends dans la déclaration d’une classe :
1 class <nom classe fille> extends <nom classe mère>
En Java, on hérite d’une seule et unique classe.
(une classe qui n’hérite d’aucune classe héritent en fait implicitement de la classe
Object)
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 6
Membres protégés – protected
Les méthodes ou attributs
public sont toujours accessibles par une classe fille
(bien sûr !)
private restent inaccessibles, même pour une classe fille
ë nouvelle portée protected : seules la classe et les classes dérivées
ont accès à des membres déclarés protected.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 7
méthodes de la classe mère
Pour les méthodes public ou protected, on a le choix :
soit le comportement est le même : on peut/doit omettre la
ré-écriture de la méthode
soit le comportement est différent : on peut ré-écrire la méthode
il existe deux références pour parcourir la hierarchie :
this : est une référence sur l’instance de la classe.
super : est une référence sur l’instance mère.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 8
Exemple
1 public class Personnage {
2 private String nom;
3 // Constructeur
4 public Personnage(String name){
5 [Link] = name;
6 }
7
8 public String presentation(){
0 return ”Je m’appelle” + name;
10 }
11 }
1 public class Gaulois extends Personnage {
2
3 public Gaulois(String name){
4 super(name);
5 }
6
7 public String presentation(){
8 return [Link]() + ” je suis un gaulois”;
9 }
10 }
11
12 public static void main(String[] args){
13 Gaulois asterix = new Gaulois(”Astérix”);
14 [Link]( [Link]());
15 }
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 9
instance of
Opérateur pour vérifier si une classe est bien un instance d’une classe.
1 public class Personnage { . . . }
1 public class Gaulois extends Personnage { . . . }
1 public class IrreductibleGaulois extends Gaulois { . . . }
1 public class Romain extends Personnage { . . . }
2 ...
5 public static void main(String[] args){
6 IrreductibleGaulois asterix = new IrreductibleGaulois();
7 [Link]( asterix instance of Personnage);
8 [Link]( asterix instance of Gaulois);
9 [Link]( asterix instance of Romain);
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 10
instance of
Opérateur pour vérifier si une classe est bien un instance d’une classe.
1 public class Personnage { . . . }
1 public class Gaulois extends Personnage { . . . }
1 public class IrreductibleGaulois extends Gaulois { . . . }
1 public class Romain extends Personnage { . . . }
2 ...
5 public static void main(String[] args){
6 IrreductibleGaulois asterix = new IrreductibleGaulois();
7 [Link]( asterix instance of Personnage);
8 [Link]( asterix instance of Gaulois);
9 [Link]( asterix instance of Romain);
true
true
false
Astérix est bien un Gaulois, c’est même un irréductible
Gaulois, et surtout pas un Romain.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 11
Polymorphisme
L’exemple précédent montre qu’un objet peut avoir plusieurs types. C’est
ce que l’on appelle le polymorphisme.
Le polymorphisme et le transtypage implicite nous permettent de mani-
puler des objets qui sont issus de classes différentes, mais qui partage un
même type.
1 Personnage asterix = new Gaulois(”Astérix”);
1 Gaulois obelix = new Gaulois(”Obélix”);
2 Gaulois asterix = new Gaulois(”Astérix”);
3 Personnage cleopatre = new Personnage(”Cléopâtre”) ;
3 Personnage[] distribution= new Personnage[3];
4 distribution[0]= asterix;
5 distribution[1]= obelix;
6 distribution[2]= cleopatre;
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 12
Polymorphisme
1 Personnage asterix = new Gaulois(”Astérix”);
Dans l’exemple asterix est déclaré comme un Personnage, même si
l’objet est en fait un Gaulois.
Comme la variable est déclarée comme un Personnage, on ne peut pas
appeler une méthode spécifique d’une classe dérivée comme Gaulois.
Par exemple :
[Link](); n’est pas per-
mis !
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 13
Recherche dynamique d’un membre
1 public class Personnage {
2 ...
3 public String presentation(){
4 return ”je m’appelle ”+nom;
5 }
6 }
1 public class Gaulois extends Personnage {
2 public Gaulois(String name){ super(name);}
Les trois classes possèdent une mé- 4 @Override public String presentation(){
thode presentation() 5 return [Link]() + ”je suis un gaulois”;
Java choisit la méthode appro- 6 }}
priée au moment de l’exécution.
ë on a une liasion dynamique. 1 public class IrreductibleGaulois extends Personnage {
2
3 public IrreductibleGaulois(String name){ super(name);}
Au moment de la compilation, on 5 @Override public String presentation(){
va vérifier si la méthode appliquée 6 return super().presentation()
à un Personnage est bien une mé- 7 + ” et je ne crains pas les romains”;
thode de la classe Personnage ou 8 }
de ses parentes. 9 public void frappeRomains(){
10 [Link](”qu’est-ce qu’on s’amuse!”);}
ë on ne pourrait pas appeler 11 }
[Link]() 12 public static void main(String[] args){
13 Random generator = new Random();
14 Personnage mystere;
15 if ([Link]())
16 mystere = new Gaulois(”Astérix”);
17 else
18 mystere = new Romain(”Jules”);
19 [Link]([Link]());
20 }}
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 14
Le mot-clé final
pour une classe : une classe final n’aura pas de classe fille
ë raison de sécurité pour éviter des « détournements ».
exemple : classe String
pour une méthode : cette méthode ne pourra pas être re-définie
dans une classe dérivée
pour une variable : la variable ne pourra être modifiée.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 15
Tout objet hérite de la classe Object
Modifier and Type Method Description
protected Object clone()
Creates and returns a copy of this object.
boolean equals(Object obj)
Indicates whether some other object is "equal
to" this one.
protected void finalize()
Called by the garbage collector on an ob-
ject when garbage collection determines that
there are no more references to the object.
Class<?> getClass()
Returns the runtime class of this Object.
int hashCode()
Returns a hash code value for the object.
String toString()
Returns a string representation of the object.
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 16
Classes et méthodes abstraites
Contexte : A bien y réfléchir, on n’utilisera jamais un objet de la classe
Personnage, on utilisera toujours un objet d’une classe dérivée (Romain,
Gaulois, Animaux, etc).
Pour certaines méthodes, on utilisera toujours la méthode de la classe déri-
vée, l’implémentation dans la classe Personnage est inutile.
Cependant, on veut forcer l’implémentation de ces méthodes dans la classe
dérivée.
Solution : utiliser une méthode abstraite (mot-clé abstract)
une méthode abstraite
n’a pas de corps
doit être implémentée dans les classes dérivées
une classe abstraite
est une classe qui contient une méthode abstraite
ne peut pas être instanciée
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 17
Exemple classe abstraite
1 public abstract class Personnage {
2
3 String nom;
4
5 public Personnage(String name);
6
7 // à définir dans les classes filles
8 public abstract void presentation();
9
10 // partagée par toutes les classes dérivées
11 public void jeMappelle(){
12 [Link](” je m’appelle ” + nom);
13 }
14 }
N.B. Même si Personnage est abstraite, on peut cependant avoir un construc-
teur :
par exemple si on veut initialiser des attributs avant d’initialiser l’objet (par
exemple des attributs final)
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 18
Interfaces
En Java, on a un héritage simple : on ne peut hériter que d’une seule
classe.
Les interfaces offrent un mécanisme pour réaliser de l’héritage multiple.
Une interface est une sorte de standard
pour suivre le standard, une classe doit posséder les méthodes et les
constantes déclarées dans l’interface.
ë on dit que la classe implémente l’interface.
Une classe peut implémenter plusieurs interfaces.
1 [public] interface <nom interface>
2 [extends <nom interface 1> <nom interface 2> . . . ] {
3 // méthodes ou des attributs static
4 }
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 19
Toute méthode déclarée dans une interface est abstraite
Les méthodes sont implicitement déclarées comme telles
(i.e. il n’est pas nécessaire d’ajouter le mot-clé abstract)
Tout attribut est implicitement déclaré static et final.
1 public interface Combattant {
2 public void attaque(Personnage p);
3 public void defend(Combattant c);
4 }
5
6
7 public class IrreductibleGaulois implements Combattant {
8 ...
9 public void attaque(Personnage p){
10 [Link]();
11 while([Link]())
12 coupsDePoing(p);
13 }
14
15 public void defend(Combattant c){
16 esquive();
17 attaque(c);
18 }
Cours 3:19 }
Programmation Orientée Objet en Java– (Stéphane Airiau) Java 20
Variables
Portée
public : visible de tous
private : visible seulement depuis la classe
protected : visible des classes filles
static : pour la définition d’une variable de classe
final : pour un attribut non modifiable
type de l’attribut
ë déclaration :
[portée][static] [final] <type> nomAttribut
Cours 3: Programmation Orientée Objet en Java– (Stéphane Airiau) Java 21