Vous êtes sur la page 1sur 28

Cours programmationoriente objet en Java

Licence dinformatique Hugues Fauconnier


hf@liafa.jussieu.fr

Plan du cours
Introduction: Classes et objets Hritage
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

Hritage: complments

Object, Interfaces, classes imbriques Exceptions Divers

Gnricit

Types de donnes

Entre-sortie Introduction Swing Threads Complments

Reflections, annotations, documentation

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


POO-L3 H. Fauconnier 2

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 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 8

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 9

Principes de bases
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

Polymorphisme:

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

Pour la ralisation concrte, une implmentation particulire est choisie Il y a naturellement polymorphisme
POO-L3 H. Fauconnier 13

il sait uniquement que la spcification du type abstrait est suppose tre vrifie par l'implmentation.

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) Pas de pointeurs! (ou que des pointeurs!)
Ramasse-miettes Nombreuses bibliothques Portable

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:
java Appli javac Appli.java

Attention aux suffixes!!!

(il faut que javac et java soient dans $PATH) Il ne trouve pas le main -> vrifier le nom! Variable CLASSPATH ou option -classpath
POO-L3 H. Fauconnier 36

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

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) public static void main(String[] arg)
public static Void String

Mthode main:

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:

Patience!!

Elle contient tout ce que contient la classe Applet (et peut redfinir certaines mthodes (paint))

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

Sortie
next token :o 1 2 lphant gris rien

POO-L3 H. Fauconnier

56

Vous aimerez peut-être aussi