Title: Pr
1Présentation du cours de Conception et de
Programmation Orientée Objet - Java
- Philippe Canalda
- Master 1 PSM Montbéliard Conception et
Programmation Avancée MultiMédia - UFR STGI / LiFC FRE CNRS 2661
- Philippe.Canalda_at_univ-fcomte.fr
- http//psm.pu-pm.univ-fcomte.fr/pcanalda
- Octobre 2007
2En préambule
- Organisation
- En groupe de 4 au sein de votre groupe de TP
- Nomination du 1er groupe prenant les notes dans
ce cours et chargé de délivrer - À la fin de la journée, un cr
- À la fin de la semaine une version
corrigée/étenduematériel utilisé tous les
matériaux de ce cours src présentation, codes
src, corrections dexercices, etc.intégration du
travail dautrui
31ère intervention CM prises de notes X Y
- Organisation de lenseignement
- 1ère illustration dune application intégrant une
caméra, un mur décran, un service (architecture
serveur ou C/S) - qui détermine les groupes détudiants de 4
éléments (complétion à moins) au sein des
sous-groupes A, B et C - Affichage des visages à inter changer afin de
placer le sous-groupe formé aux places de la
salle où se trouvent assis tous les sous-groupes
déjà formés. - Déroulement de lalgorithme de tri par insertion
et constitution des groupes détudiant - Présentation ltoralegt des applications multimédia
et les challenges des nouveaux services prise
en compte des handicaps, des nouveaux usages
(mobilité intérieur ou extérieur), des réseaux de
capteurs - Présentation du projet, contraintes,
fonctionnalités, méthode, diagramme de GANT
41ère intervention TD
- 1er jet cdc du projet inspiré de FrozenBubble
- Présentation succinct de tous les projets au sein
du TD - 1er jet conception avec exposé des RI
(Représentations Informatiques) nécessaires,
1ères fonctionnalités
51ère intervention TP prise de notes
- TP1 X' Y'
- TP2 S. X''Y''
- Conception et réalisation des principales
fonctions de votre projet (au 2
fonctionnalités)? - Calcule des boules qui sont en contact dune
boule initiale
6Plan
- Présentation de ce qui vous attend
- Bibliographie
- Programmation objet
- Le langage Java
- Algorithmique 1 (rappel) et 2
- ...
7Plan
- ...
- Notions dUML les 7 (sur 12) diagrammes de
conception et de développement - Les classes fondamentales
- La programmation concurrente
- Les flots
- Les composants awt de java
- Introduction à Swing
- Réseau
- JDBC
- Java Xml
8Bibliographie
- Livre de référence
- Hortsmann et Cornell, Au coeur de Java 1 et 2,
CampusPress. - Gilles Roussel, Etienne Duris, Java et Internet
concepts et programmation, Vuibert 2002 - Transparents de Marie-Pierre Béal, et Jean
Berstel.
9Bibliographie
- Autres ouvrages sur Java
- Patrick Niemeyer, Joshua Peck (Traduction de Eric
Dumas), Java par la Pratique, O'Reilly
International Thomson, 1996. - Matthew Robinson and Pavel Vorobiev, Swing,
Manning Publications Co., december 1999. - Sur les design Pattern
- Erich Gamma, Richard Helm, Ralph Johnsons, John
Vlissides, Design Patterns, Addison-Wesley, 1995.
Traduction française chez Vuibert (1999).
10Bibliographie
- Sur lUML
- Michael Blaha James Rumbaugh, Modélisation et
Conception orientées objet avec UML2, 2ème
édition, Pearson Education,2005. - Craig Larman, UML2 et les Design Patterns, 3ème
édition, Pearson Education, 2005. - Martin Fowler, UML 2.0, Campus Press, 2004.
11Bibliographie
- Site Web
- http//java.sun.com Site officiel Java (JDK et
doc.)? - http//www.javaworld.com Info sur Java
- http//www.developer.com/java/ applications,
applets, packages, ... - http//java.developpez.com/
- http//www.jars.com idem
- http//www.blackdown.com Java pour linux
- ...
12Travail demandéContrôle de Connaissances
- Sur 6 semaines
- Un projet inspiré de FrozenBubble
- En TP, puis à la maison
- Une participation/évaluation prises de notes
- En CM
- TD
- Et TP
- Lexamen final de 1ère et de 2ème session
131- Programmation objet
- 1. Styles de programmation
- 2. Avantages du style objet
- 3. Un exemple
- 4. Héritage et composition
- 5. Exemple disques et anneaux
141.1 Styles de programmation
- Style applicatif
- Fondé sur lévaluation dexpressions, où le
résultat ne dépend que de la valeur des arguments
(et non de létat de la mémoire) - Donne des programmes courts faciles à comprendre
- Usage intensif de la récursivité
- Langage typique Lisp, Caml
151.1 Styles de programmation
- Style impératif
- Fondé sur lexécution d instructions modifiant
l état de la mémoire - Utilise une structure de contrôle et des
structures de données - Usage intensif de l itération
- Langage typique Ada, C, Pascal, Fortran, Cobol
161.1 Styles de programmation
- Style objet
- Un programme est vu comme une communauté de
composants autonomes (objets) disposant de ses
ressources et de ses moyens dinteraction - Utilise des classes pour décrire les structures
et leur comportement - Usage intensif de léchange de messages
(métaphore)? - Langage typique Simula, Smalltalk, C, Java,
Ocaml
171.2 Avantages du style objet
- Facilite la programmation modulaire
- La conception par classe conduit à des composants
réutilisables - Un composant offre des services et en utilise
d autres - Il expose ses services à travers une
interface - Il cache les détails d implémentations
(encapsulation ou data-hiding)? - Tout ceci le rend ré-u-ti-li-sa-ble
181.2 Avantages du style objet
- Facilite l abstraction
- Labstraction sépare la définition de son
implémentation - L abstraction extrait un modèle commun à
plusieurs composants - Le modèle commun est partagé par le mécanisme
d héritage - L abstraction est véhiculée par une méthodologie
qui conduit à la réutilisabilité
191.2 Avantages du style objet
- Facilite la spécialisation
- La spécialisation traite des cas particuliers
- Le mécanisme de dérivation rend les cas
particuliers transparents
201.3 Un exemple
- class Point
- private int x
- private int y
- public Point (int x, int y)
- this.x x this.y y
-
- public int getX()
- return x // équivalent à return this.x
-
- public int getY()
- return y
-
- public int setX(int x)
- return this.x x
-
- ...
211.3 Un exemple
- class Point
- private int x private int y
- public Point (int x, int y)
- public int getX() public int getY()
- public int setX(int x)
- public int setY(int y)
- return this.y y
-
- public void deplace(int dx, int dy)
- this.x dx
- this.y dy
-
- public String toString()
- return (thix.x , this.y)
-
- ...
221.3 Un exemple
- class Point
- private int x private int y
- public Point (int x, int y)
- public int getX() public int getY()
- public int setX(int x)
- public int setY(int y)
- public void deplace(int dx, int dy)
- public String toString()
-
- public static void main(String args)
- Point a new Point(3,5) // déclare l objet a
et instancie ses a.setY(6) // a (3, 6)
coordonnées - a.deplace(1,1) // a (4,7)?
- System.out.println(a)
-
231.4 Héritage et composition
- Par la composition, une classe utilise un autre
service - Un composant est souvent un attribut de la classe
utilisatrice - L exécution de certaines tâches est déléguée au
composant le plus apte - Le composant a la responsabilité de la bonne
exécution - Facilite la séparation des tâches en modules
spécialisés
241.5 Exemple disques et anneaux
- class Disque
- protected Point centre // composition
- protected int rayon
- public Disque(int x, int y, int rayon)
- this.centrenew Point(x,y) // identique à
super(x,y)? - this.rayon rayon
-
- public String toString()
- return this.centre.toString() , rayon
-
- public void deplace(int dx, int dy)
- this.centre.deplace(dx, dy) // délégation
-
251.5 Exemple disques et anneaux
- class Anneau extends Disque // dérivation
- private int rayonInterne // composition
- public Anneau(int x, int y, int rayon, int
rayonInterne) - super(x,y,rayon) // identique à
this.Disque(x,y)? - this.rayonInterne rayonInterne
-
- public String toString()
- return super.toString() ,
rayonInterne -
26 272.1 Premier exemple
- Le fichier TestHelloWorld.java
- Class TestHelloWorld
- public static void main(String args)
- System.out.println( Bonjour! )
-
-
- La compilation javac TestHelloWorld.java
- crée le fichier TestHelloWorld.class
- L exécution java TestHelloWorld
- Donne le résultat Bonjour !
- Il est usuel de donner une initiale majuscule aux
classes, et une initiale minuscule aux attributs
et aux méthodes - Le nom du fichier qui contient le code source est
en général le nom de la classe suffixé par .java
282.1 Deuxième exemple
- import java.awt.Frame
- import java.awt.Graphics
- import java.awt.Color
- / \
- Classe affichant une fenêtre de nom Hello
World contenant Bonjour - _at_author Canalda
- _at_version 1.0
- \ /
- public class TestHelloWorld extends Frame
- /
- Constructeur
- /
- public TestHelloWorld()
- super( Hello World ! )
- setSize(200,100)
- show()
-
292.1 Deuxième exemple
- public class TestHelloWorld extends Frame
-
- / Méthode de dessin de la fenêtre
- _at_params graphics contexte d affichage
- /
- public void paint(Graphics graphics)
- graphics.setColor(Color.black)
- graphics.drawString( Bonjour , 65, 60)
-
- / Méthode principale
- _at_param args arguments de la ligne de commande
- /
- public static void main(String args)
- new TestHelloWorld()
-
-
302.1 Deuxième exemple
- Création d e la documentation html
- javadoc TestHelloworld
- visualisation avec un navigateur, comme Netscape
- ls
- TestHelloWorld.class
- TestHelloWorld.html
- HelloWorld.java
-
- Questions Donnez la liste complète des fichiers
créés, capturez la fenêtre du navigateur et
affichez la documentation html du 2ème exemple
traité
312.1 Créer une documentation HTML
- Il s agit de créer une documentation et non
d établir les spécifications des classes. - _at_author il peut y avoir plusieurs auteurs
- _at_see pour créer un lien sur une autre
documentation Java - _at_param pour indiquer les paramètres d une
méthode - _at_return pour indiquer la valeur de retour
d une fonction - _at_exception pour indiquer quelle exception est
levée - _at_version pour indiquer le numéro de version du
code - _at_since pour indiquer le numéro de version
initiale - _at_deprecated indique une méthode ou membre qui
ne devrait plus être utilisée. Crée un warning
lors de la compilation. - - exemple
- /
- _at_deprecated Utiliser plutôt afficher
- _at_see afficher()?
- /
322.1 Un exemple
- /
- Classe permettant de manipuler des matrices
- _at_author Canalda
- _at_author Fino
- _at_version 1.0
- /
- public class Matrice
- private int n
- private int m
- / Premier constructeur. Cree une matrice nulle
de taille donnee en parametre. - _at_param n un entier pour la taille
- _at_see MatriceMatrice(int, int)?
- /
- ...
332.1 Un exemple
- public class Matrice
- private int n
- private int m
- / Premier constructeur. Cree une matrice nulle
de taille donnee en parametre. - _at_param n un entier pour la taille
- _at_see MatriceMatrice(int, int)?
- /
- public Matrice(int n)
- this.nn
- this.mnew int nn
-
- / Deuxieme constructeur. Cree une matrice dont
la taille et le contenu sont donnes en
parametre. - _at_param n un entier pour la taille
- _at_param x un entier pour le contenu de chaque
case - _at_see MatriceMatrice(int)?
- /
342.1 Un exemple
- public class Matrice
- private int n
- private int m
-
- / Deuxieme constructeur. Cree une matrice dont
la taille et le contenu sont donnes en
parametre. - _at_param n un entier pour la taille
- _at_param x un entier pour le contenu de chaque
case - _at_see MatriceMatrice(int)?
- /
- public Matrice(int n, int x)
- this.nn
- this.mnew intnn
- for(int i0 iltn i)?
- for(int j0 jltn j)
- this.mijx
-
35- Fin 2ème coursprises de notes
- TD prises de notes
- Td1
- Td2
- TP prises de notes
- A
- B
- C
362.1 Un exemple
- public class Matrice
- private int n
- private int m
-
- / Methode de transposition de matrice
- /
- public void transposer()
- for(int i0 iltn i)?
- for(int ji1 jltn j)
- int tthis.mij this.mijthis.mji
- this.mjit
-
-
- / Methode daffichage d une matrice
- /
-
372.1 Un exemple
- public class Matrice
- private int n
- private int m
-
- / Methode d affichage d une matrice
- /
- public String toString()
- StringBuffer sb new StringBuffer()
- for(int i0 iltn i)?
- for(int j0 jltn j)
- sb.append(mij)
- sb.append( )
-
- sb.append( \n)
-
- return sb.toString()
-
- / Methode principale /
-
382.1 Un exemple
- public class Matrice
- private int n
- private int m
-
- / Methode principale
- _at_param args arguments de la ligne de
commande - /
- public static void main(String args)
- Matrice a new Matrice(3,12)
- System.out.print(a)
- Matrice b new Matrice(3)
- System.out.print(b)
-
- Question Générez la documentation HTML et
visualisez-la au moyen de votre navigateur
préféré.
39 402.1 Fractales
- Principe objets définis récursivement.
- Exemple la courbe du dragon de Heighway, qui
est donnée par l applette suivante - import java.awt.
- import java.applet.
-
- public class Dragon extends Applet
- public void paint(Graphics g)
- g.setColor(Color.red)
- drawDragon(g,20,100,100,200,200)
-
- private void drawDragon(Graphics g, int n, int
x, int y, int z, int t) - int u,v
- if (n1)?
- g.drawLine(x, y, z, t)
- else
- u (x z t - y) / 2
- v (y t - z x) / 2
- drawDragon(g, n-1, x, y, u, v)
- drawDragon(g, n-1, z, t, u, v)
412.1 Exécution d une applette
- On crée un fichier DessinDragon.html contenant
- ltHTMLgt
- ltHEADgt
- ltTITLEgt Courbe du dragon lt/TITLEgt
- lt/HEADgt
- ltBODYgt
- ltAPPLET CODE Dragon.class WIDTH400
HEIGHT400gt lt/APPLETgt - lt/BODYgt
- lt/HTMLgt
- On ouvre ensuite ce fichier sous Netscape ou bien
directement par - appletviewer DessinDragon.html
422.1 Le dragon documenté
- import java.awt.
- import java.applet.
- public class Dragon extends Applet
- /
- Methode de dessin du dragon.
- lt/BRgt
- On obtient le dessin suivant
- lt/BRgt
- ltAPPLETgt CODE Dragon.class WIDTH300
HEIGHT300gt lt/APPLETgt - /
- public void paint(Graphics g)
- g.setColor(Color.red)
- drawDragon(g,20,100,100,200,200)
-
- private void drawDragon(Graphics g, int n, int
x, int y, int z, int t) - int u,v
- if (n1)?
- g.drawLine(x, y, z, t)
- else
432.2 Le langage Java
- Java est dérivé de Kawa. Créé en 1995, la version
actuelle est la 1.5 - Java
- est fortement typé
- est orienté objet
- est compilé-interprété
- intègre des threads ou processus légers
- est sans héritage multiple MAIS avec
implémentation multiple dinterfaces - offre DORENAVANT de la généricité à la manière
des templates de C (classes paramétrées)? - Compilation - Interprétation
- Source compilé en langage intermédiaire (byte
code) indépendant de la machine cible - Byte code interprété par une machine virtuelle
Java dépendant de la plate-forme
44- Notes élaborées par David et Dhaya
- 1h30
452.2 Le langage Java
- Avantages
- L exécution peut se faire en différé et/ou
ailleurs, par téléchargement - Plus de mille classes prédéfinies qui
encapsulent des mécanismes de base - structures de données vecteurs, listes,
ensembles ordonnés, arbres, tables de hachage,
grands nombres - outils de communication, comme les url,
client-serveur - facilités audiovisuelles, pour images et son
- des composants d interface graphique
- traitements de fichiers
- accès à des bases de données
462.3 Structure d 1 programme
- class HelloWorld
- public static void main(String args)
- System.out.println( Hello World ! )
-
-
- Programme Java constitué d un ensemble de
classes - groupées en paquetage (packages)?
- réparties en fichier
- chaque classe compilée est dans son propre
fichier (un fichier dont le nom est le nom de la
classe suffixée par .class)? - Un fichier source java comporte
- des directives d importation commeimport
java.io. - des déclarations de classes
-
47- Une classe est composée de
- déclaration de variables (attributs) // appelées
parfois variables de classe - définition de fonctions (méthodes)?
- déclaration d autres classes (nested classes)?
- les membres sont
- des membres de classe (static)
- des membres d objet (ou d instance)?
- Une classe a 3 rôles
- 1- de typage, en déclarant de nouveaux types
- 2- d implémentation, en définissant la structure
et le comportement d objet - 3- de moule pour la création de leurs instances
- Une méthode se compose
- des déclarations de variables locales
- d instructions
- Les types des paramètres et le type de retour
constituent la signature de la méthode. - Static int pgcd(int a, int b)
48- Point d entrée Une fonction spéciale est
appelée à l exécution . - Elle s appelle toujours main et a toujours la
même signature - public static void main(String args)
- Toute méthode, toute donnée fait partie d une
classe (pas de variables globales). L appel se
fait par - déréférencement d une classe ou d un objet
d une classe, de la façon suivante - Méthodes ou données de classe par le nom de la
classe.Math.cos() Math.PI - Méthodes ou données d un objet par le nom de
l objet.Pile Pint x2p.push(x) - L objet courant est nommé this et peut-être
sous-entendu s il ny a pas d ambiguïté de
visibilité.public void setX(int x)
this.xx - La classe courante peut-être sous-entendue pour
des méthodes statiques.System.out.println()avec
out, un membre statique de la classe System, et
également un objet de la classe PrintStreamavec
println, une méthode d objet de la classe
PrintStream.
492.4 Expressions, types, variables
- Toute expression a une valeur et un type. Les
valeurs sont - les valeurs de base
- les références, à des tableaux ou à des objets
- Un objet ne peut être manipulé en Java, que par
une référence. - Une variable est le nom d un emplacement mémoire
qui peut contenir une valeur. Le type de la
variable décrit la - nature des valeurs de la variable.
- Si le type est un type de base, la valeur est de
ce type. - Si le type est une classe, la valeur est une
référence à un objet de cette classe, ou d une
classe dérivée. - Exemple Point p
- déclare une variable de type Point, susceptible
de contenir une référence à un objet de cette
classe. - Pnew Point(4,6)
- L évaluation de l expression new Point(4,6)
retourne une référence à un objet de la classe
Point. Cette référence est affectée à p.
50Passage de paramètres
- Toujours par valeur, ou bien par référence
implicite. - Exemple soit la méthode
- static int plus(int a, int b)
- return ab
-
- A l appel de la méthode, par exemple int
cplus(a1,7), les paramètres sont évalués, des
variables formelles (locales à la
méthode-fonction) sont initialisées avec les
valeurs des paramètres-expressions réels. Des
occurrences des paramètres formels sont ainsi
remplacées par des variables locales
correspondantes. - Par exemple,
- int aLocala1
- int bLocal7
- int résultataLocalbLocal
- Attention ! Les objets ou tableaux sont manipulés
par des références. Un passage par valeur d une
référence est donc comme un passage par
référence. Si la valeur-référence ne sera pas
modifiée, les valeurs membres de l objet
référencé peuvent, elles, être modifiées et cela
impacte le programme appelant. - Exemple
- static void incrementer(Point a) a.x a.y
- Après l appel de incrementer(b), les coordonnées
du point b sont incrémentées.
51- Fin cm-td n4
- Prise de note PAG
522.5 Types de base (primitifs)?
- A noter
- Les caractères sont codés sur 2 octets en
unicode. - Les types sont indépendants du compilateur et de
la plate-forme. - Tous les types numériques sont signés sauf les
caractères. - Un booléen n est pas un nombre
- Les opérations sur les entiers se font modulo et
sans erreur byte b 127b 1 // b -128
53- Une variable se déclare en donnant d abord son
type. - int i, j 5
- float re, im
- boolean termine
- static int numero
- static final int N 12
- A noter
- Une variable peut-être initialisée
- Une variable static est un membre de classe.
- Une variable final est une constante.
- Tout attribut de classe est initialisé par
défaut, à 0 pour les variables numériques, à
false pour les booléennes, à null pour les
références. - Dans une méthode, une variable doit être déclarée
avant utilisation. Elle n est pas initialisée
par défaut. - Dans la définition d une classe, un attribut
peut-être déclaré après son utilisation.
54Expressions
- Comme en C ou C
- radians (degres/180) Math.PI // conversion de
degrés en radians - Bonjour Monde // string
- (i ! 0) (i 2 0) // boolean, entier non
null paire - x x 1
- i i --j j--
- j 2 // j j2
- j j // j j j
- max (a gt b) ? a b
- (x 2 1)? 3x1 x/2
55Tableaux
- C est un objet particulier. L accès se fait par
référence et la création par new. Un tableau - se déclare,
- se construit (s alloue et s initialise)?
- et s utilise.
- L identificateur de type tableau se déclare par
- int a // vecteur d entiers
- double m // matrice de doubles
- -gt La déclaration des tableaux comme en C ou C
est acceptée - int a double m
- Construction d un tableau par new
- a new intn
- m new double np // n lignes, p colonnes
- Utilisation traditionnelle
- int i, j
- mijx // ligne i, colonne j
- for(i 0 i lt a.length i)?
56- Fin CM-4 poursuite TD
- Objectifs TD
- 2 fonctionnalités de vos mini-projets
- Sortie automatique du labyrinthe
- Modélisation diagramme de classe qui intègre
cette fonctionnalités ainsi que celles qui sont
sous-jascente à cette fonctionnalité - Labyrinthe ll.sortieAutomatique(...)
- pivoter(droite, ...), pivoter(gauche), avancer,
sortie? - ...
- Placement de ces fonctionnalités
- Réalisation/traduction en langage Java
- réalisation d'une interface Frame à-la-manière
de HelloWorld, et d'une interface APPLET
à-la-manière de FractaleDragon
57- Utilisation traditionnelle
- int i, j 45
- mijx // ligne i, colonne j
- int a new intj
- for(i 0 i lt a.length i)?
- System.out.print( ai )
- Tout tableau a un attribut length qui donne sa
taille à la création. - Distinguer
- la déclaration, qui concerne la variable dont le
contenu sera une référence sur un tableau, - de la construction, qui crée l espace mémoire du
tableau et retourne une référence sur cet espace
mémoire de ce tableau. - On peut fusionner déclaration et construction par
initialisation énumérative - String jours Lundi, Mardi, Mercredi,
Jeudi, Vendredi, Samedi, Dimanche - Les instructions suivantes provoquent toujours
une exception de la classe ArrayIndexOutOfBoundsEx
ception - aa.length,
- a-1
58Exercice prise en main du langage
- Syntaxe
- i) Ecrire 2 façons de déclarer et dinitialiser 1
tableau contenant les 10 premiers entiers - ii) Ecriture du programme qui manipulera a et b
et qui affichera leurs contenus.
59Exercice prise en main du langage
- i) public class Test
- public static void main(String args)int
a1,2,3,4,5,6,7,8,9,10int bnew
int10for(int i0 i lt b.lengthi)
bii1
60Exercice prise en main du langage
- ibis) // autre manière plus capilo-tractéePublic
class Test - Public static void main(String args)int
a1,2,3,4,5,6,7,8,9,10int bnew
int10for(int i0 i lt b.length)
bii
61Exercice prise en main du langage
- ii) // Dans Test.javapublic class Test
Public static void main(String args)
int a1,2,3,4,5,6,7,8,9,10
int bnew int10
for (int i0 i lt b.length)
bii
/ laffichage dans
le cas ou a et b sont de la même
taille / for (int
i0 ilta.lengthi)
System.out.println(a i ai
)
62Exercice prise en main du langage
- ii-bis) // Dans Test.javapublic class Test
Public static void main(String args)
int a1,2,3,4,5,6,7,8,9,10
int bnew int10
for (int i0 i lt b.length)
bii
/ laffichage
dans le cas ou a et b ne sont pas forcément de la
même taille /
for (int i0 ilt (a.lengthltb.length?b
.lengtha.length)i)
if (ilta.length)System.out.println(ai)
if (iltb.length)System.out.p
rintln(bi)
63Exercice surcharge
- Modifier la classe Array, de façon à ce que lon
affiche le contenu d1 tableau t simplement par
lappel de System.out.println(t)
64Exercice surcharge
- public class Array // tout un
ensemble dattr privés exemple la collection
des éléments // si Array anew
Array(type, taille) // jy accède par
ai public int length
// contient la taille de linstance de ce
tableau public
Array(Object o, int taille)
this.collectionnew o.classname taille
// il faut faire un eval de la
commande précédente, - // seulement un éval
dune commande nest pas triviale à réaliser en
java (plus aisé en javascript, actionScript,
// ou tout autre langage
interprété) public String
toString() StringBuffer sb
new StringBuffer() for
(int i0 iltthis.lengthi)
sb.append(this.collectioni.toString())
return sb.toString()
65Rmq - Exercice surcharge
- Comment réaliser la surcharge ?
- Par des design pattern qui réalisent
lintrospection et la modification dynamique des
classes et composants des classes (attr ou
primitives) - Dansla version Tigre du langage, et tigre désigne
la prochaine version du langage Java, il y aura
la généricité et les macros.Ce nest pas
hasardeux de retrouver ces 2 évolutions majeures
au sein dune même version. En fait la macro
permet de réaliser leval(nouvelle expression).
Ce faisant on réalise alors la généricité.
Généricité étant le concept auquel nous nous
sommes attaqués au travers de lexercice ARRay
précédent )
66Matrices
- Les tableaux sont dynamiques dans toutes les
dimensions (la mémoire peut -être allouée
dynamiquement ). - /
- Classe permettant de manipuler des matrices
- _at_author Canalda
- _at_version 1.0
- /
- public class Matrice
- private intm
- /
- Creation d une matrice nulle dont la taille
est donnee en parametre. - _at_param n taille de la matrice
- _at_see MatriceMatrice(int,int)?
- /
- public Matrice(int n)
- this.m new intnn // de façon
equivalente this(n,0)? -
67- /
- Creation d une matrice dont la taille et le
contenu sont donnes en parametre. - _at_param n taille de la matrice
- _at_param x valeur de chaque coefficient
- _at_see MatriceMatrice(int)?
- /
- public Matrice(int n, int x)
- this.m new intnn
- for(int i0 iltn i)?
- for(int j0 jltn j)?
- this.mijx
-
- /
- Transposition de matrice
- /
- void Transposer()
- int n m.length
- for(int i0 iltn i)
- for(int ji1 jltn j)
68- /
- Affichage d une matrice.
- /
- public String toString()
- int n m.length
- StringBuffer sb new StringBuffer()
- for(int i0 iltn i)
- for(int j0 jltn j)?
- sb.append(mij )
- sb.append( \n )
-
- return sb.toString
-
- /
- Methode principale
- _at_param args arguments de la ligne de
commande - /
- public static void main(String args)
- Matrice a new Matrice(3,12)
On obtient java Matrice12 12 12 12 12 12 12
12 12 0 0 0 0 0 0 0 0 0
69Instructions
- Affectation, instructions conditionnelles,
aiguillages, itérations usuelles. - Affectation
- x 1 y x x1
- Instructions conditionnelles
- if (C) S
- if (C) S else T
- Itérations
- while (C) S
- do S while (C)
- for(ECG) S
- Une instruction break fait sortir du bloc où
elle se trouve.
70- Traitement par cas
- switch(C)
- case
- nEspaces break
- case 0 case 1 case 2 case 3 case
4 case 5 case 6 case 7 case 8 case
9 - nChiffres break
- default
- nAutres
-
- Blocs à étiquettes
- un while (...)
-
- deux for()
-
- trois while ()
-
- if () continue un // reprend
while extérieur
71- Mathieu Brousse à pris les notes du CM5
72- Question Dans le cas d1 for intégrant un
continue, y-a-til reprise à litération courante
ou bien à litération suivante ? - Ecrire un petit programme qui vous permet de le
vérifier - Attention, il pourrait y avoir des risques de
boucles infinies ?
73Méthodes
- Chaque classe contient une suite non emboîtée de
méthodes. Mais si on ne peut pas définir des
méthodes à l intérieur de méthodes, on pourra
définir des classes à lintérieur des classes. - static int next(int n)
- if (n 2 1) // n est impair
- return 3n 1
- // n est pair
- return n/2
-
- static int pgcd(int a, int b)
- return (b 0) ? A pgcd(b, ab)
-
- Une méthode qui ne retourne pas de valeur a pour
type de retour le type void.
74Surcharge
- On distingue
- Profil le nom la suite des types des
arguments - Signature le type de retour le profil
- Signature complète signature la visibilité
(private, protected, public ou rien). - Signature étendue signature complète les
exceptions - Un même identificateur peut désigner des méthodes
différentes pour autant que leurs profils soient
distincts. - static int fact(int n, int p)
- if (n 0) // condition d arrêt du prg
récursif - return p
- else // mot clef facultatif
- return fact(n-1, np)
-
- static int fact(int n)
- return fact(n,1)
-
75Visibilité des attributs et méthodes
- Les membres (attributs ou méthodes) d une classe
ont une visibilité définie par défaut et ont des
modificateurs de visibilité - public
- protected
- private
- Par défaut, une classe a ses données ou méthodes
accessibles dans le répertoire, plus précisément
dans le paquetage (cf. loin). - Un attribut (donnée ou méthode)
- public est accessible dans tout code où la classe
est accessible. - protected est accessible dans le code des classes
du même paquetage et dans les classes dérivées de
la classe. - Private n est accessible que dans le code de la
classe. - La méthode main doit être accessible de la
machine virtuelle, elle doit donc être public.
76Constructeurs
- Les objets sont instanciés au moyen de
constructeurs. Toute classe a un constructeur par
défaut, sans argument. Lors de la construction
d un objet, l opérateur new réserve la place
mémoire pour l objet et initialise les attributs
à leur valeur par défaut. - Le constructeur
- exécute le corps de la méthode,
- et retourne la référence de l objet créé.
- Exemple avec seulement le constructeur par défaut
- class Pixel
- int x, y
-
- Utilisation
- class TestPixel
- public static void main(String args)
- Pixel p // p est déclaré, mais indéfini
- p new Pixel() // p ! null, p.x p.y 0
- p.x 4
- p.y 5
-
-
77- Exemple avec un constructeur particulier
- class Pixel
- int x, y
- Pixel(int x, int y)
- this.xx this.yy
-
- public static void main(String args)
- Pixel p, q // p et q sont déclarés, mais
indéfinis, p q null - p new Pixel(2,3) // p ! null, p.x2,
p.y3 - q new Pixel() // erreur
-
-
-
- La définition explicite d un constructeur fait
disparaître le constructeur par défaut implicite.
Si on veut garder le constructeur par défaut, il
faut alors le déclarer explicitement - class Pixel
- int x, y
- Pixel()
- Pixel(int x, int y)
- this.xx this.yy
78- Les données d un objet peuvent être des
(références d ) objets. - class Segment
- Pixel debut, fin
-
- Utilisation
- public static void main(String args)
- Segment s // s indéfini
- s new Segment() // s ! null, s.debut
s.fin null -
-
- Plusieurs constructeurs pour la même classe
- class Segment
- Pixel debut, fin
- Segment()
- Segment(Pixel d, Pixel f)
- this.debutd this.finf
-
- Segment(int dx, int dy, int fx, int fy)
- this.debutnew Pixel(dx,dy) this.finnew
Pixel(fx,fy)
79- Exemples d emploi
- public static void main(String args)
- Segment s // s indéfini
- s new Segment() // s.debut s.fin null
- s.debut new Pixel(2,3)
- s.fin new Pixel(5,8)
-
- Pixel p new Pixel(2,3) Pixel q new
Pixel(5,8) - Segment t new Segment(p,q)
-
- Segment tt new Segment(new Pixel(2,3), new
Pixel(5,8)) -
- Segment r new Segment(2,3,5,8)
-
80Membres et méthodes statiques
- Les attributs peuvent être
- des attributs de classe (static),
- des attributs d objets (ou d instance).
- Les attributs de classe static sont partagés par
tous les objets de la classe. Il n en existe
quun par classe au lieu de un pour chaque
instance ou objet d une classe lorsquil s agit
de membre d objets. - Exemple d attributs static
- un compteur du nombre d objets (instances) de la
classe, - un élément particulier de la classe, par exemple
une origine. - class Point
- int x, y
- static Point origine new Point(0,0)
-
- Les méthodes peuvent aussi être ou ne pas être
static. - Les méthodes static sont invoquées en donnant le
nom de la classe ou bien le nom d une instance
de classe. Une méthode static ne peut pas faire
référence à this. - Elles sont utiles pour fournir des services
(helper). - Méthodes de la classe Math.
81- Exemples 1
- public class Chrono
- private static long start, stop
- public static void start()
- start System.currentTimeMillis()
-
- public static void stop()
- stop System.currentTimeMillis()
-
- public static long getElapsedTime()
- return stop - start
-
- Et on s en sert de la manière suivante
- class TestChrono
- public static void main(String args)
- Chrono.start()
- for(int i0ilt100000i)?
- for(int j0jlt100000j)
- Chrono.stop()
82- Exemples 2
- class User
- String nom
- static int nbUsers
- static User allUsers new User10
-
- User(String nom)
- this.nom nom
- allUsersnbUsers this
-
- void send(String message, User destinataire)
- destinataire.handleMessage(message, this)
-
- void handleMessage(String message, User
expediteur) - System.out.println(expediteur.nom dit
message à this.nom) -
- void sendAll(String message)
- for(int i0 iltnbUsersi)
- if (allUsersi ! this) send(message,
allUsersi)
83- Exemples 2 (suite)?
- class User
-
- public static void main(String args)
- User anew User( Pierre ), bnew
User( Anne ), - cnew User( Alex ), dnew
User( Paul ) - a.send( Bonjour , b)
- b.senAll( Hello )
- a.sendAll( Encore moi )
-
-
- Donne à l exécution
- Pierre dit Bonjour à Anne
- Anne dit Hello à Pierre
- Anne dit Hello à Alex
- Anne dit Hello à Paul
- Pierre dit Encore moi à Anne
- Pierre dit Encore moi à Alex
- Pierre dit Encore moi à Paul
84Chapitre Les concepts objets
85Données de base
- Descriptionun type entier, chaîne de car.,
réel, etcune valeur (12, mon texte , 7.28)? - Inconvénientsensemble de types limitétypage
statiquepas de notion de sous-typage
Ensemble des valeurs possiblespour cette donnée
Type d une donnée
86Les produits cartésiens
- Principe
- définir les données comme produit cartésien
d autres données ex entier x entier x chaine - un Prod_Cart (ou enregistrement) 1 n-upletex
(10, 20, rose ) représente un point de
l écran (( Durand , Paul ),
( Durand , Anne )) représente un
couple - Réutilisation
- utilisation d un constructeur de type produit
cartésien - un nom pour le type
- ensemble de champs nommés et typés
87Produits cartésiens exemple
- Introduction d un type livre TYPE t_livre
PROD_CART ( titre chaine auteur chaine
éditeur chaîne année de parution date
nombre de page entier prix réel)? - Utilisation
- si RefProlog donnée de type livre, alors
RefProlog.titre désigne son titre (et vaut The
Art of Prolog )?
88Notion de classe et dobjet
- Comparaison
- type gt classe
- Donnée/variable gt Objet (instance d un type)
(instance d une classe)? - champ gt champ et une fonction est
éligible à être un champ - Exemple
- RefProlog serait un objet de classe livre
89Classes et types premières différences
- Type
- point de vue statique gt les champs
- Classe
- Point de vue statique état
- les champs (avec valeur par défaut éventuelle)?
- les propriétés ou contraintes
- Point de vue dynamique changements d états
- les méthodes (définies au niveau de la classe,
mais s appliquent sur les objets de cette
classe), avec d éventuelles pré-conditions et
post- conditions
90Classes un exemple
Personne
Nom chaîne Prénom chaîne DateDeNaissance
t_date SituationDeFamille TYPE enuméré
( célibataire , )? Sexe ( M , F )?
créer(nom,prénom,date,sexe) //
surcharge créer(nom,prénom,date,sexe,situation)?
ModifierSituation(NouvelleSituation)?
Sexe M ou F Nom ltgt
Rmq si toto est un objet de classe personne,
Modifier la situation de toto se fait par
toto.ModifierSituation( Marié )?
91Vie et mort d un objet
- Un objet
- naît
- vie
- meurt
- Par classe 3 types de méthodes
- constructeurs
- destructeurs
- les autresgt rien nest possible sur un objet
non créégt rien nest possible sur un objet
détruit
92Persistance d un objet
- Mort d un objet classique
- appel de son destructeur
- arrêt du système qui la créé
- Inconvénients
- panne
- maintenance
- évolutiongt Notion d objet persistant Un
objet persistant est on objet dont lexistence
continue après l arrêt du système qui l a créé
93Variables et méthodes de classe
- Cas général
- champs propre à un objet
- impossibilité à des objets dune même classe de
partager des données - gt variables d une classe
- même donnée pour tous les objets de la classe
- gt méthodes de classe
- ne s appliquent pas particulièrement à un
objetgt à voir comme des fonctions de
bibliothèques
94Vers la réutilisabilité
Elève
Personnel
Nom Prénom
Nom Prénom
Année détude
Fonction
créer(nom,prénom)?
créer(nom,prénom)?
créer(nom,prénom,annéeEtude)? changerAnnéeDEtude
(année)?
créer(nom,prénom,fonc)? changerFonction(fonc)?
Parties différentes
Parties communes
- gt Comment factoriser les parties communes ?
95Héritage introduction
Personne
Représentations possibles
Nom Prénom
créer(nom,prénom)?
Personnel Personne
Elève Personne
Fonction
Année détude
créer(nom,prénom,fonc)? changerFonction(fonc)?
créer(nom,prénom,annéeEtude)? changerAnnéeDEtude
(année)?
- Vocabulaire
- Elève hérite/est une sous-classe/est une
spécialisation de Personne - Personne est une généralisation/super-classe
dElève - On emploie aussi les termes de classe mère et de
classe fille
96Héritage et sous-typage
- Autre lecture de la relation d héritage
- un objet d une classe fille est un objet de la
classe mère - gt Tout objet dun type dune classe fille
peut-être utilisé à la place dun objet du type
dune classe mère - Sur l exemple créer peut s appliquer pour un
élève ou pour le personnel - ! La réciproque n est pas vraie
97Redéfinition et liaison dynamique
- Principe de la liaison dynamique
- La méthode périmètre de la classe Quadrilatère
est redéfinie dans Losange. - Soit P de type Parallélogramme, L de type Losange
et Q de type Quadrilatère - Q lt- P.Périmètre() calcule l1l2l3l4
- Q lt- L.Périmètre() calcule 4l1
Quadrilatère
l1, l2, l3, l4 réels
périmètre() périmètrel1l2l3l4 créer(p1,p2,p
3,p4)?
LosangeQuadrilatère
Parallélogramme Quadrilatère
périmètre() Périmètre4l1
98Classes et méthodes abstraites
- Une classe abstraite C est une classe dont les
seuls objets qui peuvent en être membres sont
membres dune sous-classe de C. - Corollaire il n est pas possible de créer un
objet de classe C si C est une classe abstraite - Une méthode abstraite est une méthode dont la
définition nest pas donnée dans la classe
courante mais devra lêtre dans des classes
filles - Toute classe contenant au moins une méthode
abstraite est une classe abstraite
99Classes et méthodes abstraites
- Exemple
- Classe abstraite Point privé x, y
ENTIER Point()
Point(Valx, Valy ENTIER) // constructeur à 2
this.x lt- Valx
// paramètres this.y
lt- Valy public procédure
setX(Valx ENTIER) // deux méthodes
public procédure setY(Valy ENTIER) //
abstraites
100Héritage disjonction ou recouvrement
- Si un même objet ne peut pas être membre de
plusieurs sous-classes d une même classe, on
parle d héritage disjoint
ŒUVRE d art
Tableau
Morceau de musique
101Héritage disjonction ou recouvrement
- Sinon on parle d héritage avec recouvrement
Bâtiment
Professionnel
Habitation
102Héritage multiple
- Il y a héritage multiple si une classe peut
hériter de plusieurs autres classesimpossibl
e avec Java
Morceau de musique compositeur
partition
Livre auteur texte
ŒUVRE d art
103Héritages propriétés
- Transitivité
- Si A hérite de B et B hérite de C alors A hérite
de C - Non réflexif
- Une classe ne peut pas hériter delle même
- Non symétrique
- Si A hérite de B alors B ne peut pas hériter de A
- Corollaire
- Un cycle dans une relation d héritage est
impossible. Les relations dhéritages forment un
DAG (Graphe dirigé acyclique)?
104Classes et méthodes terminales
- Une classe terminale est une classe dont aucune
classe ne peut hériter. - Une méthode terminale est une méthode qui ne peut
pas être redéfinie. - Un champ terminal dune classe est une constante.
105Liens entre classe
- Comment ?
- Par les champs,en déclarant un champ de classe A
dans une classe B - Dans les méthodes,en déclarant une variable de
classe A dans une méthode de la classe B - Par la définition explicite dune
relationexemple
Enseignant
Matière
nom prénom
nom volume horaire
106Agir sur un objet dune classe liée
- Actions possibles
- lire la valeur d un champ
- destination lt- nom_objet.nom_champ
- modifier un champ
- nom_objet.nom_champ lt- nouvelle_valeur
- exécuter une méthode
- résultat lt- nom_objet.nom_méthode(paramètre
d entrée)? - Remarques
- le symbole d affectation est ici lt-
- le texte entre crochet est optionnel et signale
0 itération ou n itérations
107Actions sur objet constat
- Rôle des méthodes
- factoriser du code commun
- avoir un typage plus fort (ne sapplique que sur
les objets de la classe C dans laquelle elle est
définie, ou dune classe héritant de C)? - nautoriser que certains changements détats sur
un objet - Mais
- possibilité dintervenir directement depuis
l extérieur sur un champ dune méthode
(annule le dernier point)? - nest pas adapté à la réutilisabilité lorsque la
représentation des données doit être modifiée
(ex ensemble de car ou d entiers)?
108Gestion des droits d accès
- Conséquence du constat précédent
- pour chaque champ et chaque méthode, possibilité
de définir des droits daccès pour les autres
classes
109Encapsulation
- Définition
- modifier les champs d un objet n est possible
que par l intermédiaire des méthodes définies
directement ou par héritage dans la classe de cet
objet - Principe
- les champs sont tous privés
- les méthodes mises à la disposition des autres
classes sont déclarées publiquesNB si la
classe a vocation à être utilisée comme une
classe mère, certains champs et méthodes pourront
être protégés
110Encapsulation
- Avantages
- nautoriser que certains changements détats pour
un objet - possibilité de modifier la représentation interne
d une classe (les champs) sans devoir refaire
tous les projets ou programmes qui utilisent la
classe - Conséquences pour diffuser au public une
classe, préciser - nom et rôle de la classe