Vous êtes sur la page 1sur 63

Cours programmationoriente objet en Java

Licence dinformatique
Hugues Fauconnier
hf@liafa.jussieu.fr

Plan du cours

Introduction:

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

Types de donnes

Enumeration, tableaux, conversions, noms

Gnricit

Exceptions, assertions

Divers

classes abstraites et interfaces, classes internes et embotes, classe Object, clonage,

Exceptions

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

Hritage: complments

Mthodes et variables, constructeurs, contrle daccs, constructeurs

Hritage: liaison dynamique et typage

programmation objet pourquoi? Comment? Un exemple en Java

Classes et objets (rvision)

String et expressions rgulires, Collections, Conteneurs, itrations

Entres-sorties
Introduction Swing
Threads
Complments

Reflections, annotations, documentation

Le site du cours: http://www.liafa.jussieu.fr/~hf/verif/ens/an09-10/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

POO-L3 H. Fauconnier

Comment?
5

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

Syntaxe la C
Orient objet (classes hritage)

Nombreuses bibliothques

Pas de pointeurs! (ou que des pointeurs!)

Portable

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 sur un
click du bouton de fremeture
Une mthode main qui cre la JFrame
POO-L3 H. Fauconnier

49

Pour finir

Java 1.5 et 6 annotations, types


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

eclipse, netbeans..

POO-L3 H. Fauconnier

50

En plus

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

Sortie

next token :o
1
2
lphant gris
rien

POO-L3 H. Fauconnier

56

Les classes

System

System.out variable (static) de classe


PrintStream

PrintStream contient print (et printf)

System.in variable (static) de classe


InputStream

Scanner
POO-L3 H. Fauconnier

57

Chapitre II
Classes et objets
(rappels)
(mais pas dhritage)

Classes et objets

I) Introduction
II) Classe: membres et modificateurs
III) Champs: modificateurs
IV) Vie et mort des objets,
Constructeurs
V) Mthodes
VI) Exemple

classes et objets

POO-L3 H. Fauconnier

59

I) Introduction

Classe

Regrouper des donnes et des mthodes

Classes<->type

Objet (ou instance)

Rsultat de la cration dun objet

Variables de classe
Mthodes de classe

Variables dinstance
Variables de classe

Toute classe hrite de la classe Object

classes et objets

POO-L3 H. Fauconnier

60

II) Classes

Membres dune classe sont:

Champs = donnes
Mthodes = fonctions
Classes imbriques

classes et objets

POO-L3 H. Fauconnier

61

Modificateur de classe

Prcde la dclaration de la classe

Annotations (plus tard)


public (par dfaut package)
abstract(incomplte, pas dinstance)
final(pas dextension)
Strictfp (technique)

classes et objets

POO-L3 H. Fauconnier

62

III) Champs

Modificateurs

annotations
Contrle daccs

private
protected
public
package

static (variables de classe)


final (constantes)
transient
Volatile

Initialisations
Cration par oprateur new

classes et objets

POO-L3 H. Fauconnier

63