Vous êtes sur la page 1sur 33

2018-2019

Conduite de Projets Objet

Java
CTD 2

Anne-Gwenn Bosser
Plan du cours aujourd’hui – Objec4fs
pédagogiques

Sujets abordés aujourd’hui:


Héritage, Interfaces, résolu:on d’appels/types dynamiques ou sta:ques
Plan des ac:vités:
Récapitula:on collec:ve de ce qui a été retenu d’hier (~5 minutes)
Résolu:on des appels. (~15 minutes)
Exercices: devineKes (~15 minutes)
Plus sur les classes et interfaces (~20 minutes).
Exercice: mise en pra:que. (~30 minutes)
Après la séance vous devriez être capable de:
Expliquer dans quels cas un constructeur est appellé.
Expliquer ce qu’est la liaison dynamique (dynamic binding). Décrire quand
les appels de méthodes sont résolus sta:quement ou dynamiquement.
MeKre en oeuvre sous-typage et déléga:on pour simuler de l’héritage
mul:ple.
Anne-Gwenn Bosser
Résolution des appels

• Appel par valeur (Call by value)


• Résolu0on des appels de méthodes
• Constructeurs

Anne-Gwenn Bosser
Appel des paramètres de méthode

Anne-Gwenn Bosser
Appel des paramètres de méthode

Il peut sembler, en regardant le code, que le paramètre de la première


méthode est passé par référence
Call by Value: les arguments des méthodes sont passés par valeur.
⚠ #1: Tout en java est passé par valeur.

#2: Les types des paramètres sont toujours soit des primi:ves, soit des
références (jamais des objets).

En fait p est une référence, on ne manipule pas directement les objets en Java

Anne-Gwenn Bosser
More info: http://www.yoda.arachsys.com/java/passing.html
Résolution des appels de méthodes

No#on de signature, prototype de fonc#on:


• Nom de la fonc#on
• Visibilité (public, private par défaut)
• Modificateur (static, final,....)
• Type de retour
• Paramètres et leur types

Anne-Gwenn Bosser
Résolu'on des appels de méthodes

Polymorphisme objet:
“Même signature, fourni un comportement différent”
≈ Redéfini'on de méthode (Overriding )

Polymorphisme paramétrique:
“Différente signature, fourni le même type de
comportement”
≈ Surcharge de méthode (Overloading)

Anne-Gwenn Bosser
Résolu'on des appels de méthodes

Redéfinir une méthode dans une sous-classe:


•Même signature de fonc2on avec une implémenta2on
différente
•Liaison tardive (dynamique) Late Binding: le choix de la
méthode à appeller est résolu lors de l’exécu2on selon
le “vrai” type de l’objet appellant.
⚠ Note: On ne peut pas redéfinir une méthode avec une visibilité plus restreinte

class MyClass {
public void myMethod(){
System.out.Print(“Parent class MySubClass extends MyClass{
version”); public void myMethod(){
} System.out.Print(“Child version”);
} }
}
Anne-Gwenn Bosser
Résolu'on des appels de méthodes

Surcharge des méthodes et des constructeurs:


Même nom de fonc+on, mais le nombre ou les types des
arguments sont différents
Liaison sta+que (Sta'c Binding) :C’est le compilateur qui résout quelle
méthode est a apeller
public void bonjour(){
System.out.println(“Bonjour”);
}
public void bonjour(String name){
System.out.println(“Bonjour ” + name);
}

⚠Les opérateurs ne peuvent pas être surchargés en Java. Les opéra+ons sur
le type String sont définies par le langage.
Anne-Gwenn Bosser
Résolu'on des appels de méthodes

Utilisation de polymorphisme parametrique: des comportements similaires


mais sur des types de données différents.

class Dot{}

class Line{}

public class MyClass


void translate(Dot dot){
...
}
void translate(Line line){
...
}
}

Anne-Gwenn Bosser
Quelle est la sor+e?
Anne-Gwenn Bosser
Résolution des appels de méthodes

Pourquoi ?
Pour la surcharge, l’appel est résolu à l’aide du type sta8que durant la compila8on :
ici: le type des éléments du tableau est Parent
le compilateur résout l’appel par Test ( Parent p )

Pour la redéfini8on, l’appel est résolu à l’aide du type dynamique durant l’exécu8on
(Late binding)
Si l’objet a été créé (lors du new) avec un sous-type de Parent
Alors la méthode appelée est celle définie dans la classe sous-type, donc celle de Child.

Anne-Gwenn Bosser
Masquage des méthodes statiques

Redéfini(on Vs. Masquage:

Les méthodes sta(ques ne peuvent pas être redéfinies, pour bénéficier du


polymorphisme d’objet (run(me)
En effet, leur appel est résolu à la compila(on en u(lisant le typage sta(que.

Ces méthodes sont donc masquées dans les sous classe, et doivent être appellées
explicitement (nom de la classe, ou type cast).

Anne-Gwenn Bosser
Masquage des méthodes sta/ques

Qu’est-ce qui est écrit sur la console?


Anne-Gwenn Bosser
Masquage des méthodes sta/ques

Anne-Gwenn Bosser
Constructeurs, Appels des constructeurs

Si (et seulement si) aucun constructeur n’est défini explicitement dans une
classe, la compila8on génèrera un constructeur par défaut sans paramètres.
Un constructeur peut appeler explicitement un autre constructeur
Cet appel doit être la première instruc8on du constructeur
On peut u8liser les mots clés this et super
Exemple: super() appelle le constructeur de la superclasse sans paramètres
En cas d’appel mutuel, l’erreur sera detectée à la compila8on
Si aucun appel explicite n’est fait, implicitement le constructeur de la classe
Object sera appelé

Anne-Gwenn Bosser
Exercices - Devine-es

Décrivez et expliquez les comportements des programmes distribués

Anne-Gwenn Bosser
Plus sur les classes et interfaces

• Différents types de classe


• Héritage et Interfaces

Anne-Gwenn Bosser
Les classes Java

Elles peuvent être:


Concrètes
Abstraites (en utilisant le mot clé
abstract)
Generiques (paramétrables par un
type)
Internes (ou imbriquées)
et dans ce cas elles peuvent même être
anonymes

Anne-Gwenn Bosser
Classes Internes

On a ici inclu la définition


de la classe ContactDetails
dans une autre classe.

Anne-Gwenn Bosser
Classes Internes

Anne-Gwenn Bosser
Classe Imbriquée anonyme

button.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent actionEvent)


{

System.out.println(actionEvent.getActionCommand()) ;

}
}
);

Anne-Gwenn Bosser
Classe abstraite

public abstract class MyClass{

public abstract void myMethod();


}

Ne peut pas être instanciée

Peut être héritée

Peut comporter des méthodes abstraites


(mais ce n’est pas une obliga9on)
Anne-Gwenn Bosser
Generics

Types Generiques
public class Pair<T>{
public T first;
public T second;
}

Methodes Génériques

public <T> void inspect(T t){

System.out.println("T: " + t.getClass().getName());


}

Anne-Gwenn Bosser
Héritage simple
Interfaces mul3ples

Anne-Gwenn Bosser
Héritage simple

public class MyClass extends OtherClass{


}

La classe Object :
Toutes les classes appar/ennent à une hiérarchie.
La racine est la classe Object.
Voir la documenta/on des APIs Java:
h>ps://docs.oracle.com/javase/7/docs/api/
Une classe peut
Implémenter plusieurs interfaces
N’étendre qu’une seule classe ( Pas d’héritage mul8ple)
Anne-Gwenn Bosser
Interfaces

Défini un type sans définir une implémenta2on (comme en UML)

“There are a number of situa1ons in so2ware engineering when it is important for


disparate groups of programmers to agree to a "contract" that spells out how their
so2ware interacts. Each group should be able to write their code without any
knowledge of how the other group's code is wri?en. Generally speaking, interfaces
are such contracts.”
h?ps://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

Une interface peut contenir:


Des constantes (static final)
Des signatures de méthodes
Des types imbriqués

Anne-Gwenn Bosser
Interfaces

Exemple

public interface MyInterface {

public void myMethod(int param) ;

⚠ la visibilité par défaut est publique, pas package.

public class MyClass implements Interf1, Interf2{

public void myMethod(int param){


}
}

Anne-Gwenn Bosser
Le “problème” de l’héritage en diamant

Vehicule

Sous-marin Voiture

Batmobile

Anne-Gwenn Bosser
Le “problème” de l’héritage en diamant

• Si j’ajoute une méthode seDeplace de Véhicule que


je redéfini dans les sous-classes Sous-marin et
Voiture, comment se déplace la Batmobile?
• L’a>ribut définissant l’unique propriétaire du
véhicule est hérité dans chaque sous-classe, est-il
dupliqué ou non dans le Batmobile?
• Et celui définissant la consommaAon en essence,
qui diffère dans sous-marin et Voiture?

Anne-Gwenn Bosser
Le “problème” de l’héritage en diamant

En Java, on considère ce type de modélisa6on comme non souhaitable voire


mauvais.

Une solu6on possible, parmi d’autres: considérer non pas la Batmobile comme
à la fois une Voiture et un Sous-Marin, mais alterna6vement Voiture ou Sous-
Marin, selon son état.
On définit des classes Voiture et Sous-Marin qui implémentent une interface Véhicule
C’est le code de la classe Batmobile (implémentant elle même Véhicule) qui décrit
quand on doit appeller quelle méthode, par exemple avec un aLribut qui conserve son
état courant (objet Vehicule de type Voiture ou Sous-Marin), et comment gérer les
aLributs.
On peut même ranger tous les Vehicule dans un même tableau et appeller en boucle
leurs méthodes seDeplace

Cela correspond bien à ce que vous avez appris:


Héritage = Sous-typage + factorisa6on de code
Le diagramme UML u6lisera sous-typage et aggréga6on.

Anne-Gwenn Bosser
Le “problème” de l’héritage en diamant

<<Vehicule>>

Sous-marin Voiture

Batmobile

Anne-Gwenn Bosser
Exercice
Hulk

Anne-Gwenn Bosser

Vous aimerez peut-être aussi