Académique Documents
Professionnel Documents
Culture Documents
BENSLIMANE Mohamed ;
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Introduction………………………………………………..…3
5. L’Héritage…………………………………………...……19
7. JDBC……………………………………………………...24
9. L’API Swing…………………………………………...…30
Conclusion…………………………………………………...35
2
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
INTRODUCTION :
Qui n'a pas encore entendu parler de Java ? Personne, c'est normal !
Ce nouveau langage connaît un succès qu'aucun autre langage n'avait
encore connu. Mais quelles en sont les raisons? A notre avis c'est une
multitude de petits (ou gros) détails qui font que finalement Java est une
bonne solution, et ce quelque soit le problème. En effet, tout d'abord, Java
est portable : un programme, une fois compilé fonctionnera aussi bien
sous des stations Unix, que sous Windows ou autre. Au point de vue du
langage, il intègre tous ce que l'on sait faire de mieux en matière de
langage de programmation, tout en évacuant les erreurs faîtes sur les
langages dont il est issu (C et C++).
3
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
De plus Java, est simple (relativement aux autres langages orientés objets
: C++ notamment) à appréhender, car il offre, comme nous l'avons dit,
tous les mécanismes nécessaires à un langage orienté objets, tout en
étant débarrassé de mécanismes souvent sources d'erreurs. Il apparaît
donc au terme de cette petite introduction, que Java est une solution aux
problèmes informatiques du moment. De plus, comme il est encore jeune,
il devrait facilement pouvoir s'adapter aux évolutions futures de
l'informatique.
4
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
5
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
De même que pour les types numériques, vous avez deux types pour les
nombres décimaux, la seule différence résidant dans la taille utilisée pour
stocker une valeur de ce type.
Le type booléen
On introduit une variable de ce type pas le mot clé booléen. Ce type
accepte seulement deux états : l'un est nommé true et symbolise un état
d'acceptation, l'autre, nommé false, symbolise un état de réfutation.
Attention, ce n'est plus comme en C : le type booléen n'est pas en Java,
un sous-type numérique (on rappelle qu'en C, la valeur 0 est considérée
comme fausse et les autres valeurs entières comme vraies).
Le type chaîne de caractères
Première remarque, par rapport au langage C, le type chaîne de
caractères et totalement différent du type tableau de caractères. Pour ce
qui est de la syntaxe d'un chaîne de caractères, rien n'a changé par
rapport à C ou C++ : une chaîne de caractères commence par un
caractère double guillemets et se termine aussi par ce même signe.
Ainsi, "Amine" est une chaîne de caractères. Là où ça se complique un
petit peu, c'est que le type d'un telle valeur est String, qui est une classe
fournie par la machine virtuelle.
Les tableaux
De même que beaucoup d'autres langages, Java permet lui aussi de
définir des tableaux. Pour ceux qui ne connaissent pas encore ce concept,
on dira qu'un tableau est la succession d'un certain nombre d'éléments
d'un type particulier : on peut donc, par exemple, obtenir un tableau (une
succession) de dix float.
6
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
7
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
8
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Comme nous l'avons donc déjà dit, on introduit une définition de classe
par le mot clé class. Celui ci doit être suivi du nom de la classe puis d'une
description de ses champs
(Attributs et méthodes) mise entre parenthèses.
Les attributs de classe
Dans les chapitres précédents, nous avons déjà vu comment définir des
variables à l'intérieur d'une méthode (rappelez vous les exemples avec les
méthodes main). Pour définir un attribut de classe, on réalise la même
démarche. En effet, un attribut de classe peut quand même être vu
comme une variable, au même titre que les variables. La différence
essentielle réside dans le fait que le domaine de visibilité est plus grand
dans le cas des attributs de classe. Par domaine de visibilité, j'entends
l'étendue des parties du code du programme sur lesquelles l'attribut peut
être accédé (ne serait-ce déjà que par toutes les méthodes de la classe).
Une variable, elle, ne peut être utilisée uniquement qu'au niveau du bloc
d'instructions dans lequel elle est définie (éventuellement une méthode).
La classe suivante donne la description d'une classe Circle associée à la
notion de cercle : elle devra donc contenir un point pour le centre (de type
Point2D) et un rayon
(Valeur flottante, double précision). La classe Point2D, elle, contiendra
deux valeurs
(Flottantes, double précision) permettant de définir les coordonnées d'un
point dans le plan.
9
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Les méthodes
Maintenant, nous désirons définir des comportements liés à cette classe
graphique qu'est le cercle. Nous devons donc définir des méthodes à cet
effet. Supposons que dans le cadre du programme que nous sommes en
train d'écrire nous ayons besoin de déplacer un cercle selon un vecteur
donné : il nous faut donc écrire une méthode qui prend un vecteur en
paramètre. Nous devons donc, au passage, définir une classe
Vector2D (cette classe possèdera deux attributs de type flottant double
précision). Une petite remarque, au stade actuel de l'écriture de ce petit
programme, on pourrait penser qu'il soit judicieux de ne pas créer la
classe Vector2D et d'utiliser à la place la classe
Point2D contenant la même information. Ceci est une mauvaise idée, car il
est clair que la sémantique d'un point du plan n'est pas la même que celle
d'un vecteur.
Mathématiquement, ils représentent deux concepts différents avec
lesquels ont obtient des traitement différentes. Il est donc très fortement
conseillé des séparer les choses en codes distincts, dès lors que l'on parle
de deux concepts différents. Si vous faite ainsi, il sera très facile de
rajouter un comportement (une méthode) si vous l'avez oublié
(Autrement, cela ne serait peut-être pas si simple). Nous obtenons donc
les classes suivantes :
10
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
La surcharge de méthodes
Si maintenant, vous voulez définir un déplacement de cercle, non pas en
spécifiant un vecteur, mais bien une valeur en x et une seconde en y, il
vous faut écrire une autre méthode. L'exemple suivant vous montre
comment faire.
11
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Vous aurez certainement remarqué que l'on a utilisé le même nom pour
les deux méthodes : cette possibilité s'appelle la surcharge. Cela
fonctionne car, lorsque vous utiliserez une des deux méthodes, vous
spécifierez soit un argument de type Point2D, soit deux arguments de
type double. Plus formellement, deux méthodes ne doivent pas avoir le
même prototype (nous entendons par là le type de paramètres et celui de
retour de la méthode). Donc, si nous voulons définir deux méthodes de
déplacement, une horizontalement et une verticalement, nous ne pouvons
pas les nommer de la même manière, sans quoi on ne pourrait savoir
laquelle choisir lors d'un appel de méthode.
Voici donc un programme possible, agrémenté d'une méthode d'affichage
texte.
12
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Instanciation d'objet
Nous avons, jusqu'à maintenant, vu comment définir une classe d'objets. Nous allons, à
présent, voir comment définir des objets à partir d'une classe. Cette création d'objet, à
partir d'une classe, est appelée instanciation. On instancie donc un objet en appliquant
l'opérateur new sur un constructeur de classe. Précisons un peu les choses.
L'allocation de mémoire
Pour qu'un objet puisse réellement exister au sein de la machine, il faut qu'il puisse
stocker son état dans une zone de la mémoire. Or deux objets définis à partir de deux
classes différentes n'ont, à priori, pas forcément besoin de la même taille d'espace
mémoire (car n'ayant pas les mêmes définitions d'attributs). L'opérateur new est donc là
dans le but de nous simplifier la vie. Par l'intermédiaire d'une méthode un peu
particulière (un constructeur) d'une classe données, cet opérateur déterminera sans
problème la taille de l'espace mémoire requis.
Les constructeurs
De manière basique, on peut dire qu'un constructeur est une méthode d'une classe
donnée, servant à créer des objets. Remarque importante à retenir : un constructeur n'a
pas de type de retour, contrairement aux méthodes et se nomme toujours de la même
manière que sa classe. De même que les méthodes acceptent la surcharge, les
constructeurs l'admettent aussi. L'exemple suivant propose donc quelques constructeurs
pour nos classes déjà étudiées.
13
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
14
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Les destructeurs
Nous venons donc de voir que des constructeurs pouvaient être fournis
pour permettre la création d'objets. Parallèlement, un destructeur (et un
seul) peut être défini pour être utilisé lors de la destruction de l'objet.
Celui-ci doit forcément se nommer finalize, il ne prend aucun paramètre et
ne renvoie aucun type (void). Cette méthode doit, de plus, être qualifiée
de public, sans quoi le compilateur vous rappellera à l'ordre.
Voici un petit exemple :
15
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Quelques exceptions.
Le tableau suivant vous propose quelques exemples d'exceptions que vous
pouvez traiter.
16
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
On relaye l'exception.
Maintenant, le problème est de savoir ce que l'on doit faire d'une
exception que l’on n’aurait pas su traiter. Dans ce cas, il faut alors la
relayer à la méthode appelante. Plus généralement, si une méthode est
susceptible de lever une exception, et si celle-ci ne peut la traiter, elle se
doit de prévenir le système qu'elle relaye cette tâche. Pour ce faire on
utilise le mot clé throws.
Le mot clé throws.
Ce mot clé permet d'avertir le système qu'une certaine catégorie
d'exception ne sera pas traitée en local (dans l'exemple suivant,
l'ensemble des exceptions liées aux entrées/sorties).
17
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
18
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
5°/- L'héritage :
Afin de vous amener simplement, mais clairement, à l'assimilation de ce
concept, nous allons tout d'abord considérer une extension du programme
manipulant nos fameux cercles sur un espace à deux dimension. Il en
résultera une simplification phénoménale du problème.
Ce qu'il ne faut surtout pas faire
L'extension va consister en l'introduction de classes liées aux autres
notions de figures dans le plan. En effet, nous aimerions, maintenant,
pouvoir manipuler, outre des cercles, des carrés, des rectangles, des
triangles, ou toutes autres figures géométriques de votre choix. L'idée la
plus basique se résume en la définition d'une classe par type de figures.
Ce qu'il faut faire
L'idée principale consiste à définir une classe à partir d'une autre. La
classe définie à partie d'une autre sera nommée classe fille. Celle qui sert
à définir une classe fille sera nommée classe mère. On dit alors que la
classe fille hérite (ou dérive) de la classe mère.
Une remarque importante peut déjà être faites : une classe fille dérive
d'une unique classe mère.
Une fois que l'héritage est spécifié, la classe fille possède aussi l'ensemble
des attributs et des méthodes de sa classe mère.
La principale difficulté, avec l'héritage, est de définir ce qui est propre à la
classe mère et ce qui l'est pour sa classe héritière. Dans tous les cas, cela
est fortement lié au problème considéré. Revenons donc à nos classes
Circle et Square. On remarque alors que dans les deux cas, on a besoin de
connaître la position du centre de la figure. De même, on définit dans les
deux cas, les mêmes méthodes, liées au déplacement de la figure. En
réfléchissant encore un peu, on peut alors pressentir qu'il en sera de
même pour toutes les classes associées à la notion de figures
géométriques. Il pourrait donc être judicieux de définir une classe Shape
de laquelle toutes les classes, associées à une figure géométrique,
pourraient hériter.
19
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
20
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
21
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
22
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Certains d'entre vous sont peut-être gênés par le fait que l'on ne puisse
plus créer d'objet de classe Shape. Mais physiquement, il n'y a pas de
figures, mais des cercles et des carrés, et d'autres formes, que l'on
regroupe sous le terme générique de figures.
Donc, notre modèle est conforme à la spécification (implicite) de notre
problème.
23
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Nous allons dans cette partie du cours sur le langage Java, nous intéresser
à l'API
(Application Programing Language) JDBC (Java DataBase Connectivity).
Cette API à était développée par SUN pour permettre à des applications
Java d'accéder à des bases de données relationnelles quelconques.
Comme vous le savez certainement, on manipule le contenu d'une base
de données relationnelle en utilisant des ordres codés en langage SQL
(Structured Query Language).
JDBC : Les différents types de pilotes
Nous allons, dans ce chapitre, voir qu'il existe plusieurs types de drivers
(de pilotes) de bases de données. Il existe, de plus, plusieurs bases de
données. D’où un nombre impressionnant de combinaisons possibles.
Nous verrons aussi comment charger dynamiquement un pilote, spécifique
à une base de données, dans la JVM : nous traiterons de deux cas
particuliers.
Les quatre types de pilotes JDBC
Il existe quatre types de drivers (de pilotes) JDBC. Nous ne traiterons
dans ce cours de deux types de pilotes. Malgré cela, voici un petit
descriptif de ces quatre types de pilotes.
Les drivers de pont JDBC/ODBC : ce type de pilote, fourni en standard
avec le J2SE (Java 2 Standard Edition), permet de convertir les appels
JDBC en appel ODBC (Open Data base Connectivity). ODBC est fourni en
standard sur tout Windows et permet la connexion à des bases de natures
diverses (Access, SQL
Server, Oracle, ...).
Les drivers de type 2 : ils sont écrits, en partie, en Java, mais dépendent
malgré tout de code natif. En terme de portage d'application Java, ces
types de pilotes présentent quelques lacunes.
Les drivers de type 3 : ce type de pilote passe par un autre pilote JDBC
intermédiaire (fréquemment de type 1 ou 2). Il s'agit certainement du
type de pilote le moins utile des quatre proposés.
Les drivers de type 4 : leur code est écrit en 100% Java, donc portable.
Ces pilotes sont fournis par quasiment tous les constructeurs de bases de
données. Chaque pilote étant adapté à une base de données très
particulières. Ces drivers constituent la meilleure solution pour le portage
de vos applications Java.
24
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Chargement du pilote
On commence un programme JDBC en chargeant dans le programme, le
pilote approprié pour la BD. Comme le programme peut interroger divers
types de BD il peut avoir plusieurs pilotes. C'est au moment de la
connexion que sera choisi le bon pilote par le DriverManager.
On a donc une architecture :
25
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
26
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Un des aspects qui ont fait le succès de Java réside certainement dans la
possibilité d'écrire des programmes Java pour être incorporés dans des
documents HTML : je parle, bien entendu, des applets Java. En fait, une
applet Java est une petite (ce qualificatif étant tout à fait relatif)
application Java. Il est clair que Java était une solution parfaitement
adaptée à ce type de traitement : différents navigateurs Web existent et
ils peuvent souvent être installés sur différentes plates-formes.
L'architecture Java, a donc permit de garantir que les applets Java
puissent s'exécuter sur différentes architectures.
Nous allons dans ce chapitre présenter les éléments fondamentaux de la
mise en œuvre d'applets Java.
27
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Comme tout composant graphique, une applet propose donc une méthode
paint.
Celle-ci à pour tâche de retracer le contenu de l'applet. Nous allons nous
servir de cette méthode pour afficher le message "Hello World" dans
l'applet, en faisant, à chaque appel, un peu et aléatoirement varier la
couleur du message. De plus, un thread va être utilisé afin de
régulièrement ré-invoquer l'affichage. Cette applet est de plus présenté en
dessous de l'exemple de code (et oui, nous sommes dans une page
HTML).
28
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Une applet est un petit peu plus complexe qu'une application classique.
Normalement, une application Java n'a qu'un unique point d'entrée : la
méthode main, et elle se termine quand votre programme sort du main
(sauf si vous lancez de nouveau thread : c'est ce qui est fait avec les
fenêtres graphiques, notamment).
Pour une applet, cela ne pouvait pas suffire. En fait, ce n'est plus votre
programme qui démarre, mais le navigateur qui lance la JVM, puis quand
le support d'applet est complètement chargé, votre applet est démarrée.
Elle n'a donc plus de méthode main.
Par contre une applet à quatre points d'entrées plus une autre méthode
d'affichage (la méthode paint). Mais à quoi correspondent ces quatre
points d'entrées d'une applet.
public void init() : cette méthode est invoquée quand le navigateur lance
votre applet (normalement une fois pour toute).
29
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
public void start() : le start est lancé après la méthode init. Pour mieux
comprendre son utilité, il faut bien comprendre que vous pouvez changer
de document HTML à tout moment. Vous étiez en train d'utiliser une
applet puis vous partez sur http://www.infini-fr.com. Votre applet est
alors stoppée, mais pas complètement déchargée de la mémoire. Si vous
cliquez sur le bouton "Back" du
navigateur, seule la méthode start sera alors relancée.
public void stop() : comme nous venons de le comprendre, cette
méthode est lancée quand vous quittez la page HTML contenant l'applet.
Mais la machine virtuelle Java n'est pas arrêtée et l'applet continu de
vivre. Donc, si vous avez lancé des threads, des sons ou des animations à
partir de la méthode start, prenez soin de tous stopper dans le stop. Il
n'est pas rare de continuer à entendre les musiques d'une applet après
avoir quitté cette dernière : cela fait relativement
mauvais effet.
public void destroy() : cette méthode déclanche lorsque le navigateur
décide de décharger la JVM de sa mémoire. Cela intervient dès que le
navigateur décide qu'il manque de mémoire cache. Dans ce cas, si vous
retournez à l'adresse de l'applet, celle-ci devra être complètement
rechargée. Les méthodes init est start seront alors relancées.
30
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Remarques générales
En Java 1.2, les classes Swing se trouve dans le paquetage
javax.swing et ses sous paquetages. Il est fortement déconseillé de
mélanger des composants Swing et AWT dans une interface graphique.
Les composants "haut niveau"
Les composants dits de haut niveau sont :
-les fenêtres fille de la fenêtre fond d’écran, objets des classes JFrame,
JWindow, JDialog
-ainsi que les objets de la classe JApplet
Pour ces objets conteneurs, on n’ajoute pas leurs contenus directement
dans ces objets (contrairement à AWT). On passe par l’intermédiaire de
leur « ContentPane » qui est récupéré par la méthode getContentPane().
Les ajouts Swing
Par rapport à AWT, Swing propose des améliorations notoires sur certains
composants (JLabel, JButton, ..., par rapport à Label, Button, ...) et de
nouveaux composants (bulle d’aide, onglet, ...)
JLabel
On peut construire facilement un JLabel comportant une image gif ou jpg
(accompagnée d’un texte ou non).
Le constructeur le plus complet de JLabel est : public JLabel (String text,
Icon icon,
horizontalAlignment) et il existe d'autres constructeurs avec des
arguments en moins.
Le composant JTable
JTable modélise un tableau c’est à dire une structure présentant des lignes
et des colonnes, bref l'interface graphique d'un tableur. Les cellules de ce
tableur sont des
Component.
C’est un composant complexe et beaucoup de classes dont il dépend sont
dans le paquetage
javax.swing.table.
En général on met une JTable dans une
JScrollPane. Si ce n’est pas le cas les en-têtes des colonnes n’apparaissent
pas.
Les données d’un JTable sont dans le modèle
javax.swing.table.TableModel.
Le composant JTree
Modélise une arborescence. Utilise l’interface TreeModel et la classe
DefaultTreeModel (il n’y a pas de
AbstractTreeModel).
Construire un arbre
On définit tout d’abord les noeuds comme instance de la classe
DefaultMutableTreeNode. En général on utilise le constructeur : public
DefaultMutableTreeNode(Object
31
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
32
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
33
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
34
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Conclusion :
35
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
Note:
36
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
3. Indication
37
Université Sidi Mohamed Ben Abdellah Cours : Programmation JAVA
École Supérieure de Technologie de Fès Année Universitaire : 2019/2020
Département Informatique
38