Documente Academic
Documente Profesional
Documente Cultură
RO CH EL L
A E
L
Licence IMAE
U. E. PARI54 / PARP521
« Programmation objet »
Octobre 2007
1 – Typage
Typage
Types primitifs
Exemple de conversions
short x = 5;
int y = 10;
y = x; // conversion implicite, OK
x = y; // erreur à la compilation
x = (short) y; // conversion explicite, OK
Type énuméré
unFeuTricolore.change(BLEU); // OK !...
int j = i.intValue();
int j = Integer.parseInt("123");
String s = Integer.toString(j);
Classes et objets
Création d’objets
☞ la classe Class :
Class typeInt = int.type;
Class typePoint = Point.class;
Référencement d’objets
String s = null;
Point p = null;
Utilisation d’objets
Copie d’objets
Le mot-clé this
Comparaison d’objets
if (s.equals(t)) // OK !...
System.out.println("égalité");
Surcharge de méthode
Les exceptions
Problème :
☞ l’auteur d’une bibliothèque peut détecter
les erreurs à l’exécution mais n’a, en
général, aucune idée de ce qu’il faut faire
ensuite...
☞ l’utilisateur peut savoir comment traiter
ces erreurs mais ne peut les détecter...
La notion d’exception est là pour aider au
traitement de ces problèmes.
La syntaxe
try
BlocInstructionsTry
catch (ClasseException exceptionInterceptee)
BlocInstructions
Exemple
class MaClasse
{
// ...
void uneMethode ()
{
try
{
// ...
throw new Exception ();
}
catch (Exception uneException)
{
// Que faire en cas d’exception ?
}
}
}
Exemple (suite)
class MaClasse
{
// ...
void uneMethode () throws ClasseException
{
// ...
// En cas d’erreur,
// déclenchement d’une exception
throw new ClasseException ();
// ...
}
}
class Fichier {
char[] lire(int nbCar) throws PbLecture {
...
throw new PbLecture();
}
void ecrire(char[] elts) throws PbEcriture {
...
throw new PbEcriture();
}
//...
}
La clause finally
Exception Description
IllegalArgumentException Valeur du paramètre
inappropriée
IllegalStateException L’état de l’objet
ne permet pas
l’exécution de la
méthode
NullPointerException Pointeur nul
IndexOutOfBoundException Valeur hors
intervalle
Pour résumer...
L’utilisation d’exceptions :
☞ permet une distinction nette entre la
détection des erreurs et leur traitement
☞ permet de conserver un code plus facile à
maintenir
☞ constitue un mécanisme efficace
Les « packages »
package fr.univ_lr.iupgi;
Importation de classes
Par défaut, toutes les classes appartenant au
package java.lang peuvent être utilisées avec
leur nom simple.
Toutes les classes en dehors de ce package
doivent être référencées par leur nom qualifié
(ex. java.io.File au lieu de File) .
Pour alléger la syntaxe des noms de classe, il
existe la (ou les) déclaration(s) « import » (qui
doit suivre « package ») .
import java.io.File;
// à partir d’ici, on peut utiliser
// le nom File au lieu de java.io.File
import java.io.*;
package fr.univ_lr.iupgi.monProjet;
☞ pas de préprocesseur
– définition de constantes
-→ champs static final
– pas de #include
-→ pas de besoin
– pas de compilation conditionnelle
-→ pas de besoin
☞ pas de variables globales
☞ taille standardisée des types primitifs
☞ pas d’arithmétique sur les pointeurs (*, &)
☞ pas de goto
☞ pas de struct ni de union
☞ pas de enum (jusqu’à la version 1.5)
☞ pas de typedef
L’héritage
Un exemple simple
BiblioMultimédia
CD K7Video
titre : string
emprunt : boolean
artiste : string
commentaires : string
nbTitres : string
metteurEnScene : string
durée : integer
titre : string
emprunt : boolean
durée : integer
commentaires : string
fixeCommentaires()
fixeCommentaires()
donneCommentaires()
donneCommentaires()
fixeEtatEmprunt()
fixeEtatEmprunt()
donneEtatEmprunt()
donneEtatEmprunt() affiche()
affiche()
Bibliothèque multimédia
Utilisation de l’héritage
BiblioMultimédia
ElementMultimédia
titre : string
durée : integer
emprunt : boolean
commentaires : string
fixeCommentaires()
donneCommentaires()
fixeEtatEmprunt()
donneEtatEmprunt()
affiche()
K7Video CD
Bibliothèque multimédia
Utilisation de extends
// constructeur et méthodes...
}
// constructeur et méthodes...
}
// constructeur et méthodes...
}
//méthodes...
}
Sous-typage
Sous-classes et sous-typage
Sous-classes et affectation
CD K7Video
Diagramme de classes
Diagramme d’objets
Polymorphisme (1)
eltPossedé ElementMultimédia
BiblioMultimédia
1 1..*
affiche()
CD K7Video
Polymorphisme (2)
eltPossedé ElementMultimédia
BiblioMultimédia
1 1..*
CD K7Video
affiche() affiche()
Mais :
– pour afficher les champs communs, il ne faut
pas que ceux-ci aient été déclarés private
– d’autre part, la méthode affiche n’est plus
connue pour le type ElementMultimédia
Polymorphisme (3)
Exemple :
Redéfinition de méthode
CD K7Video
affiche() affiche()
uneK7.affiche(); ElementMultimédia
+affiche()
K7Video uneK7;
K7Video
{instance-de}
:K7Video
unElt.affiche(); ElementMultimédia
+affiche()
{instance-de}
:K7Video
Exemple :
méthodes
données
Plusieurs raisons :
1. la plus importante est de masquer les
détails de la mise en œuvre
2. protéger la cohérence des données
(dépendance)
3. faciliter la mise au point des programmes
(le code modifant les données se situe
uniquement dans les méthodes)
4. simplifie la compréhension du
fonctionnement de l’objet (moins de
membres visibles)
Java mixe dans un même fichier l’interface et la
mise en œuvre (inconvénient en partie
compensé par un système de documentation
(pages HTML) du code)
Exemple
package P1;
class Cercle {
protected double r;
...
}
package P2;
package A package B
A.C3 B.C6
A.C1
B.C5
A.C2
A.C4
Accès private
package A package B
A.C3 B.C6
A.C1
B.C5
A.C2
A.C4
Accès protected
package A package B
A.C3 B.C6
A.C1
B.C5
A.C2
A.C4
A.C3
A.C1 B.C6
B.C5
A.C2
A.C4
Accès public
Pour résumer...
Visibilité
Accessible à : public protected défaut private
La classe le définissant ✔ ✔ ✔ ✔
Une classe ✔ ✔ ✔ -
dans le même paquetage
Une sous-classe ✔ ✔ - -
dans un autre paquetage
Une non sous-classe ✔ - - -
dans un autre paquetage
x // attribut x dans C
this.x // attribut x dans C
super.x // attribut x dans B
((B) this).x // attribut x dans B
((A) this).x // attribut x dans A
super.super.x // illegal...
class A {
int i = 1;
int f() { return i; }
static char g() { return ’A’; }
}
class B extends A {
int i = 2;
int f() { return -i; }
static char g() { return ’B’; }
}
Conformité à un protocole
Exemple :
class Dessin {
void ajouterCercle(Cercle c) { ... }
}
d.ajouterCercle(c);
// OK car CercleGraphique hérite de Cercle
class A {
int i = 1;
int f() { return i; }
}
class B extends A {
int i;
int f() {
i = super.i + 1;
return super.f() + i;
}
}
▲ super.i ≡ ((A)this).i
Classes abstraites
double surfaceTotale = 0;
for(int i=0; i < formes.length; i++)
surfaceTotale += formes[i].aire();
Les interfaces
Un exemple d’interface :
Comparaison
classe abstraite ↔ interface
Exemple :
interface Modifiable extends Redimensionnable,
Translatable
{ .. }
Exemple :
interface Lire {
public int lire();
}
interface Ecrire {
public void ecrire(int i);
}
// dans le main :
LireEcrire le = new LireEcrire();
obj.traitement(le);
Exemple :
class AutreClasse {
public static Lire donneLire() {
return new LireEcrire();
}
}
// dans le main :
Lire l = AutreClasse.donneLire();
obj.traitement(l);
Exemple :
+ paint(Graphics)
CercleGraphique
Cercle
Héritage et délégation
+ circonference(): float
+ paint(Graphics) + aire() : float
CercleGraphique
CercleImpl
Classe interne
Exemple :
public class MaFenetre extends Frame {
private boolean ferme = false;
// déclaration de la classe interne
class WinListner extends WindowAdapter {
private boolean attLocal;
public void windowClosing(WindowEvent e) {
ferme = true;
System.exit(0);
}
}
:WinListner
attLocal
référence à la
classe
englobante f: MaFenetre
ferme
Exemple :
public class MaFenetre extends Frame
{
// déclaration de la classe interne
static class WinListner extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
Classe anonyme
C’est une forme particulière de classe interne.
Les conteneurs
Les événements
Architecture
Architecture (suite)
Exemple
Exemple (suite)
public class CelsiusConverter implements ActionListener {
JFrame converterFrame;
JPanel converterPanel;
JTextField tempCelsius;
JLabel celsiusLabel, fahrenheitLabel;
JButton convertTemp;
public CelsiusConverter() {
// création et configuration de la fenêtre.
converterFrame =
new JFrame("Convertisseur Celsius to Fahrenheit");
converterFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
converterFrame.setSize(new Dimension(120, 40));
// affichage de la fenêtre
converterFrame.pack();
converterFrame.setVisible(true);
}
Exemple (suite)
/**
* Création et ajout des composants graphiques.
*/
private void addWidgets() {
//Create widgets.
// affichage de la fenêtre
tempCelsius = new JTextField("0",2);
celsiusLabel = new JLabel("Celsius", SwingConstants.LEFT);
convertTemp = new JButton("Convertir");
fahrenheitLabel = new JLabel("Fahrenheit",SwingConstants.LEFT);
celsiusLabel.setBorder(
BorderFactory.createEmptyBorder(5,5,5,5));
fahrenheitLabel.setBorder(
BorderFactory.createEmptyBorder(5,5,5,5));
}
/**
* Création et affichage de l’IHM. Pour la sûreté des threads
* cette méthode doit être appelée à partir du thread
* de gestion des événements
*/
private static void createAndShowGUI() {
CelsiusConverter converter = new CelsiusConverter();
}
Exemples :
– lire un port de données et permettre en
même temps à l’utilisateur d’interagir avec
l’interface...
– charger une image et commencer des calculs
sur les morceaux déjà chargés...
Création de threads
Il existe deux moyens de créer une tâche
(attention à ne pas confondre création et
activation) :
☞ soit hériter de la classe Thread puis
redéfinir la méthode run()
public class TestThread extends Thread
{
private static int threadCreees = 0;
private static int threadExec = 0;
public TestThread() { threadCreees++;}
public void run() {
threadExec++;
// traitement ...
}
public static void main(String args[])
{
try {
TestThread t = new TestThread();
}
catch (InterruptedException e) { }
}
}
class EssaiApRun {
public static void main(String args[])
{
try {
Thread t;
t = new Thread(new ApRun());
}
catch (InterruptedException e) { }
}
}
Gestion de threads
stop()
Créé Mort
stop()
stop()
start() fin de run()
yield()
Exécutable Exécuté
Thread vivant
Choix de l’ordonnanceur
Synchronisation de threads
L’instruction « synchronized »
synchronized ( expression ) {
instructions
}
Le qualificateur « synchronized »
Attention !...
☞ Java ne spécifie pas d’ordre dans le
déblocage des tâches.
☞ risques d’interblocage (deadlock)
Exemple :
class Ressource {
synchronized void attendLaRessource() {
try {
// bonne manière d’utiliser le wait
while (condition non vérifiée) {
wait();
}
// condition vérifiée...
}
catch (InterruptedException e) { }
}
synchronized void laRessourceEstDispo() {
notify(); // ou notifyAll()
}
}
yield()
Exécutable Exécuté
Choix de
l’ordonnanceur
resume()
notify() suspend()
délai sleep() écoulé
notifyAll() sleep() wait()
objet déverrouillé
délai wait() objet verrouillé
suspend() écoulé
Bloqué Attente
Thread vivant
Version composition
Request methodeSpec.
adapté
Adapter
Request adapté.methodSpec()
© rd ret
Iterator
Aggregate Client
first
createIterator next
done
current
ConcreteAggregate
ConcreteIterator
observers
Subject Observer
Attach Update
Detach
Notify forall observers
o.update
subject
ConcreteSubject ConcreteObserver
Update
subject.action
© rd ta
Octobre 2007 Introduction au langage Java Page 141
11 – Design patterns
Le diagramme de séquence :
Le modèle MVC
a Elle
peut également présenter un intérêt même avec
une interface en mode console.
Un petit exemple
La bibliothèque Java
Elle comprend :
– plusieurs milliers de classes
(environ 12 500 classes dans le fichier
rt.jar de la version 1.5)
– plusieurs dizaines de milliers de méthodes
– beaucoup de classes facilitant et donc
accélérant le développement d’applications
Documentation associée
Elle comprend :
– le nom de la classe
– une description générale de la classe
– Une liste des constructeurs et des méthodes
– Les valeurs de retour et les paramètres des
constructeurs et des méthodes
– Une description du rôle de chaque
constructeur et méthode
Organisation
Paquetage Description
java.beans Un modèle de composant logiciel
java.io Gestion des entrées-sorties
java.lang Les classes fondamentales :
String, Math, etc...
java.net Programmation réseau
java.security Contrôle des accès
+ authentification/crytographie
java.text Gestion de l’internationalisation
java.util Classes conteneurs : Set, List
java.sql Accès aux SGBD (JDBC)
java.awt Objets graphiques de base
javax.swing Objets graphiques avancés
Conteneurs (java.util)
Architecture
Architecture (suite)
La notion d’itérateur
Types génériques
La boucle for-each
Ainsi la boucle :
List<String> ls; // déjà initialisée
for(Iterator i= ls.iterator(); i.hasNext();)
traitement(i.next());
peut s’écrire
for(String s : ls)
traitement(s);
Les dictionnaires
Commentaires
Exemples
➠ Utilisation d’un HashSet
Set s = new HashSet();
s.add("test");
boolean b = s.contains("test2");
s.remove("test");
➠ Utilisation de listes
// + efficace en insertion
List l = new LinkedList();
// + efficace en acces
l = new ArrayList();
// ajoute tous les elts de s
l.addAll(ss);
// m̂ chose mais en 1ere position
l.addAll(1,ss);
Object o = l.get(1); // acces indexe
Entrées-sorties (java.io)
Concept général
☞ un « tube » : PipedInputStream/PipedReader
InputStream
FileInputStream
Version binaire
PipedInputStream
....
Reader
InputStreamReader
Version caractère
....
FileReader
PipedReader
☞ un « tube » : PipedOuputStream/PipedWriter
Exemple d’utilisation :
La persistance en Java
Exemple :
FileOutputStream fichier = new FileOutputStream("monFichier.ser");
ObjectOutputStream sortie = new ObjectOutputStream(fichier);
sortie.writeObject(monObjet); // sérialisation
sortie.close();
Exemple :
public class PersistentAnimation
implements Serializable,Runnable {
transient private Thread animator;
private int animationSpeed;
public PersistentAnimation(int animationSpeed) {
this.animationSpeed = animationSpeed;
animator = new Thread(this);
animator.start();
}
public void run() {
while(true) {
// réaliser l’animation...
}
}
}
Les applets
Comment ?
<applet code="AppletWorld.class"
width="200" height="200" />
appletviewer AppletWorld.html
Exemple :
import javax.swing.JApplet;
import java.awt.Graphics;
init(
)
start()
Applet Applet
chargée stop() exécutée
y ()
s tro
d e
Thread et applet
Restrictions de sécurité
Les servlets
Exemple
import java.io.*;
import javax.servlet.*;
Le contexte
LastName=Martin&FirstName=Paul
http://test.org/servlets/Bonjour?nom=fred
Le conteneur de servlet
try {
serverSocket = new ServerSocket(port, 1,
InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) { ...}
try {
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();
// fermeture du socket
socket.close();
Autres aspects
– Mécanisme de session
– Utilisation de Cookies
– Utilisation de listes de contrôle d’accès
– Gestion de la concurrence
– Implémentation de référence : Tomcat
Références
Bibliographie
☞ Design Patterns
E. Gamma, R. Helm, R. Johnson & J. Vlissides
Ed. International Thomson Publishing
Liens
2 Types primitifs
4 Exemple de conversions
5 Type énuméré
10 Classes et objets
10 Création d’objets
12 Référencement d’objets
13 Utilisation d’objets
14 Copie d’objets
16 Le mot-clé this
17 Comparaison d’objets
19 Surcharge de méthode
22 Les exceptions
23 La syntaxe
24 Exemple
25 Exemple (suite)
32 Pour résumer...
33 Les « packages »
35 Importation de classes
39 L’héritage
40 Un exemple simple
42 Utilisation de l’héritage
43 Utilisation de extends
48 Sous-typage
49 Sous-classes et sous-typage
50 Sous-classes et affectation
54 Polymorphisme (1)
55 Polymorphisme (2)
56 Polymorphisme (3)
58 Redéfinition de méthode
77 Conformité à un protocole
81 Classes abstraites
85 Les interfaces
116 Architecture
118 Exemple
154 Organisation
182 Exemple
183 Le contexte
192 Références
192 Bibliographie
193 Liens