Вы находитесь на странице: 1из 82

Java et Objet

Amlie Lambert

2014-2015

Amlie Lambert

2014-2015

1 / 82

Chapitre 5
Programmation oriente objet

Amlie Lambert

2014-2015

2 / 82

Plan du cours

Analyse, conception et programmation Oriente Objets


Lhritage
Le polymorphisme
Les classes abstraites
Les interfaces
Exercices

Amlie Lambert

2014-2015

3 / 82

Analyse, conception et
programmation Oriente Objets

Amlie Lambert

2014-2015

4 / 82

Analyse et conception Oriente Objet

Identifier les objets du domaine dapplication


Dcrire les diffrents attributs
tablir les relations entre les diffrents objets
Former les groupes dobjets

Amlie Lambert

2014-2015

5 / 82

Les objets et leurs attributs

Pour dcrire les objets et leurs attributs, on utilise diffrents diagrammes :


Diagramme de classe
Diagramme dobjet

Amlie Lambert

2014-2015

6 / 82

Diagramme de classe
Ce diagramme est utilis pour prsenter les classes des systmes ainsi que
les diffrentes relations entre celles-ci.
Il doit dcrire le comportement et le type dun ensemble dobjets.
PolygoneRegulier
-nbCotes:int
-longueur:double
+perimetre():double
+surface():double

Amlie Lambert

2014-2015

7 / 82

Diagramme dobjet

Ce diagramme permet de reprsenter les instances des classes, cest--dire


des objets.
En plus du diagramme de classes, il exprime ltat des objets, ce qui
permet dexprimer des contextes dexcution.
pr1 :PolygoneRegulier
nbCotes=6
longueur=8.7

Amlie Lambert

pr1 :PolygoneRegulier
nbCotes=4
longueur=12.8

2014-2015

8 / 82

Les relations entre les diffrents objets

Lassociation
Lagrgation
La composition simple ou multiple
Lhritage
Modles dynamique

Amlie Lambert

2014-2015

9 / 82

Lassociation

Une association exprime une connexion smantique entre deux


classes.
Elle dcrit un groupe de liens ayant une structure et une smantique
commune. Elle exprime une relation structurelle entre deux classes.

Amlie Lambert

2014-2015

10 / 82

Lassociation (traduction en Java)


public class Personne
{
private String nom;
private Vector<Vol> lesVols; // lassociation est reprsente par le vecteur lesVols
public Personne( String nom ){
lesVols = new Vector<Vol>();
this.nom = nom;
}
public void reserve( Vol v ){
lesVols.addElement( v );
}
public boolean passager( Vol v ){
return lesVols.contains( v );
}
...
}

Amlie Lambert

2014-2015

11 / 82

Lassociation dune classe sur elle-mme

Il galement est possible de dfinir une association entre une classe et


elle-mme.

Amlie Lambert

2014-2015

12 / 82

Lassociation dune classe sur elle-mme (traduction en


Java)
public class Personne{
private String nom;
private Personne epoux = null; // lassociation est reprsente par la Personne epoux.
private boolean marie = false;
public Personne( String nom ){
this.nom = nom;
}
public void marie( Personne p ){
epoux = p;
marie = true;
}
public boolean marie(){
return marie;
}
...
}

Amlie Lambert

2014-2015

13 / 82

Lagrgation

Lagrgation exprime une association avec relation de subordination.


Elle est reprsente par un trait reliant les deux classes et dont lorigine
(classe contenante) se distingue par un losange de lautre extrmit (classe
subordonne).
Une des classes "regroupe" dautres classes. On peut dire que lobjet T
utilise une instance de la classe T.

Amlie Lambert

2014-2015

14 / 82

Lagrgation (traduction en Java)


public class ListeClients{
private Vector<Personne> laListe; // lagrgation est reprsente par le vecteur
// de Personne laListe
public ListeClients(){
laListe = new Vector<Personne>();
}
public void inclus( Personne p ){
laListe.add( p );
}
public Vector<Personne> laListe(){
return laListe;
}
}
public class Personne{
private String nom;
public Personne( String nom ){
this.nom=nom;
}
public boolean client( ListeClients<Personne> l ){
return (l.laListe()).contains( this );
}
}
Amlie Lambert

2014-2015

15 / 82

Association + Agrgation

Il est possible de combiner lassociation et lagrgation.

Amlie Lambert

2014-2015

16 / 82

Association + Agrgation (traduction en Java)


public class Personne
{
private String nom;
private Personne epoux = null;// lassociation est reprsente par la Personne Epoux
private boolean marie = false;
public Personne( String nom ){
this.nom=nom; }
public void marie( Personne p ){
epoux = p;
marie = true; }
public boolean marie(){
return marie; }
public boolean client( ListeClients<Personne> l ){
return (l.laListe()).contains( this );}}
public class ListeClients
{
private Vector<Personne> laListe; // lagrgation est reprsente par le vecteur laListe
public ListeClients(){
laListe = new Vector<Personne>();}
public void inclus( Personne p ){
laListe.add( p ); }
public Vector<Personne> laListe(){
return laListe;}}
Amlie Lambert

2014-2015

17 / 82

La composition
La composition est une variante plus forte de lagrgation.
En gnral, le cycle de vie des deux classes en relation est dpendant. Si la
classe contenante est dtruite, la classe subordonne est dtruite.
Elle est reprsente par un trait reliant les deux classes et dont lorigine
(classe contenante) se distingue par un losange noir de lautre extrmit
(classe subordonne).

Amlie Lambert

2014-2015

18 / 82

La composition (traduction en java)

public class Moteur


{
private Cylindre[] lesCylindres; // la composition est reprsente par le vecteur lesCylindres
public Moteur()
{
lesCylindres = new Cylindre[8];
}
...
}

Amlie Lambert

2014-2015

19 / 82

La composition multiple

La composition peut tre multiple : la classe contenante a alors


plusieurs classes subordonnes.

Amlie Lambert

2014-2015

20 / 82

La composition multiple (traduction Java)


public class Vehicule
{
private Moteur moteur; // la composition multiples est reprsente par moteur
private Roue[] roues; // le tableau roues
private Caisse caisse; // caisse
private Habitacle habitacle; // et habitacle
public Vehicule(){
moteur = new Moteur();
roues = new Roue[4];
caisse = new Caisse();
habitacle = new Habitacle();
}
public Vehicule( Moteur moteur,Roue[] roues, Caisse caisse,Habitacle habitacle){
this.moteur = moteur;
this.roues = roues;
this.caisse = caisse;
this.habitacle = habitacle;
}
...
}

Amlie Lambert

2014-2015

21 / 82

Lhritage
La relation dhritage indique que la "sous-classe" (classe fille) est
une spcification de la "super-classe" (classe mre).
La classe fille hrite de tous les attributs et mthodes de la classe mre, on
va du gnral au particulier.
Elle est reprsente par un trait reliant les deux classes et dont lorigine
(classe mre) se distingue de lautre extrmit (classe fille) par un triangle.

Amlie Lambert

2014-2015

22 / 82

Lhritage (traduction Java)

public class Voiture extends Vehicule{ // lheritage est reprsent par le mot cl extends
...
}
public class Bateau extends Vehicule{
...
}
public class Train extends Vehicule{
...
}
public class Velo extends Vehicule{
...
}

Amlie Lambert

2014-2015

23 / 82

Association + Hritage
Il est possible de mixer association et hritage.

Amlie Lambert

2014-2015

24 / 82

Association + Hritage (traduction en Java)


public class Personne {
protected String nom;
... }
public class Cours{
... }
public class Etudiant extends Personne{ // lheritage est reprsent par le mot cl extends
private Vector<Cours> lesCours; // lassociation est reprsente par le vecteur lesCours
public Etudiant( String nom ){
lesCours = new Vector<Cours>();
this.nom = nom; }
public void suit( Cours cours ){
lesCours.addElement( cours );}
}
public class Enseignant extends Personne{ // lheritage est reprsent par le mot cl extends
private Vector<Cours> lesCours; // lassociation est reprsente par le vecteur lesCours
public Enseignant( String nom ){
lesCours = new Vector<Cours>();
this.nom = nom;}
public void enseigne( Cours cours ){
lesCours.addElement( cours ); }
}
Amlie Lambert

2014-2015

25 / 82

Exercice 1 (1/5)

Des personnes dfinies par leur nom peuvent acheter une ou plusieurs
voitures (dfinies par leur modle).
Chaque voiture peut possder un autoradio (avec ou sans lecteur de CD).
Cet autoradio est extractible. Le propritaire de lautoradio est une
personne qui nest pas obligatoirement celui de la voiture.
1

Tracer le diagramme UML correspondant

Implanter ce diagramme en Java

Amlie Lambert

2014-2015

26 / 82

Exercice 1 (2/5)

Amlie Lambert

2014-2015

27 / 82

Exercice 1 (3/5)
public class Personne
{
private String nom;
private Vector<Radio> radios; // lassociation est reprsente par le vecteur radios
private boolean possede = false;
private Vector<Voiture> voitures; // lassociation est reprsente par le vecteur voitures
public Personne( String nom ){
this.nom = nom;
voitures = new Vector();}
public void possede( Radio radio ){
radios.addElement(radio);
possede = true;}
public boolean possedeRadio(){
return possede;}
public void achete( Voiture voiture ){
voitures.addElement( voiture );}
}

Amlie Lambert

2014-2015

28 / 82

Exercice 1 (4/5)
public class Voiture
{
private String modele;
private Radio radio = null; // lagregation est representee par le Radio radio
public Voiture( String modele ){
this.modele = modele; }
public void installe( Radio radio ){
if (!radio.getInstalle()){
this.radio = radio;
this.radio.setInstalle(true);
}}
public void desinstalle(){
if (this.installe !=null){
this.radio.setInstalle(false);
this.radio=null;
}}
public Radio getRadio(){
return radio; }
}
Amlie Lambert

2014-2015

29 / 82

Exercice 1 (5/5)
public class Radio
{
private boolean installe; // lagregation est representee par le boolean installe
public Radio(){
this.installe=false; }
public void setInstalle(boolean b){
this.installe = b; }
public boolean getInstalle(){
return this.installe; }
}
public class Client{
public static void main ( String[] args ){
Personne personne = new Personne( "Ledoux" );
Voiture voiture = new Voiture( "Renault" );
Radio radio = new Radio();
voiture.installe( radio );
personne.achete( voiture );
personne.possede(voiture.getRadio() );
}
}
Amlie Lambert

2014-2015

30 / 82

Lhritage

Amlie Lambert

2014-2015

31 / 82

Le principe de lhritage (1/3)

Les hirarchies de classes (classification) permettent de grer la


complexit en ordonnant les objets au sein darborescence de
classes dabstraction croissante.
Les classes descendantes hritent des proprits des classes anctres.
Exemple :
Vertbrs Mammifres Hominids Hommes

Amlie Lambert

2014-2015

32 / 82

Le principe de lhritage : Exemple (2/3)

Amlie Lambert

2014-2015

33 / 82

Le principe de lhritage (3/3)

Une classe anctre dune classe descendante est appele super-classe.


La classe decendante possde obligatoirement tous les attributs
et mthodes de ses super-classes.
Elle se diffrencie par la possibilit :
I

Dajouter de nouvelles variables dinstance

Dajouter de nouvelles mthodes

De redfinir des mthodes de la super-classe

Amlie Lambert

2014-2015

34 / 82

Hritage et diagramme de classe


Il est possible de reprsenter lhritage par un diagramme de classes.

Amlie Lambert

2014-2015

35 / 82

Hritage (traduction en Java) (1/2)


public class PolygoneRegulier{
protected int nbCotes;
protected double longueur;
public PolygoneRegulier( int n,double l ){
nbCotes = n;
longueur = l;}
public double perimetre(){
return nbCoteslongueur;}
public double surface(){
return nbCoteslongueurlongueur/4Math.tan(3.14/nbCotes);}
}
public class Carre extends PolygoneRegulier{
public Carre( double l ){
nbCotes = 4;
longueur = l;}
public double surface(){
return longueurlongueur;}
}
Amlie Lambert

2014-2015

36 / 82

Hritage (traduction en Java) (2/2)


public class Hexagone extends PolygoneRegulier{
public Hexagone( double l ){
nbCotes = 6;
longueur = l; }
}
public class Exercice{
public static void main(String[] args){
Carre carre = new Carre(5.7);
double p = carre.perimetre();
// perimetre est hrite de PolygoneRegulier
carre.surface();
// surface est redfinie dans la classe Carre
Hexagone hexagone = new Hexagone(3.9);
double surface = carre.surface()+hexagone.surface();
// la mthode surface() de Carre puis celle de Hexagone sont invoques }
}

Amlie Lambert

2014-2015

37 / 82

La protection lors de lhritage


Les membres (variables dinstance, constantes, mthodes) dclares
public sont accessibles par tout objet
Les membres dclars private ne sont accessibles que dans les
mthodes de la classe
Les membres protected sont accessibles seulement par :
I
I

Les membres de la classe


Les membres de chacune des sous classes quel que soit le
package dappartenance

Si aucun modificateur de protection nest spcifi pour une classe,


ses membres sont accessibles par tous les membres des autres classes
du mme package
Remarque : si toutes les sous-classes appartiennent au mme
package, accs protected ou par dfaut sont quivalents
Amlie Lambert

2014-2015

38 / 82

Les rgles de visibilit

visibilit
autre classe du
mme package
sous classe dun
autre package

Amlie Lambert

private
non

par dfaut
oui

protected
oui

public
oui

non

non

oui

oui

2014-2015

39 / 82

Exercice 2 (1/4)
Nous revenons vers la classe Radio. On souhaite crer un nouveau modle
de radio capable de lire des CDs.
1

Concevoir une nouvelle classe RadioCD partir de la classe existante


Radio.

La classe Radio est-elle assez gnrale pour devenir super-classe de


RadioCD ? sinon comment faut-il la modifier ?

Le programme principal cre une instance de cette nouvelle classe avec


les stations prrgles, coute la station 4 puis 89.9 puis insre une CD
lcoute, lenlve et coute la station 93.5

Amlie Lambert

2014-2015

40 / 82

Exercice 2 (2/4)
class Radio{
protected double[] stations = new double[5];
public Radio(){}
public Radio(double[] stations){
this.stations = stations;
}
public void preregler(int index, double frequence){
stations[index] = frequence;
}
public void ecouter(int index){
System.out.println("Ecoutedelastation:"+stations[index]+"Mhz");
}
public void ecouter(double frequence){
System.out.println("Ecoutedelastation:" + frequence+ "Mhz");
}
}

Amlie Lambert

2014-2015

41 / 82

Exercice 2 (3/4)
class RadioCD extends Radio{
private boolean cdIn = false;
public RadioCD(double[] stations){
super(stations);}
public void insererCD(){
cdIn = true;
System.out.println("\t>CDinsr");}
public void enleverCD(){
cdIn = false;
System.out.println("\t>CDenlev");}
public void ecouter(){
if(cdIn)
System.out.println("\t>lectureduCD");
else
System.out.println("\t>insrerunCDdabord");}
}

Amlie Lambert

2014-2015

42 / 82

Exercice 2 (4/4)

public class Exercice2{


public static void main(String[] args){
double[] stations = {101.5, 87.9, 105.1, 95, 101.1};
Radio radio = new Radio(stations);
radio.ecouter(3);
radio. ecouter(93.5);
RadioCD radioCD = new RadioCD(stations);
radioCD. ecouter(2);
radioCD. ecouter(89.9);
radioCD.insererCD();
radioCD. ecouter();
radioCD.enleverCD();
radioCD. ecouter(93.5);
}
}

Amlie Lambert

2014-2015

43 / 82

La surcharge et la redfinition
Plusieurs mthodes dune mme classe peuvent avoir le mme nom
condition davoir des signatures diffrentes (nombre et/ou types
des paramtres diffrents). On dit quelles sont surcharges.
Exemple :
void afficher(String s);
void afficher(int i,Object o);
Le compilateur sappuie sur la signature des mthodes pour choisir
sans ambigut la mthode appliquer.
La surcharge est un mcanisme qui sapplique aussi aux constructeurs.
En revanche, lors de lhritage, une mthode redfinie possde la
mme signature et le mme type de retour que la mthode de
la super classe.
Une variable dinstance, une variable ou une mthode static ne
peuvent pas tre redfinies.
Amlie Lambert

2014-2015

44 / 82

La surcharge et la redfinition (exemple )


class Surcharge{
void afficherValeur( ){
System.out.println("aucunevaleurdefinie"); }
void afficherValeur(long x){
System.out.println("valeurentiereegalea"+x); }
void afficherValeur(double x){
System.out.println("valeurflottanteegalea"+x); }
void afficherValeur(String s, int x){
System.out.println(s+x); }
}
class Test{
public static void main(String[ ] args){
Surcharge sRef = new Surcharge( ) ;
sRef.afficherValeur( ) ;
sRef.afficherValeur(3.14159) ;
}
}

Aucune valeur dfinie


valeur flottante gale 3.14159
Amlie Lambert

2014-2015

45 / 82

La surcharge et la redfinition (ambiguit)


Il ny a pas surcharge si 2 mthodes ne se diffrencient que par le type de la
valeur retourne
class A {
double g(){....}
int g(){....}
}

le compilateur dcle une ambigut

Il y a surcharge si 2 mthodes ont mme nombre et mme type de


paramtres mais dans un ordre diffrent
class A {
int g(double d, int i){....}
int g(int i, double d){....}
}

compilation OK

Mais
A a = new A();
a.g(5,5);

Amlie Lambert

ambigut : le compilateur ne sait pas


quelle mthode choisir
2014-2015

46 / 82

La notion de Sous-classement
Il est possible daffecter un objet de classe mre un objet de classe fille.
Supposons que la classe Hexagone (classe fille) hrite de la classe
PolygoneRegulier (classe mre).
PolygoneRegulier poly = new PolygoneRegulier(5,2.5);
Hexagone hexa = new Hexagone(4.67);
poly = hexa;

Cette affectation est lgale. Aprs affectation, poly contient une rfrence
un objet, instance dune sous-classe de PolygoneRegulier, or un
Hexagone est un PolygoneRegulier.
Pour la mme raison, et puisque tout est objet, il est tout aussi lgal
dcrire :
Object o = new Object();
o = hexa;

Amlie Lambert

2014-2015

47 / 82

Sous-typage

Dfinition :
Soit ST un sous-type de T, alors toute valeur de ST peut-tre utilise
en lieu et place dune valeur du type T.
si SC est sous-classe de T, alors SC est sous-type de T
Exemple :
si poly.surface() est valide, alors hexa.surface() le sera aussi Les
classes PolygoneRegulier et Hexagone :
I
I

sont en relation de sous-classement


sont en relation de sous-typage

Amlie Lambert

2014-2015

48 / 82

Sous-classement et sous-typage (Exemple)


On ajoute la mthode dessiner Hexagone :
public void dessiner(){
...
}

Supposons maintenant le morceau de programme :


poly = hexa;
poly.dessiner();

Que se passe-t-il ?
Une erreur surviendra la compilation, car le type de poly
(PolygoneRegulier) ne possde pas de mthode dessiner()

Amlie Lambert

2014-2015

49 / 82

Sous-classement et sous-typage (Exemple)


On ajoute la mthode suivante la classe PolygoneRegulier :
public boolean plusGrand(PolygoneRegulier p){
return this.surface()>p.surface();
}
PolygoneRegulier poly = new PolygoneRegulier( 5,2.5 );
Hexagone hexa = new Hexagone( 4.67 );
if( poly.plusGrand(hexa) )
System.out.println( "poly>hexa" );
else
System.out.println( "poly<hexa" );

Erreur : PolygoneRegulier plusGrand(Hexagone) nexiste pas :


limitation du sous-typage

Amlie Lambert

2014-2015

50 / 82

Le transtypage (cast)
Le transtypage consiste convertir une valeur dun type dans un
autre type.
Exemples :
hexa = poly;

Cette affectation est illgale : types incompatibles


poly = hexa;

Pour rendre possible lappel la mthode :


poly.dessiner();

Il faut vrifier si poly contient une rfrence sur une instance


dHexagone :
if ( poly instanceof Hexagone ){
Hexagone h = (Hexagone)poly; // conversion de type
h.dessiner();}
Carre c = new Carre(5);
Hexagone h = new Hexagone(3);
c = h; // types incompatibles
c = (Carre)h; // types inconvertibles
Amlie Lambert

2014-2015

51 / 82

La pseudo variable super

Une variable dinstance ou une mthode dune sous-classe peut avoir


le mme nom que celle de sa super-classe
Pour utiliser la variable dinstance ou la mthode de la super-classe, on
utilise le mot cl super
Exemple :
Appel de la mthode surface() de la classe mre
PolygoneRegulier dun Hexagone h :
System.out.println("Lasurfacedehest" + super.surface());

Amlie Lambert

2014-2015

52 / 82

Constructeurs et hritage
public class Point{
protected int x,y;
public Point( int x,int y ){
this.x = x;
this.y = y;
}
...
}
public class Cercle extends Point{
private int rayon;
public Cercle( int x,int y,int r ){
super( x,y );
rayon = r;
}
...
}

Amlie Lambert

2014-2015

53 / 82

Polymorphisme

Amlie Lambert

2014-2015

54 / 82

Polymorphisme
Le polymorphisme permet des objets de types diffrents dtre
manipuls avec une interface uniforme. Cest un des concepts essentiels
de la programmation oriente objet
polymorphisme vient du grec et signifie qui peut prendre plusieurs
formes
Le polymorphisme signifie quune mme opration peut se
traduire diffremment selon lobjet sur laquelle elle sapplique :
cest la capacit dun objet prendre plusieurs formes.
Alors que lhritage concerne les classes (et leur hirarchie), le
polymorphisme est relatif aux mthodes des objets.

Amlie Lambert

2014-2015

55 / 82

Exemple

// Reprenons la hirarchie PolygoneRegulier, et ajoutons la classe LiaisonRetardee


public class LiaisonRetardee{
public static void main( String[] args )throws IOException{
PolygoneRegulier p;
char reponse;
Scanner in = new Scanner(System.in);
System.out.println( "Polygonergulier(p,c,h)?" );
reponse = in.next().charAt( 0 );
switch ( reponse ){
case c:p = new Carre(...);
case h:p = new Hexagone(...);
case p:p = new PolygoneRegulier(...);
}
System.out.println( "surfacedep="+p.surface() );
}
}

Amlie Lambert

2014-2015

56 / 82

Polymorphisme
On ne connat qu lexcution la classe dappartenance de lobjet
dont la rfrence est affecte p.
Le choix du code excuter pour une mthode polymorphe ne se
fait pas statiquement la compilation mais dynamiquement
lexcution.
Le polymorphisme trouve son intrt lorsque lon veut construire
dynamiquement des structures de donnes dont les lments sont des
rfrences dobjets dune mme hirarchie.
En effet, la dclaration dune telle structure impose un type identique
tous les objets quelle est susceptible de contenir

Amlie Lambert

2014-2015

57 / 82

Polymorphisme : exemple
PolygoneRegulier[] p = new PolygoneRegulier[3];
Hexagone h = new Hexagone();
Carre c = new Carre();
PolygoneRegulier r = new PolygoneRegulier();
p[0] = h;
p[1] = c;
p[2] = r;
for ( int i=0;i<3;i++ ){
System.out.println( p[i].surface() );
}

La mthode surface() effectivement invoque nest connue qu


lexcution.
Si la mthode invoquer tait choisie la compilation, cest la mthode
surface() de PolygoneRegulier qui serait systmatiquement choisie.

Amlie Lambert

2014-2015

58 / 82

Exercice 3 (1/2)
class A extends Object{
public void m(){
System.out.println("mdelaclasseA");
}
}
class B extends A{
public void m(){
System.out.println("mdelaclasseB");
}
}
public class Poly03{
public static void main( String[] args ){
Object var = new B();
((B)var).m();
((A)var).m();
var.m();
var = new A();
((A)var).m();
}
}

Quel est le rsultat de chaque ligne de code ?


Amlie Lambert

2014-2015

59 / 82

Exercice 3 (2/2)

Object var = new B();


((B)var).m(); // On applique la mthode m de la classe B
((A)var).m(); // Polymorphisme : On applique la mthode m de la classe B, plutot que celle de A
var.m(); // chec la compilation : la methode m nest pas dedinie dans la classe Object
var = new A();
((A)var).m(); // On applique la mthode m de la classe A

Amlie Lambert

2014-2015

60 / 82

Mthodes et classes abstraites

Amlie Lambert

2014-2015

61 / 82

Mthodes et classes abstraites


Une classe abstraite est une classe qui ne peut pas tre instancie
directement.
Elle nest utilisable qu travers sa descendance. Une classe abstraite doit
toujours tre drive pour pouvoir gnrer des objets.
Elle est prcde du mot cl abstract
abstract class ClasseAbstraite
Lutilit dune classe abstraite est de permettre la factorisation des
attributs et mthodes communs un groupe de classes.
Dans une classe abstraite, on peut trouver des mthodes abstraites,(qui
nont pas dimplmentation possible dans la classe abstraite), qui doivent
obligatoirement tre implmentes diffremment dans toutes les
classes filles.
Amlie Lambert

2014-2015

62 / 82

Mthodes et classes abstraites (Exemple)

Au niveau de la classe Vehicule, la mthode print() na pas


beaucoup de sens
En revanche, au niveau des sous-classes, elle permet dafficher toutes
les informations utiles concernant un type de vhicule particulier

Amlie Lambert

2014-2015

63 / 82

Mthodes et classes abstraites (Exemple)

Amlie Lambert

2014-2015

64 / 82

Mthodes et classes abstraites (Exemple)

public abstract class Vehicule{


protected Position position;
public abstract void print();
public void deplacer( Position position ){
this.position = position;
}
...
}
public class Voiture extends Vehicule{
public void print(){
System.out.print( position.toString() );
}
}

Amlie Lambert

2014-2015

65 / 82

Mthodes et classes abstraites

Une classe abstraite ne peut pas tre instancie, mais on peut dfinir
des constructeurs qui seront invoqus dans les sous-classes
Si une sous-classe dune classe abstraite nimplmente pas toutes les
mthodes abstraites, cette sous-classe doit tre dclare abstraite.
Une sous-classe peut tre abstraite mme si sa super-classe est
concrte (exemple la super-classe Object)

Amlie Lambert

2014-2015

66 / 82

Classe abstraite et polymorphisme

Vehicule v;
Train t = new Train();
Bateau b = new bateau();
boolean presse;
...
if (presse)
v = t;
else
v = b;
v.print();

Une classe abstraite sert de modle. Elle ne peut pas tre instancie.
Quelle que soit la rfrence contenue dans dans v, on a la garantie que la
mthode print() est implante

Amlie Lambert

2014-2015

67 / 82

Interfaces

Amlie Lambert

2014-2015

68 / 82

Interfaces

En java, il ny a pas dhritage multiple.


Il serait donc impossible de faire hriter les classes Bateau, Train,
etc.. de la classe Canvas pour leur ajouter une mthode draw()
Le concept dinterface permet de remdier cette limitation
Une classe Java nhrite que dune seule classe, mais peut implanter
plusieurs interfaces

Amlie Lambert

2014-2015

69 / 82

Interfaces

Une interface est une sorte de classe abstraite qui contient


uniquement :
I
I

Des dclarations de mthodes


Des constantes static

Une interface ne peut pas tre instancie


Une interface peut hriter dune autre interface

Amlie Lambert

2014-2015

70 / 82

Interfaces (exemple)

public interface Transaction{


public void ajouter( double s );
public void retirer( double s );
}
public interface Comparable{
/
@param o objet comparer
@return <0 si lobjet est infrieur O
=0 si lobjet est gal O
>0 si lobjet est suprieur O
/
public int compareTo( Object o );
}

Linterface Comparable est issu de la classe java.lang.Comparable.

Amlie Lambert

2014-2015

71 / 82

Interfaces (exemple)
public class Compte implements Transaction,Comparable{
private String titulaire;
private double solde;
private String code;
public Compte( String t,String c ){
titulaire = t;
code = c;}
public void ajouter( double s ){
solde = solde+s; }
public void retirer( double s ){
solde = soldes; }
public double getSolde(){
return solde; }
public int compareTo( Object o ){
if( solde<((Compte)o).getSolde() )
return 1;
else if( solde>((Compte)o).getSolde() )
return 1;
else return 0;}
}
Amlie Lambert

2014-2015

72 / 82

Interfaces (exemple)
public class Reservoir implements Transaction,Comparable{
private double contenu;
public Reservoir( double c ){
contenu = c; }
public void ajouter( double s ){
contenu = contenu+s; }
public void retirer( double s ){
contenu = contenus; }
public double getContenu(){
return contenu; }
public int compareTo( Object o ){
if(contenu<((Reservoir)o).getContenu())
return 1;
else if(contenu>((Reservoir)o).getContenu())
return 1;
else return 0;}
}

Amlie Lambert

2014-2015

73 / 82

Conflit de noms
interface I1{
void m(double d);
void f();
void g(int i);}

interface I2{
void m(int i);
void f();
float g(int i);}

class A implements I1,I2{

m de I1 et m de I2 doivent tre dfinies


public void m(double d){....}
public void m(int i){....}

f est prsente dans les 2 interfaces, pas de conflit de noms car il suffit de
dfinir une mthode f pour satisfaire les besoins dimplmentation imposs
par les 2 interfaces.
public void f(){....}}

Les mthodes float g(int i) de I2 et void g(int i) de I1 sont bien


distinctes.
Elles ne peuvent pas pourtant pas tre dfinies dans la classe A puisquelles
ont le mme nom et les mmes arguments.
Lambigut est dcele par le compilateur
Amlie Lambert

2014-2015

74 / 82

Types, classes, interfaces

Un objet peut avoir plusieurs types (celui de sa classe et celui de son


ou de ses interfaces)
Diffrents objets ou instances de classes implmentant la mme
interface peuvent tre considrs comme ayant le mme type.

Amlie Lambert

2014-2015

75 / 82

Exercices

Amlie Lambert

2014-2015

76 / 82

Exercice 4 (1/2)
Quel est le rsultat de lexcution du programme suivant :
(Remarque : le constructeur sans paramtre de la classe Object est-il
invoqu lorsque new B(5) est excut ?)
public class Exo4{
public static void main(String[] args){
B b = new B(5);
}
}
class A{
public A(){
System.out.println("JesuisdansA");
}
}
public class B extends A{
public B(int x){
System.out.println("JesuisdansB");
}
}

Amlie Lambert

2014-2015

77 / 82

Exercice 4 (2/2)
Le programme affiche :
Je suis dans A
Je suis dans B
En effet, si le constructeur de la classe drive ninvoque pas le
constructeur de la classe de base explicitement avec linstruction
super(...), Java fait quand mme appel au constructeur, sans argument,
de la classe de base : super().
Un constructeur dfinit comme suit :
public Toto(String e) {this.e = e ; }
est automatiquement transform en
public Toto(String e) { super() ; this.e = e ; }

Amlie Lambert

2014-2015

78 / 82

Exercice 5 (1/2)
Quels sont les problmes identifis la compilation du programme suivant :
public class C3{
public static void main(String[] args){
B b = new B();
}
}
class A{
public A(int x){
System.out.println("Jevaux:"+x);
}
}
public class B extends A{
public B(){
System.out.println("JesuisdansB");
}
}

Amlie Lambert

2014-2015

79 / 82

Exercice 5 (2/2)

Les erreurs la compilation sont :


1

le constructeur public A() est absent

une seule classe peut tre publique par fichier

Amlie Lambert

2014-2015

80 / 82

Exercice 7 (1/2)
On veut manipuler dans un mme programme des objets caractriss par leur
couleur et leur position (respectivement de type Color et Position) et que lon
pourra dplacer et afficher.
Parmi ces objets, on trouve :
des photos, caractrises par leur taille et que lon pourra compresser
des figures gomtriques, carrs et des hexagones et plus gnralement des
polygones rguliers dfinis par le nombre et la longueur de leurs cots et des
cercles dfinis par leur rayon dont on pourra calculer la surface.
Notons que le calcul de la surface dune photo ou que la compression dune figure
gomtrique quelconque ne nous intresse pas.
On souhaite pouvoir ajouter dautres figures gomtriques possdant les mmes
caractristiques et quon pourra afficher lcran, dplacer et dont on pourra
aussi calculer surface.
Proposer larchitecture qui vous parat la plus adapte. Elle sera exprime en
UML. On ne sintressera donc pas au codage des mthodes mais seulement
leur dclaration.
Amlie Lambert

2014-2015

81 / 82

Exercice 7 (2/2)

Amlie Lambert

2014-2015

82 / 82

Вам также может понравиться