Vous êtes sur la page 1sur 28

Cours programmationoriente objet en Java

Licence dinformatique
Hugues Fauconnier
hf@liafa.jussieu.fr

Plan du cours














Introduction:


programmation objet pourquoi? Comment? Un exemple en Java



Mthode et variables, constructeurs, contrle daccs



Extension de classe, mthode et hritage, variables et hritage, constructeurs et hritage



Classe Object, clonage, classes abstraites et interface, Classes internes et embotes



Classe Object, clonage, classes abstraites et interface, classes internes et embotes



Exceptions, assertions



Enumeration, tableaux, conversions, noms



Gnralits, types gnriques imbriqus, types paramtres borns, mthodes gnriques



String et expressions rgulires, Collections, Conteneurs, itrations



Reflections, annotations, documentation

Classes et objets
Hritage

Hritage: complments

Object, Interfaces, classes imbriques


Exceptions
Divers

Gnricit

Types de donnes

Entre-sortie
Introduction Swing
Threads
Complments

Le site du cours: http://www.liafa.jussieu.fr/~hf/verif/ens/an08-09/poo/L3.POO.html


POO-L3 H. Fauconnier

Bibliographie



De nombreux livres sur java (attention


java >= 1.5)
En ligne:






http://mindview.net/Books/TIJ4
Thinking in Java, 4th edition Bruce Eckel
http://java.sun.com/docs/index.html

Livre conseill:


The Java Programming language fourth


edition AW Ken Arnold, James Gosling,
David Holmes

POO-L3 H. Fauconnier

Chapitre I
Introduction

A) Gnralits


Problme du logiciel:






Taille
Cot : dveloppement et maintenance
Fiabilit

Solutions :


Modularit



Rutiliser le logiciel



Certification


Comment?

POO-L3 H. Fauconnier

Typage


Histoire:





Fonctions et procdures (60 Fortran)


Typage des donnes (70) Pascal Algol
Modules: donnes + fonctions regroupes
(80) ada
Programmation objet: classes, objets et
hritage

POO-L3 H. Fauconnier

B) Principes de base de la POO




Objet et classe:





Classe = dfinitions pour des donnes


(variables) + fonctions (mthodes) agissant
sur ces donnes
Objet = lment dune classe (instance)
avec un tat
(une mthode ou une variable peut tre



de classe = commune la classe ou


dinstance = dpendant de linstance
POO-L3 H. Fauconnier

Principes de bases (suite)




Encapsulation et sparation de la
spcification et de limplmentation


Sparer limplmentation de la spcification.






Ne doit tre visible de lextrieur que ce qui est


ncessaire, les dtails dimplmentation sont cachs

Hritage:


Une classe peut hriter des proprits dune


autre classe: un classe peut tre une extension
dune autre classe.
POO-L3 H. Fauconnier

Principes de bases de la POO




Mais surtout notion de polymorphisme:




Si une classe A est une extension dune classe B:







A doit pouvoir redfinir certaines mthodes (disons f())


Un objet a de classe A doit pouvoir tre considr
comme un objet de classe B
On doit donc accepter :







B b;
b=a; (a a toutes les proprits dun B)
b.f()

Doit appeler la mthode redfinie dans A!
Cest le transtypage

(exemple: mthode paint des interfaces graphiques)


POO-L3 H. Fauconnier

Principes de bases


Polymorphisme:

Ici lassociation entre le nom f() et le code (code


de A ou code de B) a lieu dynamiquement (=
lexcution)
Liaison dynamique
 On peut aussi vouloir paramtrer une classe
(ou une mthode) par une autre classe.
Exemple: Pile dentiers
Dans ce cas aussi un nom peut correspondre
plusieurs codes, mais ici lassociation peut avoir
lieu de faon statique (au moment de la
compilation)


POO-L3 H. Fauconnier

10

C) Comment assurer la
rutilisation du logiciel?


Type abstrait de donnes






dfinir le type par ses proprits (spcification)

Interface, spcification et implmentation





Une interface et une spcification (=les


proprits assurer) pour dfinir un type
Une (ou plusieurs) implmentation du type
abstrait de donnes


Ces implmentations doivent vrifier la spcification

POO-L3 H. Fauconnier

11

Comment assurer la rutilisation


du logiciel?


Pour lutilisateur du type abstrait de


donnes




Accs uniquement linterface (pas


daccs limplmentation)
Utilisation des proprits du type abstrait
telles que dfinies dans la spcification.
(Lutilisateur est lui-mme un type abstrait
avec une interface et une spcification)
POO-L3 H. Fauconnier

12

Comment assurer la rutilisation


du logiciel?


Mais en utilisant un type abstrait


lutilisateur n'en connat pas
limplmentation





il sait uniquement que la spcification du


type abstrait est suppose tre vrifie
par l'implmentation.

Pour la ralisation concrte, une


implmentation particulire est choisie
Il y a naturellement polymorphisme
POO-L3 H. Fauconnier

13

Notion de contrat (Eiffel)











Un client et un vendeur
Un contrat lie le vendeur et le client (spcification)
Le client ne peut utiliser lobjet que par son
interface
La ralisation de lobjet est cache au client
Le contrat est conditionn par lutilisation correcte
de lobjet (pr-condition)
Sous rserve de la pr-condition le vendeur sengage
ce que lobjet vrifie sa spcification (postcondition)
Le vendeur peut dlguer: lobjet dlgu doit
vrifier au moins le contrat (hritage)
POO-L3 H. Fauconnier

14

D) Un exemple


Pile abstraite et diverses


implmentations

POO-L3 H. Fauconnier

15

Type abstrait de donnes


NOM
pile[X]
FONCTIONS
vide : pile[X] -> Boolean
nouvelle : -> pile[X]
empiler : X x pile[X] -> pile[X]
dpiler : pile[X] -> X x pile[X]
PRECONDITIONS
dpiler(s: pile[X]) <=> (not vide(s))
AXIOMES
forall x in X, s in pile[X]
vide(nouvelle())
not vide(empiler(x,s))
dpiler(empiler(x,s))=(x,s)
POO-L3 H. Fauconnier

16

Remarques







Le type est paramtr par un autre


type
Les axiomes correspondent aux pr
conditions
Il ny pas de reprsentation
Il faudrait vrifier que cette dfinition
caractrise bien un pile au sens usuel du
terme (cest possible)
POO-L3 H. Fauconnier

17

Pile abstraite en java


package pile;
abstract class Pile
abstract public
abstract public
abstract public
}

<T>{
T empiler(T v);
T dpiler();
Boolean estVide();

POO-L3 H. Fauconnier

18

Divers







package: regroupement de diverses


classes
abstract: signifie quil ny a pas
dimplmentation
public: accessible de lextrieur
La classe est paramtre par un type
(java 1.5)
POO-L3 H. Fauconnier

19

Implmentations


On va implmenter la pile:





avec un objet de classe Vector (classe


dfinie dans java.util.package) en fait
il sagit dun ListArray
Avec un objet de classe LinkedList
Avec Integer pour obtenir une pile de
Integer

POO-L3 H. Fauconnier

20

Une implmentation
package pile;
import java.util.EmptyStackException;
import java.util.Vector;
public class MaPile<T> extends Pile<T>{
private Vector<T> items;
// Vector devrait tre remplac par ArrayList
public MaPile() {
items =new Vector<T>(10);
}
public Boolean estVide(){
return items.size()==0;
}
public T empiler(T item){
items.addElement(item);
return item;
}
POO-L3 H. Fauconnier
//

21

Suite
//
public synchronized T dpiler(){
int len = items.size();
T item = null;
if (len == 0)
throw new EmptyStackException();
item = items.elementAt(len - 1);
items.removeElementAt(len - 1);
return item;
}
}
POO-L3 H. Fauconnier

22

Autre implmentation avec listes


package pile;
import java.util.LinkedList;
public class SaPile<T> extends Pile<T> {
private LinkedList<T> items;
public SaPile(){
items = new LinkedList<T>();
}
public Boolean estVide(){
return items.isEmpty();
}
public T empiler(T item){
items.addFirst(item);
return item;
}
public T dpiler(){
return items.removeFirst();
}
}
POO-L3 H. Fauconnier

23

Une pile de Integer


public class PileInteger extends Pile<Integer>{
private Integer[] items;
private int top=0;
private int max=100;
public PileInteger(){
items = new Integer[max];
}
public Integer empiler(Integer item){
if (this.estPleine())
throw new EmptyStackException();
items[top++] = item;
return item;
}
//

POO-L3 H. Fauconnier

24

Suite
public synchronized Integer dpiler(){
Integer item = null;
if (this.estVide())
throw new EmptyStackException();
item = items[--top];
return item;
}
public Boolean estVide(){
return (top == 0);
}
public boolean estPleine(){
return (top == max -1);
}
protected void finalize() throws Throwable {
items = null; super.finalize();
}
}
POO-L3 H. Fauconnier

25

Comment utiliser ces classes?








Le but est de pouvoir crire du code


utilisant la classe Pile abstraite
Au moment de lexcution, bien sr, ce
code sappliquera un objet concret
(qui a une implmentation)
Mais ce code doit sappliquer toute
implmentation de Pile
POO-L3 H. Fauconnier

26

Un main
package pile;
public class Main {
public static void vider(Pile p){
while(!p.estVide()){
System.out.println(p.dpiler());
}
}
public static void main(String[] args) {
MaPile<Integer> p1= new MaPile<Integer>();
for(int i=0;i<10;i++)
p1.empiler(i);
vider(p1);
SaPile<String> p2= new SaPile<String>();
p2.empiler("un");
p2.empiler("deux");
p2.empiler("trois");
vider(p2);
}
POO-L3 H. Fauconnier

27

E) java: quelques rappels







Un source avec le suffixe .java


Une classe par fichier source (en principe)
mme nom pour la classe et le fichier source
(sans le suffixe .java)
Mthode
public static void main(String[]);





main est le point dentre

Compilation gnre un .class


Excution en lanant la machine java
POO-L3 H. Fauconnier

28

Gnralits


Un peu plus quun langage de programmation:









gratuit!
Indpendant de la plateforme
Langage interprt et byte code


Portable



Nombreuses bibliothques

Syntaxe la C
Orient objet (classes hritage)
Pas de pointeurs! (ou que des pointeurs!)






Ramasse-miettes

Multi-thread
Distribu (WEB) applet, servlet etc
url: http://java.sun.com


http://java.sun.com/docs/books/tutorial/index.html
POO-L3 H. Fauconnier

29

Plateforme Java




La compilation gnre un .class en bytecode (langage


intermdiaire indpendant de la plateforme).
Le bytecode est interprt par un interprteur Java
JVM

Compilation javac
interprtation java

POO-L3 H. Fauconnier

30

Langage intermdiaire et
Interprteur


Avantage: indpendance de la
plateforme




change de byte-code (applet)

Inconvnient: efficacit

POO-L3 H. Fauconnier

31

Plateforme Java





La plateforme java: software au-dessus dune


plateforme excutable sur un hardware (exemple
MacOs, linux )
Java VM
Java application Programming Interface (Java API):

POO-L3 H. Fauconnier

32

Tout un environnement


Java 2 sdk: JRE (java runtime environment + outils


de dveloppements compilateur, debogueurs etc)

POO-L3 H. Fauconnier

33

Trois exemples de base






Une application
Une applet
Une application avec interface
graphique

POO-L3 H. Fauconnier

34

Application:


Fichier Appli.java:
/**
* Une application basique...
*/
class Appli {
public static void main(String[] args) {
System.out.println("Bienvenue en
L3..."); //affichage
}
}

POO-L3 H. Fauconnier

35

Compiler, excuter



Crer un fichier Appli.java


Compilation:





Cration de Appli.class (bytecode)


Interprter le byte code:




javac Appli.java

java Appli

Attention aux suffixes!!!




(il faut que javac et java soient dans $PATH)

Exception in thread "main" java.lang.NoClassDefFoundError:




Il ne trouve pas le main -> vrifier le nom!


Variable CLASSPATH ou option -classpath
POO-L3 H. Fauconnier

36

Remarques



Commentaires /* */ et //
Dfinition de classe





une classe contient des mthodes (=fonctions) et des


variables
Pas de fonctions ou de variables globales (uniquement dans
des classes ou des instances)

Mthode main:


public static void main(String[] arg)









public
static
Void
String

Point dentre
POO-L3 H. Fauconnier

37

Remarques


Classe System




out est une variable de la classe System


println mthode de System.out
out est une variable de classe qui fait
rfrence une instance de la classe
PrintStream qui implmente un flot de
sortie.


Cette instance a une mthode println


POO-L3 H. Fauconnier

38

Remarques



Classe: dfinit des mthodes et des variables


(dclaration)
Instance dune classe (objet)







Mthode de classe: fonction associe (toute la)


classe.
Mthode dinstance: fonction associe une
instance particulire.
Variable de classe: associe une classe (globale
et partage par toutes les instances)
Variable dinstance: associe un objet (instanci)

Patience

POO-L3 H. Fauconnier

39

Applet:


Applet et WEB




Client (navigateur) et serveur WEB


Le client fait des requtes html, le serveur
rpond par des pages html
Applet:






Le serveur rpond par une page contenant des applets


Applet: byte code
Code excut par le client
Permet de faire des animations avec interfaces
graphiques sur le client.
Une des causes du succs de java.

POO-L3 H. Fauconnier

40

Exemple applet


Fichier MonApplet.java:
/**
* Une applet basique...
*/
import java.applet.Applet;
import java.awt.Graphics;
public class MonApplet extends Applet {
public void paint(Graphics g){
g.drawString("Bienvenue en en L3...", 50,25);
}
}
POO-L3 H. Fauconnier

41

Remarques:


import et package:







Un package est un regroupement de classes.


Toute classe est dans un package
Package par dfaut (sans nom)
classpath

import java.applet.*;


Importe le package java.applet





Applet est une classe de ce package,


Sans importation il faudrait java.applet.Applet
POO-L3 H. Fauconnier

42

Remarques:



La classe Applet contient ce quil faut


pour crire une applet
extends Applet:


La classe dfinie est une extension de la


classe Applet:






Elle contient tout ce que contient la classe


Applet
(et peut redfinir certaines mthodes (paint))

Patience!!

POO-L3 H. Fauconnier

43

Remarques




Une Applet contient les mthodes paint start et init.


En redfinissant paint, lapplet une fois lance
excutera ce code redfini.
Graphics g argument de paint est un objet qui
reprsente le contexte graphique de lapplet.



drawString est une mthode (dinstance) qui affiche une


chane,
50, 25: affichage partir de la position (x,y) partir du
point (0,0) coin en haut gauche de lapplet.

POO-L3 H. Fauconnier

44

Pour excuter lapplet






Lapplet doit tre excute dans un


navigateur capable dinterprter du
bytecode correspondant des applet.
Il faut crer un fichier HTML pour le
navigateur.

POO-L3 H. Fauconnier

45

Html pour lapplet




Fichier Bienvenu.html:

<HTML>
<HEAD>
<TITLE> Une petite applet </TITLE>
<BODY>
<APPLET CODE='MonApplet.class' WIDTH=200
Height=50>
</APPLET>
</BODY>
</HTML>
POO-L3 H. Fauconnier

46

Html



Structure avec balises:


Exemples:




<HTML> </HTML>

url:




Ici:

<a target="_blank" href="http://


www.liafa.jussieu.f/~hf">page de hf</a>

<APPLET CODE='MonApplet.class' WIDTH=200


Height=50>
</APPLET>

POO-L3 H. Fauconnier

47

Exemple interface graphique


Fichier MonSwing.java:
/**
* Une application basique... avec interface graphique
*/
import javax.swing.*;
public class MonSwing {
private static void creerFrame() {
//Une formule magique...
JFrame.setDefaultLookAndFeelDecorated(true);
//Creation d'une Frame
JFrame frame = new JFrame("MonSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Afficher un message
JLabel label = new JLabel("Bienvenue en L3...");
frame.getContentPane().add(label);
//Afficher la fentre
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
creerFrame();
POO-L3 H. Fauconnier
}
}

48

Remarques








Importation de packages
Dfinition dun conteneur top-level JFrame,
implment comme instance de la classe JFrame
Affichage de ce conteneur
Dfinition dun composant JLabel, implment comme
instance de JLabel
Ajout du composant JLabel dans la JFrame
Dfinition du comportement de la JFrame si sur un
click du bouton de fremeture
Une mthode main qui cre la JFrame
POO-L3 H. Fauconnier

49

Pour finir





Java 1.5 annotations, types mthodes


paramtrs par des types
Trs nombreux packages
Nombreux outils de dveloppement
(gratuits)


eclipse, netbeans..

POO-L3 H. Fauconnier

50

Supplment gratuit

POO-L3 H. Fauconnier

51

Entre-sortie
public static void main(String[] args) {
// sortie avec printf ou
double a = 5.6d ;
double b = 2d ;
String mul = "multipli par" ;
String eq="gal";
System.out.printf(Locale.ENGLISH,
"%3.2f X %3.2f = %6.4f \n", a ,b , a*b);
System.out.printf(Locale.FRENCH,
"%3.2f %s %3.2f %s %6.4f \n", a, mul,b eq,a*b);
System.out.format(
"Aujourd'hui %1$tA, %1$te %1$tB,"+
" il est: %1$tH h %1$tM min %1$tS \n",
Calendar.getInstance());
// System.out.flush();
POO-L3 H. Fauconnier

52

Sortie
5.60 X 2.00 = 11.2000
5,60 multipli par 2,00 gal 11,2000
Aujourd'hui mardi, 10 octobre, il est: 15 h
31 min 01

POO-L3 H. Fauconnier

53

Scanner
Scanner sc = new Scanner(System.in);
for(boolean fait=false; fait==false;){
try {
System.out.println("Rpondre o ou O:");
String s1 =sc.next(Pattern.compile("[0o]"));
fait=true;
} catch(InputMismatchException e) {
sc.next();
}
}
if (sc.hasNextInt()){
int i= sc.nextInt();
System.out.println("entier lu "+i);
}
System.out.println("next token :"+sc.next());
sc.close();
POO-L3 H. Fauconnier

54

Scanner
if (sc.hasNextInt()){
int i= sc.nextInt();
System.out.println("entier lu "+i);
}
System.out.println("next token :"+sc.next()); sc.close();
String input = "1 stop 2 stop lphant gris stop rien";
Scanner s = new(Scanner(input).useDelimiter("\\s*stop\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
}

POO-L3 H. Fauconnier

55

POO-L3 H. Fauconnier

56

Sortie






next token :o
1
2
lphant gris
rien