Structures de données en Java
Structures de données en Java
ALGORITHMIQUE ET STRUCTURES DE
DONNEES EN JAVA
1
Préambule
Le cours de programmation JAVA s’adresse aux étudiants de 1er licence de s’initier à la technique de
la programmation événementielle du haut niveau en se basant sur quelques travaux pratiques. Notre
objectif est de faciliter l’apprentissage de la programmation dont la maitrise passe par l’écriture du
programme et son exécution sur une machine. Etant donné, nous avons porté notre choix au langage
de programmation java qui est basé sur la programmation orientée et objet à laquelle nous utiliserons
que des objets et des classes.
Java est un langage de référence en Informatique. Il est maintenant employé dans tous les domaines
et permet de réaliser des applications très diverses, des plus simples aux plus sophistiquées. Il est
aujourd’hui devenu un langage indispensable. Mais java est aussi un langage qui forme l’esprit. Conçu
pour permettre en œuvre toutes les notions de la programmation objet, c’est un langage objet à part
entière. Il engage le programmeur à raisonner dans le monde clos des objets en se plaçant du point de
vue de chaque objet. La démarche qui en découle, appelée souvent<<démarche objet>>, permet de
mieux définir les classes avec leurs propriétés et leurs fonctions, et de mieux structurer les applications
à étudier. Java est donc un langage qui se prête bien à un apprentissage initial de la programmation
objet.
De nombreux exemples d’applications seront donnés en classe pour permettre aux étudiants (e) de
bien assimiler la théorie et les techniques présentées en cours à travers la pratique au laboratoire
informatique, ainsi que d’appliquer la méthodologie de conception présentée en classe et d’utiliser les
connaissances acquises, ainsi que les outils disponible (IDE). NetBeans ; IntelliJ Idea ; Eclipse,
JDeveloper, Android Studio, DrJava, MyEclipse JGrasp, JEdit, BlueJ, codeWarrior, Visual
J++ et JBuilder.
Java est l'un des langages de programmations le plus populaires et le plus utilisé avec des millions de
développeurs qui l'utilisent depuis des décennies pour la création d'applications Web, d'applications
mobile et pleins d'autres. Il y a beaucoup d'IDE et d'éditeurs de texte Java mais le fait est que le langage
évolue rapidement au fil des années de même que les IDE.
2
CHAPITRE I COCEPTS DE BASE DE LA
PROGRAMMATION JAVA
1.1. HISTORIQUE
La POO est différente de la programmation structurée (ex: Pascal): les programmes sont
découpés en fonctions indépendantes qui sont elles-mêmes constituées de blocs d'instructions
structurées.
Les structures de données et les fonctions qui les utilisent sont séparées.
Les données sont généralement en début de programme et donc visibles de toutes les fonctions qui
suivent.
• PROBLEMES LIES A CETTE ORGANISATION:
-effets de bords (état inattendu des données dans une fonction suite à leurs modifications par
une autre fonction).
-nécessité de reconstruire le programme lorsque les structures de données sont modifiées.
• SOLUTIONS: POO
3
1.2.1. L'objet :
1.2.3. La classe :
La classe est l'élément fondamental contenant les éléments de programme: une déclaration de
données, une méthode ou une instruction appartenant à une classe.
Une classe est déclarée avec le mot- clé class.
Le concept de classe correspond à la généralisation de la notion de type des
programmes structurés.
Définition :
Une classe est une description d'un ensemble d'objets ayant une structure de données commune
et disposant des mêmes méthodes.
Les définitions des classes doivent correspondre à des unités fonctionnelles indépendantes.
Une classe est un modèle d'objet. A l'inverse, un objet a une réalité matérielle car il possède des
champs avec valeurs.
Remarque:
Une classe statique ne permet pas de construire d'objets.
Les objets apparaissent alors comme des variables d'un tel type classe: un objet est une instance de sa
classe (un objet possède un type classe).
Les valeurs des champs sont propres à chaque objet.
Les méthodes sont communes à l'ensemble des objets d'une même classe.
JAVA possède des bibliothèques de classe appelées API JAVA (Application Programmation
Interfaces, Interface de Programmation d'Application).
4
• Avantages de créer ses propres classes:
-connaissance exacte de son fonctionnement.
1.2.4. L'héritage :
L'héritage permet de définir une nouvelle classe (une sous-classe) à partir d'une classe
existante (super- classe, classe-mère) à laquelle on ajoute de nouvelles données, de nouvelles
méthodes.
L'héritage permet donc de spécialiser des classes anciennes parfaitement au point:
-économie du code.
-structuration des fonctionnalités d'un programme (lisibilité).
1.2.5. Le Polymorphisme:
Il permet à des méthodes (des fonctions) différentes dans des classes différentes d'avoir le
même nom.
Il permet d'économiser des identificateurs de fonctions (lisibilité).
JAVA est un langage de POO: un programme est formé d'au moins une classe dans laquelle
des objets sont instanciés.
Les valeurs correspondantes ne sont pas des objets même si en général ces types primitifs sont utilisés
pour définir les champs d'une classe, donc finalement un objet.
-existence de méthodes particulières appelées méthodes statiques de classe (déclarées avec le
mot- clé static) qui sont utilisables de façon indépendante d'un objet.
5
Comme ces méthodes peuvent déclarer localement des variables d'un type primitif, on retrouve les
possibilités de procédure et fonction d'un langage de programmation structuré.
Une telle méthode appelée main joue le rôle de programme principal.
-encapsulation des données non absolue.
JAVA permet des applications (graphisme sans web) et des applets (graphisme sur le web) en utilisant
pratiquement les mêmes fonctionnalités graphiques.
• Classiquement:
Un programme est portable car un même code source peut être exécuté sur différentes machines après
une nouvelle compilation.
• En JAVA:
La compilation d'un code source produit, non pas des instructions machines, mais un code
intermédiaire formé de byte codes.
D'une part, ce code est exactement le même quelque soit le compilateur et la machine concernés.
D'autre part, ces byte codes sont exécutables sur toute machine disposant du logiciel d'interprétation
appelé machine virtuelle JVM (JAVA Virtual Machine).
• PHASE 1: EDITION:
Le nom de fichier d'un programme JAVA se termine toujours par l'extension .java Exemple:
[Link]
• PHASE 2: COMPILATION:
6
-La commande du compilateur JAVA pour compiler un programme JAVA et le traduire en byte codes
est javac.
-La compilation génère un fichier possédant le même nom que la classe et contenant les byte codes
avec l'extension .class.
Le compilateur génère un fichier compilé pour chaque classe. Ainsi, si le fichier source contient
plusieurs classes, alors plusieurs fichiers ont l'extension .class.
Mettre l'extension à la suite du nom en respectant la casse du nom du fichier. JAVA est sensible
à la casse.
PHASE 3: CHARGEMENT:
Une application peut être chargée est exécutée par la commande de l'interpréteur JAVA: java
PHASE 4: VERIFICATION
PHASE 5: EXECUTION
[Link]
_______________________________________________________________
7
}
_______________________________________________________________
Une classe publique, déclarée avec le mot- clé public, est une classe qui est accessible à n'importe
quelle autre classe.
Un fichier source peut contenir plusieurs classes à condition qu'une seule classe au plus, soit publique.
Cette classe publique est la classe contenant le main .
Le code source d'une classe publique doit toujours se trouver dans un fichier portant le même nom et
possédant l'extension .java.
Le nom du fichier source et le nom de la classe doivent avoir la même casse.
Caractère d’échappement : \
Import [Link].* ;
Public class EcritureFenetre
{
Public static void main ( String[] args)
{
[Link](null,”Fenetre Java”); }
}
Exécution: Message
Fenêtre Java
8
OK
JAVA possède de nombreuses classes prédéfinies. Ces classes sont regroupées en catégories
de classes de même genre appelées package (modules). Une référence générale aux packages existe
sous l’appellation de bibliothèques de classes Java ou d’interface de programmation d’application
Java(API ou d’applications programming interface).
Tous les packages de l’API Java sont stockés dans un répertoire java ou javax qui contiennent de
nombreux sous-répertoires.
Un nom de package est associé à un répertoire.
La classe JoptionPane dans le package [Link] permet d’afficher une boîte de dialogue avec des
informations.
[Link].* ne concerne que les classes du répertoire [Link] Les classes des
sous-répertoires de [Link] ne sont pas invoquées. Pour les invoquer, il faut préciser le
sous-répertoire associé, par exemple [Link].*
Execution:
9
APPLET JAVA
Import [Link].* ;
//Méthode de lecture au clavier public
class Lecture
{
//Lecture d’une chaîne public static
String lireString()
{
String ligne_lue=null;
try
{
InputStreamReader lecteur=new InputStreamReader([Link]);
BufferedReader entree=new BufferedReader (lecteur);
Ligne_lue=[Link]();
} catch
(IOException err)
{
[Link](0);
} return
ligne_lue;
}
}
10
Ce type de lecture peut ou non mal se passer: pour cela, on utilise une construction de type “try…
catch“
11
2.4. : Règles générales d’écriture :
2.4.1 : Identificateurs :
Dans un langage de programmation, un identificateur est une suite de caractères pour désigner
les entités dans un programme :variables, méthodes, objets, classes,…
C’est une suite de lettres et de chiffres (sans espace), le premier caractère étant une lettre.
Par convention :
2.4.2 : Mots-Clés
boolean, catch, continue, else, false, int, package, …
2. 4.3: Séparateurs
C.f. manuel JAVA
2.4.5. : Commentaires
3 formes :
12
Commentaire de documentation: : pouvant être extraits automatiquement par des programmes
utilitaires de création de documentation tels que Javadoc qui génère automatiquement une
documentation au format HTML.
2.4.6 : Blocs :
Bloc délimité par les accolades { et }. Il comporte :
-aucune, une ou plusieurs déclarations de variables locales (connues que dans le bloc)
- aucune, une ou plusieurs instructions
Java utilise le système Unicode pour coder des caractères. Chaque caractère Unicode est
codé sur 2 octets conduisant à 2^16=65536 possibilités qui permettent de représenter la plupart
des alphabets et des symboles mathématiques et techniques.
Le code source est toujours actuellement édité avec un éditeur générant des caractères codés
sur 1 octet.
Il existe peu d’éditeurs de texte Unicode. Mais le compilateur Java traduit le fichier source en
Unicode avant de générer les byte codes.
Ainsi, même les caractères Unicode du code source ne sont pas portables, il sont représentés de façon
portable dans les byte codes.
La notation Java permettant d’introduire un caractère Unicode dans le code source est
réalisé avec les séquences d’échappement Unicode qui n’utilisent que des caractères ASCII : \uxxxx
où u est le symbole pour Unicode, x est un chiffre hexadécimal et xxxx désigne le caractère ayant
comme Unicode la valeur xxxx.
Il faut 4 chiffres hexadécimaux pour représenter des caractères codés sur 16 bits (16^4)= 2^16.
13
Dans une déclaration de variables, le type des variables est suivi de la liste des identificateurs de
variables séparés par des virgules.
En JAVA, les déclarations peuvent apparaître à n’importe quel endroit du programme.
De préférence, la déclaration de la variable se fait au moment de sont utilisation.
Remarque: Les champs des objets possèdent une initialisation implicite.
Exemple : 452L
Une constante peut- être exprimée en base 8(octale) en faisant précéder la valeur par 0
Une constante entière peut- être exprimée en base 16 (hexadécimale) en faisant précéder la valeur par
0x ou 0X
Exemple : 0X1A
Le type réel permet de représenter de façon approchée une partie des nombres réels.
Ainsi, pour tester l’égalité de deux nombres réels, il est préférable de comparer la valeur
absolue de leur différence à un nombre très petit.
TYPE TAILLE (en PRECISION VALEUR VALEUR
Octets) MINIMALE MAXIMALE
Float 4 7 Float.MIN_VALUE Float.MAX_VALUE
double 8 15 Double.MIN_VALU Double.MAX_VALU
E E
Par défaut: une constante réelle est de type double.
Une constante réelle peut s’écrire en notation décimale ou exponentielle.
14
Exemple : Notation décimale : 1.1 ; 1. ; .1
Notation exponentielle : 1.1E10 ; 1.E10 ; .1E10
Execution : x=10.123456789
x=10.12
3.6. : Initialisation :
Toute variable doit être initialisée avant d’être utilisée (sinon erreur de compilation)
Une variable peut être initialisée lors de sa déclaration par une constante ou une expression autre
qu’une constante, par exemple par une instruction de lecture.
Exemple : int n=10 ; n=[Link]()
15
Les situations de variables partiellement initialisées sont détectées à la compilation, par
exemple dans une structure conditionnelle si.
Mais l’initialisation d’une variable dans une structure conditionnelle si-sinon , n’entraîne pas
d’erreur de compilation.
Exemple :
int n ; if (…)
n=0 ;
…=n ; // erreur de compilation
Exemple :
int n ; if (…)
n=0 ; else
n=0 ;
…=n ; // pas d’erreur à la compilation
3.7. :Constante :
Une constante est une variable initialisée dont la valeur ne peut être modifiée dans la suite du
programme en utilisant le mot- clé final (valeur connue à la compilation) Une telle constante est
appelée constante symbolique.
Exemple :
final int N=10
Le mot- clé final peut être utilisé avec une expression d’initialisation de la valeur (valeur non connue
à la compilation mais à l’exécution)
Exemple :
final int N=2*m
Les mots-clés static et public sont souvent associés au mot- clé final.
Une constante déclarée de type static appartient à la classe ( sa place dans la classe et non dans l’objet).
Exemple : static
final int N=10
Par convention :
Les identificateurs de constantes sont obligatoirement en majuscule. Il est toujours
préférable d’utiliser des constantes symboliques plutôt que des constantes littérales.
En effet, pour changer la valeur d’une constante symbolique, il suffit de changer sa valeur dans sa
déclaration .
Par ailleurs, il est difficile de localiser toutes les utilisations des constantes sans erreur, car une même
valeur peut avoir des significations différentes.
16
Le mot- clé final peut être utilisé avec une expression constante (valeur connue à la
compilation) Exemple : final int M=10 final int N=2*m
IV. Opérateurs et expressions.
4.1. : Originalité des notions d’opérateurs et d’expressions.
Une expression est une suite d’opérandes et d’opérateurs.
Dans les langages classiques :
-l’expression possède une valeur mais ne réalise aucune action, en particulier, elle j’affecte
pas de valeur à une variable.
-l’affectation donne une valeur à une variable : réalise donc une action.
En JAVA, l’instruction est une expression se terminant par un point- virgule (instruction expression)
Une expression mixte est une expression avec des opérandes de type différent.
17
Hiérarchie des conversions d’ajustement de type :
Int ->long ->float ->double
Promotions numériques :
La promotion numérique est la conversion systématique d’un type apparaissant dans une
expression en int sans considérer les types des autres opérandes.
{byte, short,char} ->int
Exemple :
char c;
c+1 ;
|
int : valeur numérique de c
Exemple :
double x=10E10 if (x=Double.POSITIVE_INFINITY …) :
résultat est vrai
La comparaison des caractères est basée sur le code Unicode avec les relations
suivantes
‘0’<’1’<…<’9’<’A’<’B’<…<’Z’<’a’<’b’<…<’z’
18
4.5.1 : Opérateur unaire :
! (négation)
4.5.2. : Opérateurs binaires :
&(et), |(ou), ^(ou exclusif), &&(et avec court- circuit) et ||(ou avec court- circuit)
Avec les deux derniers opérateurs, le deuxième opérande n’est évalué que si sa valeur est
nécessaire pour décider si l’expression est vraie ou fausse.
Cette propriété est indispensable dans certaines constructions comme les tableaux (cas
d’une condition comportant simultanément des tests sur l’indice et les éléments d’un tableau)
Avec l’opérateur && , la condition dépendante doit être placée après l’autre condition.
Dans les expressions utilisant && et si les conditions sont indépendantes des unes des autres,
il faut placer à gauche la condition susceptible d’être fausse.
Dans les expressions utilisant || et si les conditions sont indépendantes des unes des autres, il
faut placer à gauche la condition susceptible d’être vraie.
Il impose que son premier opérande soit une référence à un emplacement dont la valeur peut
être modifiée. Par exemple, une variable non déclarée avec le mot- clé final.
Exemple : i=10
j=i=10
Il a une priorité plus faible que les opérateurs arithmétiques et relationnels. Les
conversions implicites dans l’affectation sont :
Byte -> short -> int -> long -> float -> double char ->
int -> long -> float -> double
19
L’opérateur de décrémentation - - est :
- un opérateur de pré-décrémentation quand il est placé à gauche de son
opérande
- un opérateur de post-décrémentation quand il est placé à droite de son
opérande
Exemple :
y=x++ y=x ; x=x+1 y=++x
x=x+1 ; y=x
Exemple :
(n+1)++ : FAUX
Il existe autant d’objets de cast que de types différents, y compris les types classes.
20
La conversion d’un objet d’une classe dérivée en un objet de classe de base est implicite.
La conversion inverse, ie d’un objet d’une classe de base en un objet de classe dérivée est
possible avec l’opérateur de cast.
La priorité d’un opérateur de cast est élevée. Il est nécessaire de placer entre parenthèses l’expression
concernée.
La conversion par l’opérateur de cast ne produit jamais d’erreur d’exécution.
par
variable =(expresssion_test) ?expression_1 :expression_2
Exemple : x=(a>b) ?a :b
V. Instructions de contrôle.
5.1. :Instruction if :
Exemple :
If (++i<max)… i=i+1 ; if (i<max)…
If (I++<max)… i=i+1 ; if (I-1<max)… =>conséquence:1 boucle en plus.
Un else se rapporte toujours au dernier if rencontré auquel un else n’a pas encore été attribué.
21
switch (expression)
{
case cste_1 : [suite_instructions_1]
…………………………..
case cste_n : [suite_instructions_n]
[default : suite_instructions]
}
expression : est une expression de type byte, short, int ou char ; les expressions de type byre, short
ou char ne peuvent être que de simples variables (sauf avec l’opérateur cast) ; le type long n’est pas
autorisé.
Cste_i : expression constante d’un type compatible par affectation avec le type de expression.
……………………..
int compteur=1 ;
while (compteur<=10) compteur : 1,….10
{
instruction_unique ; compteur++ ;
}
……………………
22
………………….. int compteur=0 ; while (++compteur<=10) instruction_unique ;
compteur :1,….,10
…………………
int compteur=0 ;
L’instruction do… while répète l’instruction tant que la condition de poursuite est vraie.
Une telle boucle est parcourue au moins une fois.
instruction initialisation : est une déclaration ou une suite d’expression quelconques séparées par des
virgules. La déclaration est locale au bloc. incrémentations : sont une suite d’expression quelconques
séparées par des virgules.
23
[Link] (“I=”+I+” j=”+j);
}
}
}
………………………..
for (int i=1 ; i<=100 ; i+=2) j+=i ;
……………………….
……………………..
for (int i=1 ; i<=100 ; j+= i, i+=2) ;
……………………….
6.1. : CLASSES :
La notion de classe généralise la notion de type. La classe comporte des champs (données) et
des méthodes.
La notion d’objet généralise la notion de variable. Un type classe donné permet de créer (d’instancier)
un ou plusieurs objets du type, chaque objet comportant son propre jeu de données.
24
6.1.1. : Définition d’une classe :
Une classe contient un en-tête et un corps comportant les définitions de ses champs et
méthodes.
Class Equation
{
// Définition des champs et méthodes de la classe.
25
…………………
}
En l’absence du mot- clé public, l’accès à la classe Equation est limité aux seules classes du même
package.
Le mot- clé private précise que les champs de la classe Equation ne sont pas accessibles à
l’extérieur de la classe, ie en dehors de ses propres méthodes.
encapsulation des données.
-initialisation
-résolution -affichage
Equation uneEquation
Ainsi, l’affectation
UneEquation=new Equation()
Créée (construit) un objet de type Equation et place sa référence dans uneEquation qui doit avoir été
déclarée au préalable.
L’opérateur new fait appel à Equation() qui est le constructeur par défaut de la classe Equation .
Après avoir déclaré et créé un objet, il est possible d’appliquer les méthodes à l’objet
correspondant, ie référencé par uneEquation .
Le préfixe uneEquation précise à la méthode sur quel objet elle doit opérer. Ainsi, l’instruction
coeffX2=X2 de la méthode initialisation() place la valeur reçue pour X2 dans le champ coeffX2 de
l’objet uneEquation .
L’appel d’une méthode se fait en préfixant le nom de la méthode par le nom de l’objet suivi d’un point
:
[Link]éthode (liste_arguments)
27
-sans attribut (accès de package) : classe reste accessible à toutes les classes du même package, donc
en particulier du même fichier source.
La compilation créée un fichier .class par classe.
Import [Link] ;
Fichier : [Link]
import [Link] ;
6.2. :CONSTRUCTEURS
6.2.1. : Principe :
29
La méthode d’initialisation permet d’attribuer des valeurs aux champs d’un objet de type
Equation . Cette méthode doit donc être impérativement appelée.
Le constructeur permet :
-d’automatiser le mécanisme d’initialisation
-d’attribuer des valeurs initiales mais également des actions
Le constructeur est une méthode portant le même nom que la classe et sans valeur de retour
……..en un constructeur :
UneEquation=new Equation() ;
[Link](1.0,5.0,1.0);
……….en un appel du constructeur
//appel du constructeur
Equation uneEquation ;
UneEquation=new Equation(1.0,5.0,1.0) ;
Remarque:
L’instruction uneEquation=new Equation() est impossible (erreur de compilation) car la classe
Equation dispose d’un constructeur qui, dans cet exemple a besoin de 3 arguments réels.
Il existe une solution avec le constructeur vide.
Une classe peut n’avoir aucun constructeur (constructeur par défaut sans argument également
appelé constructeur vide implicite).
Par exemple :
Equation une Equation = new Equation()
31
-initialisation par défaut de tous les champs par objet.
-initialisation explicite des champs de l’objet.
-exécution des instruction du corps du constructeur.
Exécution : coeffX2=0.0
coeffX2=1.0
Comme pour une variable locale, une initialisation de champ peut comparer une constante ou
une expression courante.
Les initialisations des champs doivent être effectuées dans le constructeur (fonction du
constructeur).
La fonction d’un constructeur est de réaliser l’allocation dynamique de la mémoire nécessaire à la
création de l’objet qui est réalisé à l’exécution.
Par opposition, l’allocation statique de la mémoire est réalisée à la compilation.
Comme une variable locale, un champ peut être déclaré avec l’attribut final afin d’imposer
une seule initialisation.
Alors qu’une variable peut être initialisée tardivement, n’importe où dans une méthode, un champ
déclaré avec l’attribut final doit être initialisé au plus tard par le constructeur. Par ailleurs, il n’existe pas
d’initialisation par défaut, il faut donner une valeur.
Exécution
Sol1= -0.20871215252208009
Sol2= -4.1912878474779195
33
-Les méthodes d’altération (mutation) de la forme setxxx, qui modifient l’état d’un objet, ie les valeurs
de certains champs :
//Classe Equation
class Equation {
public void setRacine1(double rac1)
{ racine1=rac1;
}
Il est impossible de définir une variable locale d’un type primitif sans l’initialiser. Cette règle
d’initialisation s’applique également aux variables locales de type classe.
35
Cette règle s’applique également aux champs de type classe (objets) pour lesquels cette valeur nulle
correspond à une valeur particulière de référence notée par le mot- clé null.
if (uneEquation==null)
[Link](“Référence null”);
………..
}
}
Tant qu’un objet n’a pas été créé par new, la référence sur cet objet vaut null. La référence
null ne pointe sur aucun objet. Une tentative d’accès à un objet non créé provoque la levée d’une
exception de type NullPointerException. Il est parfois nécessaire d’initialiser des références à null.
L’affectation de variables de type objet se limite à la recopie de références. Elle n’entraîne pas la
recopie de la valeur des objets.
Les opérateurs == et != portent sur les références des objets et non pas sur les valeurs de leurs champs.
Leur intérêt est limité.
Exemple: Pour comparer 2 objets de type chaîne, il faut comparer le contenu, donc utiliser la méthode
Equals().
6.5. : RAMASSE-MIETTES :
L’opérateur de création d’un objet est new.
Il n’existe pas d’opérateur de destruction d’un objet, comme on en dispose en Pascal.
Java utilise un mécanisme de gestion automatique de la mémoire. Possibilité de créer
un objet sans référence.
uneEquation.résolution();
………..
}
}
37
6.6.2. : Méthodes fonction fournissant un résultat
:
Méthode avec le type du résultat dans son en-tête.
//Méthode somme
public double somme()
{
double som ; //double som=0.0 ;
som=racine1+racine2 ;
return som ; }
Méthode appelée :
Possibilité d’utiliser le résultat d’une méthode fonction dans une expression de la classe Equation.
Utiliser des arguments effectifs de même type que les arguments formels.
Eviter les possibilités de conversion implicite légale.
Arguments effectifs : arguments fournis lors de l’appel de la méthode. Ces arguments peuvent
être des expressions (la transmission se fait par valeur).
Une variable locale est obligatoirement d’un type primitif ou d’un type classe. Une variable
locale de type classe contient la référence à un objet.
Toute variable locale, y compris une référence à un objet, doit être impérativement initialisée avant
d’être utilisée.
Il est possible de définir des variables locales à un bloc : for, if, bloc artificiel, etc.,
…
Un champ de classe est un champ unique pour toutes les instances d’une même classe (champ
global partagé par toutes les instances de classe). Le champ de classe existe indépendamment de tout
objet de sa classe.
Un champ de classe est déclaré avec l’attribut statique.
L’appel d’un champ de classe se fait en précisant le nom du champ par le nom de la classe suivi d’un
point :
[Link]
Class Equation {
….. private static int nbRésolution=0 ;
39
//Constructeur.
Public Equation(double X2, double X1, double X0)
{
…
nbRésolution++ ;
}
//Méthode de résolution public
void résolution()
{
…
}
//classe Test
public class EquationSecondDegre
{
//Méthode principale
public static void main (String[ ] args)
{
Equation uneEquation = new Equation(1.0,5.0,1.0);
UneEquation.résolution();
[Link];
Equation uneEquation = new Equation (2.0,6.0,2.0);
….
Exécution: nbRésolution=1
Racine1=-0,21
Racine2=-4,79
NbRésolution=2
Racine1=-0,38
Racine2=-2,62
Class Equation
{
…
private int nbRésolution=0 ;
……
}
//Classe test
public class EquationSecondDegre {
…..
}
EXECUTION:
nbRésolution=1 Racine1=-0,21
Racine2=-4,79
NbRésolution=2
Racine1=-0,38
Racine2=-2,62
L’appel d’une méthode de classe se fait en préfixant le nom de la méthode par le nom de la classe
suivi d’un point :
[Link]éthode .
Class Equation {
….. private static int nbRésolution=0 ;
//Constructeur.
Public Equation(double X2, double X1, double X0)
{
…
nbRésolution++ ; }
41
//Méthode affichage public
void affichage()
{
[Link](« nbRésolution= »+nbRésolution() ;
…
}
}
//classe Test
public class EquationSecondDegre
{
//Méthode principale
public static void main (String[ ] args)
{
Equation uneEquation = new Equation(1.0,5.0,1.0);
UneEquation.résolution();
[Link];
Equation uneEquation = new Equation (2.0,6.0,2.0); [Link](«
nbSolution= »+[Link]()) ;
….
Exécution: nbRésolution=1
Racine1=-0,21
Racine2=-4,79
NbRésolution=2
Racine1=-0,38
Racine2=-2,62
Utilisation :
Les méthodes de classe sont utilisées pour :
-le comptage des objets d’une classe.
-la description de la classe
-le regroupement de fonctionnalités, par exemple la classe Math.
L’initialisation des champs statiques est faite avant la création d’un objet de la classe puisqu’un
champ statique ne dépend pas des objets de la classe. Cette initialisation se fait donc soit à la
déclaration d’un objet de la classe , soit lors de l’appel d’une méthode statique de la classe et se limite
donc aux 2 étapes :
-initialisation par défaut
-initialisation explicite éventuelle lors de la déclaration
Un champ statique avec l’attribut final doit obligatoirement recevoir une valeur initiale au
moment de sa déclaration puisqu’il ne peut être initialisé implicitement, ni être initialisé par un
constructeur.
static
{
……..
}
Ce bloc statique permet de faire des initialisations de champs statiques qui ne peuvent pas être faites
en une seule expression.
En effet, il n’est pas possible d’utiliser un constructeur qui n’est pas concerné par l’initialisation des
champs.
Les instructions d’un bloc statique n’ont accès qu’aux champs statiques de la classe.
6.8.1. : Définition :
La surdéfinition (surcharge) d’un symbole conduit à plusieurs significations différentes du
symbole entre lesquelles on choisit en fonction du contexte. Le symbole peut être un opérateur
+(addition, concaténation, etc. …) mais également en JAVA des méthodes.
Les méthodes usuelles et statiques peuvent être redéfinies.
Une méthode publique ou privée peut être redéfinie.
Plusieurs méthodes peuvent avoir le même nom à condition que le nombre et le type de leurs
arguments permettent au compilateur d’effectuer un choix, ie à condition qu’elles aient des signatures
différentes (polymorphismes).
43
La signature d’une méthode est constituée du nom de la méthode suivi de la liste ordonnée des types
de ses arguments. Le nom des arguments et le type de retour ne sont pas considérés dans la signature.
Les méthodes avec même signature mais de types de retour différents sont interdites.
6.9. : TRANSMISSION D’INFORMATIONS AVEC LES METHODES :
Cependant, avec une variable de type objet, la méthode reçoit une copie de la référence.
Ainsi, la méthode peut modifier l’objet initial qui n’a pas été recopié par le biais de ses champs ou de
ses méthodes. La méthode appelée a accès à l’objet par sa référence.
Une modification de la référence à l’intérieur de la méthode appelée, par exemple une nouvelle
instance, n’est pas transmise à la méthode appelante par ses arguments, il faut utiliser sa valeur de
retour.
En conclusion :
-la transmission des types primitifs se fait par valeur.
-la transmission des objets se fait par référence (adresse).
Ainsi, une méthode ne peut pas modifier la valeur d’un argument effectif d’un type primitif
(après l’appel d’une méthode).
Moyens pour transmettre la valeur d’une variable de type primitif à l’extérieur de la méthode appelée
:
Exécution:
Racine1=-0,21
Racine2=-4,79
Racine1=-0,21
Racine2=-4,79
Nombre de systèmes=2
Facteur multiplicatif des coefficients des deux systèmes=2.0
->Créer une méthode statique qui va tester s’il y a un facteur multiplicatif entre les coefficients
des deux équations.
Import [Link] ;
Class Equation
{
…
//Méthode de test des coefficients dans deux systèmes. //Méthode de classe
(indépendante des objets)
public static double tesCoefficients(Equation E1, Equation E2)
{
final double eps=1E-10 ; double facteur=0.0;
facteur=E2.coeffX2/E1.coeffX2; if
((((E2.coeffX1/E1.coeffX1)-facteur)>eps)||
(E2.coeffX0/E1.coeffX0)-facteur)>eps) facteur=0 .0 ; return
facteur ;
}
…
}
//classe test
public class EquationSecondDegre
{ public…
{
equation uneEquation= new Equation (1.0;5.0,1.0);
uneEquation.Résolution(); [Link](); …..
Equation uneEquation1 = new Equation (2.0,10.0,2.0) ;
UneEquation1.Résolution(); [Link]():
….
[Link](« Nombre de systèmes= »+[Link]ème()) ; …..
}
}
Une méthode d’un objet ou d’une classe t (méthode appelée pour un objet o) recevant en
argument un objet p de la même classe t, a accès aux champs
et méthodes l’unité d ‘encapsulation est la classe privés de p : et non l’objet.
L’autorisation d’accès concerne tous les objets de la classe et non, seulement, l’objet courant.
Une méthode d’une classe A recevant en argument un objet de classe B?A, n’a pas accès aux
champs et méthodes privés de B.
class Equation
{
…
//Méthode de doublement des coeffs ax^2+bx+c (ne marche pas)
public void doublementCoeffs(double a, double b, double c)
45
{
a=2*a ;
b=2*b ;
c=2*c;
….
//Méthode principale
…
double cX2=1.0;
double cX1=5.0;
double cX0=1.0;
…
[Link](cX2,cX1,cX0) ;
//Transmission par valeur cX2, cX1, cX0 n’ont pas leurs valeurs doublées.
Exécution :
Equation=1.00*2+5.00+1.00
Racine1=-0,21
Racine2=-4.79
Equation=1.00*2+5.00+1.00
…
2 ème version :
….
a=2*a ;
….
[Link](« a= »+a+ »b= »+b+ »c= »+c) ;
Retun a;
}
…
}
class Equation
{
…
public void doublementCoeffs()
{
coeffX2=2*coeffX2;
coeffX1=2*coeffX1;
coeffX0=2*coeffX0;
}
…
}
class Equation
{
…
public Equation doublementCoeff()
{
Equation E= new Equation();
E.coeffX2=2*coeffX2;
E.coeffX1=2*coeffX1;
E.coeffX0=2*coeffX0;
Return E ;
}
…
}
L’instruction return est suivie d’une expression de même type que celui de la méthode.
De plus, elle termine l’exécution d’une méthode et provoque un retour à la méthode d’appel
(méthode appelante).
Il est possible d’avoir plusieurs return dans une méthode, par exemple en cas
d’instructions conditionnelles . De préférence, un seul return.
47
3 propriétés :
(1) Le mot-clé this est une référence à l’objet courant dans sa globalité.
Ce constructeur est appelé avec un nom de méthode this(), donc suivi de parenthèses
entourant les arguments dans la première instruction du constructeur.
Class Equation
{
…
//Constructeur vide
public Equation()
{
this(0.0,0.0,0.0) ;
}
//Constructeur à 3 arguments pour ax2+bx+c
public Equation(double X2, double X1, double X0)
{
coeffX2=X2 ;
coeffX1=X1 ;
coeffX0=X0 ;
nbresolution++ ;
}
//Constructeur à 2 arguments pour ax2+c public
Equation (double X2, double X1, double X0)
{
this(X2,0.0,X0) ;
}
……..
}
……….
2 types de récursivité :
-récursivité directe : une méthode comporte au moins un appel à elle-même
-récursivité croisée : l’appel d’une méthode entraîne l’appel d’une autre méthode qui
à son tour appelle la méthode initiale.
Possibilité de cycles faisant intervenir plus de 2 méthodes.
La récursivité s’applique aux méthodes usuelles et aux méthodes statiques( de classe).
Programme Factoriel :
Package coursjava ;
Class util
{ public static long fac(long n)
{
if (n>1) return (fac(n-1)*n);
else return 1;
}
}
Exécution :
Donner un entier positif : 10
Résultat=3628880
Class Externe
{
class interne
{
//Champs et méthodes de la classe interne
}
//champs et méthodes de la classe externe
//méthode de la classe externe
Class externe
{
class interne
{
//champs et méthodes de la classe interne
Une méthode statique d’une classe externe ne peut créer aucun objet d’une classe
interne car une méthode statique n’est associée à aucun objet.
Une classe interne ne peut pas contenir des champs statiques et des méthodes
statiques.
6.12. : PACKAGES :
6.12.1. : Définition :
Exemples :
51
-le package coursjava est placé dans un répertoire coursjava, par exemple D:\…
\coursjava
-le sous-package chapitre1 du coursjava est placé dans un répertoire D:\…
\coursjava\chapitre1
L’attribution d’une classe à un package se fait dans la 1 ère ligne du fichier source
package nom_package Exemples :
Package coursjava
Package coursjava.chapitre1
Par convention, les noms de package sont en lettres minuscules. La hiérarchie des
packages se fait du général au particulier. Toutes les classes d’un même fichier source
appartiennent donc toujours à un même package. Si aucun package n’est déclaré, les
classes du fichier source appartiennent au package par défaut.
//classe test
public class EquationSecondDegre
{
//méthode principale
public static void main (String [ ] args)
{
[Link] uneEquation= new [Link](1.0,5.0,1.0);
uneEquation.résolution();
[Link]();
….
}
}
Il est inutile de préciser le nom du package pour les champs et les méthodes après la
création de l’objet.
Import [Link];
//classe Test
public class EquationSecondDegre
{
//méthode principale
public static void main (String [ ] args)
{
Equation uneEquation = new Equation(1.0,5.0,1.0);
…
}
}
import [Link];
//classe Test
import coursjava.*;
Remarques:
(1) “import coursjava.*” (sans le caractère de substitution*) n’importe que les classes de
coursjava et pas les classes des sous-packages éventuels.
(2) il n’est pas possible d’utiliser le caractère de substitution * pour des packages
(uniquement pour des classes).
53
(3) Le compilateur ne compile que les classes utilisées dans un package comportant
également des classes inutilisées.
La portée d’une classe est définie comme la zone dans laquelle la classe est
accessible.
Cette portée est déterminée par l’attribut de portée lors de la déclaration de la classe :
-avec l’attribut public : la classe est accessible à toutes les autres classes.
-avec l’absence d’attribut, la classe n’est accessible qu’aux classes du même
package.
Les classes non publiques sont généralement des classes auxiliaires du package.
L’attribut public n’a pas d’importance quand les classes du projet utilisant le package
par défaut, à l’exception de la classe contenant main qui doit être publique pour pouvoir être
reconnue par la machine virtuelle.
-avec l’attribut public : les champs et les méthodes sont accessibles depuis
l’intérieur de la classe.
-avec l’attribut private : les champs et les méthodes ne sont accessibles qu’aux
méthodes de la classe.
-avec l’absence d’attribut : les champs et les méthodes ne sont accessibles qu’aux classes
du même package (accès de package).
A noter :
-avec l’attribut protected :
les champs et les méthodes sont accessibles aux classes du même package ainsi qu’à
ses classes dérivées qu’elles appartiennent ou non au même package.
VII. TABLEAUX
7.1.1 Introduction :
Un tableau est un ensemble d’éléments de mêmes types, désigné par un nom unique.
Chaque élément étant obtenu par un indice de position sur cet ensemble. Un tableau
est un objet.
int t[ ] ou int[ ] t
Les éléments d’un tableau peuvent être de type primitif ou de type objet.
Exemple : Equation t[ ]
Remarque :
Ou
Int t[ ];
T= new int [n];
55
Ou
La dimension du tableau peut varier d’une exécution à l’autre. Une fois l’objet tableau
créé, sa taille ne peut plus être modifiée mais sa référence peut être modifiée en désignant
d’autres tableaux.
Int t[ ] = {1,2,3,4,5} ;
T[i]
Le champ length permet de connaître le nombre d ‘éléments d’un tableau de référence qui
évolue au cours de l’exécution du programme.
Length n’est pas une méthode.
Aucun champ ne devrait être public. Mais il est impossible de le modifier parce qu’il est
déclaré avec le modificateur final.
Exemple :
For (int i=0 ;i<[Link];I++)
//classe test
public class EquationSecondDegre
{
//Méthode principale
public static void main (String [ ] args)
{
Equation systeme [ ] = new Equation [2];
Comme avec les objets, lorsqu’on transmet un nom de tableau en argument d’une
méthode, on transmet une copie de la référence au tableau.
La méthode agit alors directement sur le tableau (transmission par adresse).
Package coursjava ;
Import [Link] ;
//classe Equation
{
…
Int t[ ] [ ]
Ou
Int [ ] t[ ]
Ou
Int [ ] [ ] t
t est une référence à un tableau dans lequel chaque élément est lui-même une référence à
un tableau d’entiers.
Création d’un tableau à deux dimensions :
59
Un tableau a un champ length qui est égal à sa dimension s’il est mono dimensionnel et à
sa première dimension s’il est multidimensionnel.
[Link]=2
t[0].length=3
t[1].length=4
Ou
Int t[ ];
T=new int [NLIG] [NCOL]
Ou
VIII. HERITAGE:
8.1.: INTRODUCTION:
[Link] du constructeur :
-création d’un objet par new sans argument : appel du pseudo-constructeur par défaut (la
classe ne comporte aucun constructeur)
-création d’un objet par new avec argument : appel du constructeur ayant la même
signature (nombre et type des arguments).
61
(ii) Cas d’une classe de base avec un constructeur et une classe
dérivée avec un constructeur :
Pour initialiser des champs de la classe de base encapsulés (attibut private), la classe
dérivée doit posséder des méthodes d’altération ou utiliser le constructeur de la classe de
base.
Un constructeur d’une classe dérivée appelle un constructeur d’une classe de base avec
sa 1ère instruction.
Le constructeur appelé est désigné par le mot-clé super suivi éventuellement de ses
arguments entre parenthèses.
//classe dérivée
class ClasseDerivee extends Equation
{
public ClasseDerivee(double a, double b, double c)
{
super(a,b,c) ;
}
}
Class A
{
//sans constructeur
…..
}
class B extends A
{
public B()
{
super();
….
}
}
Class A
{
//Pas de constructeur
…..
}
class B
{ // Pas de constructeur
}
La construction d’un objet de type B, B b=new B(), entraîne l’appel du constructeur par
défaut de A.
Class A
{
// constructeur1
public A()
{…}
//constructeur2
public A(int n)
{….}
……
}
class B extends A
{
// pas de constructeur
63
}
Le constructeur d’un objet de type B, B b=new B() entraîne l’appel du constructeur sans
argument de A.
Class A
{
//constructeur2
public A (int n)
{..}
…..
}
class B extends A
{
// pas de constructeur
}
La construction d’un objet de type B entraîne une erreur de compilation car le consructeur
par défaut cherche à appeler un constructeur sans argument de A qui n’existe pas. Il ne peut
également pas appeler le constructeur par défaut de A puisqu’il existe un constructeur avec
argument.
Phases de création d’un objet de classe dérivée avec class B extends class A :
-allocation mémoire de l’objet de type B : champs hérités et champs propres.
-initialisation par défaut de tous les champs (hérités de A et propres à B) de B aux
valeurs « nulles ».
-initialisation explicite des champs hérités.
-exécution des instructions du constructeur de A
-initialisation explicite des champs propres -
exécution des instructions du constructeur de B
Class Point
{ private int x,y
;
public Point()
{
this(0.0);
}
…
}
P=new Point(10,20) ;
C=new Cercle(30,40,50);
Une classe dérivée permet de redéfinir une méthode de sa classe de base ou plus
généralement d’une classe ascendante, en masquant la méthode de la classe de base.
La redéfinition d’une méthode s’applique à une classe et à toutes ses descendantes
jusqu’à ce que l’une d’entre elles redéfinisse éventuellement, à nouveau, la méthode.
Exemple :
Pour appeler la méthode affichage de la classe de base, il faut préfixer affichage par le mot
super.
Class A
{
public void m (int n)
{
…..
}
……….
}
67
class B extends A
{
public void m(double x)
{
…….
}
……
}
A a; B b; int n; double x;
a.m(n); appel de m(int n)
a.m(x) ; arreur de compilation
b.m(n) ; appel de m(int n)
b.m(x) ;appel de m(double x).
Valeur de retour :
Lors de la surdéfinition d’une méthode, il n’est pas nécessaire de respecter le type
de la valeur de retour.
Lors de la redéfinition d’une méthode, il faut respecter le type de la valeur de retour.
Droits d’accès :
La redéfinition d’une méthode ne doit pas diminuer les droits d’accès à cette
méthode.
Elle peut les augmenter, ie étendre sa zone de lisibilité.
Règles de redéfinition d’une méthode d’une classe ascendante par une classe dérivée.
-même signature.
-valeurs de retour des deux méthodes de même type.
-droits d’accès de la méthode de la classe dérivée au moins supérieure………
……………….
8.6. : POLYMORPHISME :
8.6.1. : Définition :
Package coursjava ;
Class Equation
{
...
public void affichage()
{
…..
}
}
//Classe Test
public static void main (String[ ] args)
{
Equation système[ ]=new Equation [2];
Systeme[0]=new Equation(1.0,5.0,1.0);
Systeme[1]=new ClasseDerivee(2.0,10.0,2.0);
For(i==0;i<[Link];i++)
{
systeme[i].résolution;
systeme[i].affichage;
[Link](“...”);
Execution:
Equation=1.00*x2+5.00x+[Link]
Racine1=-0,21
Racine2=-4,79
Package coursjava ;
Class Equation
{
...
public void affichage()
{…
}
}
Package coursjava ;
Import [Link] ;DecimalFormat ;
//Classe Equation
class Equation
{
…
public void affichageCommun()
{
affichageSpécifique;
...
}
public void affichageSfécifique()
{
[Link](« Equation du 2nd degré ») ;
}
}
class ClasseDérivée extends Equation
{
public ClasseDérivée (double a, double b, double c)
{
super(a,b,c) ;
}
71
8.6.5. : Polymorphisme et surdéfinition :
Compatibilité :
Il existe une conversion d’une référence à un objet de classe T en une référence à
un objet d’une classe ascendante de T. Cette conversion intervient aussi bien dans les
affectations que les arguments effectifs.
Ligature dynamique :
Dans un appel de la forme x.f(…) où x est supposé de classe T, le choix de f est
déterminé de la façon suivante :
-A la compilation :
On détermine dans la classe T ou ses ascendantes, la signature de la meilleure méthode f
convenant à l’appel, définissant ainsi le type de la valeur de retour.
-A l’exécution :
On recherche la méthode f de signature et de type de retour voulus, à partir de la classe
correspondant au type effectif de l’objet, référencé par x. Cet objet est obligatoirement de
type T ou descendant.
Si cette classe ne comporte pas de méthode appropriée, on remonte dans la hiérarchie
jusqu’à ce que l’on en trouve une, à la limite on remonte jusqu’à T.
*/
L’opérateur binaire instanceof prend un objet comme 1er opérande et une classe
comme 2e opérande.
Le résultat vaut true si l’objet est une instance de la classe et false dans le cas contraire.
Exemple :
Equation p =new Equation(1.0,5.0,1.0);
If (p instanceof Equation) [Link](“OK”);
8.7.1. : Définition :
Class Equation
{
…
}
est équivalent à :
Une variable de type Object peut être utilisée pour référencer un objet de type
quelconque.
Cette particularité peut être utilisée pour manipuler des objets dont on ne connaît
pas le type exact à un certain moment.
Cependant, pour appliquer une méthode précise à un objet référencé par une
variable de type Object, il faut effectuer une conversion puisque la méthode n’existe pas
dans la classe Object.
0=uneEquation;
((Equation)0).affichage() ;
73
//OU
La méthode toString fournit un objet de type String avec une chaîne de caractères
contenant :
//Classe Test
public class EquationSecondDegre
{
//Méthode principale
public static void main(String[ ] args)
{
Equation systeme[ ]= new Equation[2];
Systeme[0]=new Equation(1.0,5.0,1.0);
Systeme[1]=new ClasseDérivée(2.0,10.0,2.0);
[Link](“Sysqteme[0]=”+Systeme[0].toString());
[Link](“Sysqteme[1]=”+Systeme[1].toString());
….
Exécution :
Systeme[0]=[Link]@310d42
Systeme[1]=[Link]érivée@5d87b2
Class Equation
{
….. public boolean
equals(classeDérivée e)
{
return ((coeffX2==e.coeffX2)
&& (coeffX1==e.coeffX1)
&& (coeffX0==e.coeffX0);
}
}
......
75
Object o ;
o=new int[5] ;
Class B extends A
{
……
}
Rappel :
Le mot-clé final appliqué à des variables locales ou à des champs d’une classe,
interdit la modification de leur valeur.
Une méthode déclarée final ne peut pas être redéfinie dans une classe. Une
classe déclarée final ne peut plus être dérivée.
Avantages :
-détection d’erreur à la compilation et non à l’exécution.
-optimisation du code
Inconvénients :
-impossibilité de modification du code.
Une classe abstraite est une classe qui ne permet par d’instancier des objets.
Elle sert de classe de base pour une dérivation
Abstract class A
{
…..
}
Abstract class A
{
public void résolution()
{…
}
public abstract void affichage() ;
…..
}
Déclaration : A a ;
Instanciation impossible. A=new A(…) ; //pas possible
Pour créer des objets, il faut créer une sous-classe dans laquelle toutes les méthodes abstraites sont
définies.
Cette classe qui n’est plus abstraite peut être instanciée.
Dérivation :
Class B extends A
{
public void affichage()
77
{…
}
…
}
Egalement possible:
A a = new B(..);
8.9.2.: Propriétés:
Une classe qui possède au moins une méthode abstraite est abstraite :
L’instanciation est impossible. Elle devrait être déclarée avec le mot-clé abstract même si
cette déclaration n’est pas obligatoire. Une méthode abstraite doit obligatoirement être
déclarée publique.
Dans l’en-tête d’une méthode abstraite, les arguments formels doivent être présents même s’ils n’ont
aucune utilité.
Une classe dérivée d’une classe abstraite ne doit pas obligatoirement redéfinir
toutes les méthodes abstraites de la classe de base.
Une classe dérivée qui comporte des méthodes abstraites de la classe de base non
redéfinies, reste abstraite. Une classe dérivée d’une classe non abstraite peut être
déclarée abstraite et/ou contenir des méthodes abstraites. Cette propriété est utilisée
implicitement puisque toutes les classes dérivent de Object.
8.9.3. : Objectifs des classes abstraites :
8.10. : INTERFACES :
8.10.1. : Introduction :
8.10.2. : Propriétés :
Une classe peut implémenter plusieurs interfaces alors qu’une classe ne peut
dériver que d’une seule classe abstraite.
Le concept d’interface se superpose à celui de dérivation et non s’y substitue.
Une interface peut se dériver.
Il est possible d’utiliser des variables d’interface.
Exemple :
Public interface I
{
public abstract void résolution() ;
public abstract void affichage() ;
}
Class A implements I
{ //Redéfinition de résolution();
//Redéfinition de affichage() ;
}
79
Il est impossible de différer les définitions de résolution et affichage, comme on pourrait le
faire avec une classe abstraite.
Public interface I1
{
void résolution() ;
}
public interface I2
{
void affichage();
}
Public interface I
{
….
}
Ii ;
Il est impossible d’instancier une interface, comme avec la classe abstraite. Ainsi,
il est impossible d’affecter à i une référence à un objet de type I.
Il est possible d’affecter à n’importe quelle référence à un objet d’une classe implémentant
l’interface I.
Cette classe peut être quelconque, non nécessairement liée par l’héritage, du
moment qu elle implémente l’interface I.
Public interface I
{…
}
class A implements I
{
…….
}
I i = new A (…);
Une interface peut contenir des expressions constantes qui seront accessibles à
toutes les classes implémentant l’interface.
Par définition, les expressions constantes sont static et final. Ainsi,
les mot-clés static et final peuvent être omis.
//Interface
interface EquationGeneral
{
static final int N=10;
…
}
//Interface
interface EquationGeneral
{
int N=100;
……
}
EquationGeneral N
Dans une interface, les méthodes doivent être implémentées dans les classes alors que
les constantes sont utilisables par les classes.
81
/*NE SERA PAS UTILISE*/
8.10.8. : Dérivation d’une interface :
Une interface peut être une généralisation d’une autre interface en utilisant le
motclé extends : dérivation d’interface ou héritage d’interface.
Interface I1
{
static final int N=1 ;
void résolution();
}
interface I2 extends I1
{
static final int M=100;
void affichage();
}
interface I2
{
static final int N=10 ;
static final int M=100;
void résolution();
void affichage();
}
interface I1
{
void f(int n) ;
void g();
}
interface I2 extends I1
{
void f(double x);
void g() ;
}
La classe A peut implémenter les 2 interfaces en redéfinissant les 2 méthodes void f(int) et
void f(double) mais une seule méthode void g().
interface I1
{
void f(int n) ;
void g();
}
interface I2 extends I1
{
void f(double x);
int g() ;
}
IMPOSSIBLE : on ne peut pas avoir dans la même classe 2 méthodes g() : une
définissant void et l’autre int. -> Question de polymorphisme.
Les classes enveloppes permettent de convertir les types simples en type objets.
Elles permettent d’avoir des méthodes et de compenser le fait que les types primitifs ne
soient pas des classes.
Exemples :
Integer iObj= new Integer(10) ;
83
Double dObj= new Double(10.1) iObj contient la référence à un objet de
type Integer encapsulant l’entier 10.
Exemples :
int i= [Link](); //i=10 double d=
[Link](); //d=10.1
La méthode typeSimpleValue() permet de faire des conversions entre les différents types
numériques (pas le booléen)
public->private
/*Pas étudié*/
[Link] ANONYMES :
Aa;
A=new A()
{
//Champs de la classe anonyme dérivée de A
//Méthodes de la classe anonyme dérivées de A.
…..
};
équivalent à :
class A1 extends A
{
………
}
A1 a =new A1();
IX . CHAINES DE CARACTERES.
9.1.1. :Introduction :
Déclaration :
String ch
Création automatique : ” ”
La notation Java désigne un objet de type String créé automatiquement par le compilateur.
String ch= ” java ” ;
85
String ch3=new String(ch2) : ch3 contient la référence à une chaîne copie de ch2.
Bien que les chaînes soient des objets, elles se manipulent comme des données de type
primitif.
Il n’est donc pas nécessaire d’utiliser l’opérateur new.
ChTemp=ch1 ;
Ch1=ch2 ;
Ch2=chTemp;
[Link](” java ”) ;
[Link](” ch ”) ;
Comme pour les autres types primitifs, il n’existe pas de méthode standard permettant de
lire une chaîne au clavier.
87
Elle retourne :
-l’entier associé à l’indice du 1er caractère de la sous-chaîne si elle est trouvée. -
la valeur –1 sinon.
String ch=”java”;
Int I=[Link](‘j’); //I=0 on peut passer ‘java’ en type chaîne ou en type String
Int I=[Link](“j”); //I=0
Cette méthode permet de trouver la 1ère occurrence d’un caractère ou d’une sous-chaîne
donnée en argument, à partir d’une position donnée en 2è argument d’une chaîne.
String ch=”java”;
Int I=[Link](‘v’); //I=2
Int I=[Link](“v”,3); //I=-1
La méthode lastIndexOf() effectue les mêmes recherches que la méthode indexOf() mais
en analysant la chaîne depuis sa fin.
[Link](ch2);
[Link](“java”);
Remarque:
Object o;
[Link](…) ; //méthode equals de Object.
// comparaison de références.
String ch ;
[Link](…) //méthode equals de String.
//comparaison de valeurs.
89
9.4.: MODIFICATION DE CHAINES:
->elle est modifiée, mais création d’une nouvelle chaîne : il y aura 2 chaînes…
-soit tous les caractères compris entre 2 positions données, la 1ère position étant incluse
et la 2ème position étant exclue.
Public String subString(int beginIndex, int endIndex)
[Link] DE CHAINES:
Il est possible de créer des tableaux d’objets, donc en particulier des tableaux de chaînes.
Exécution:
Fortran
Pl1
....
Même exécution…
Remarques :
La conversion d’un type primitif ou objet, en une chaîne, aboutit toujours .
La conversion d’un réel flottant en chaîne peut conduire à garder ou à perdre le symbole
puissance E.
Exemple:
Autre constructeur de la classe String qui ne considère qu’un certain nombre de caractères
à partir d’une position donnée.
Public String (char[ ] value, int offset, int count)
Exemple:
int n = [Link](s);
Remarques:
-Le signe + n’est pas accepté par les méthodes de conversion en entier.
-le signe + est accepté par les méthodes de conversion en réel.
Exemple:
String ch;
Char tab[ ] = [Link]();
93
Public static void main(String[ ] args)
{
…;
}
La méthode main reçoit un argument de type tableau de chaînes, destiné à contenir les
éventuels arguments fournis au programme lors de son lancement à partir d’une ligne de
commande.
3 constructeurs :
public StringBuffer()
public StringBuffer(int length) public
StringBuffer(String s)
Création d’un objet de type StringBuffer à partir d’un objet de type String:
String ch ;
StringBuffer chBuf=new StringBuffer(ch) ;
|->pour le rendre modifiable
11.1 : INTRODUCTION :
Java utilise la notion de flux (canal)
Un flux de sortie est un canal quelconque capable de recevoir de l’information sous forme
d’une suite d’octets : périphérique d’affichage, fichier, connections à un site distant, un
emplacement en mémoire centrale.
Un flux texte transmet l’information avec modification appelée formatage pour que le flux
reçoive ou transmette une suite de caractères, par exemple la méthode println réalise un tel formatage.
11.2.1. : Généralités :
Un fichier texte peut être :
-créé ou lu avec un éditeur de texte ou un traitement de texte en mode texte.
-listé par une commande de l’environnement, type sous DOS, more ou pr sous UNIX.
Chaque caractère dans un fichier texte est codé sur un seul octet et suivant un code dépendant de
l’environnement.
Le caractère de fin de ligne est représenté par 2 caractères : CR(code héxadécimal 13) et LF (code héxadécimal
10) dans l’environnement PC, et un caractère LF (code héxadécimal 10) dans l’environnement UNIX.
95
11.2.2. : Ecriture d’un fichier texte :
La classe abstraite Writer est la classe de base à toutes les classes relatives à un flux texte de
sortie.
La classe FileWriter, dérivée de OutputStreamWriter qui dérive de Writer, est la classe pour la
création d’un flux texte de sortie associé à un fichier.
Un constructeur :
Ouverture d’un fichier texte en écriture avec formatage avec la classe PrintWriter qui possède des méthodes
println et print :
Un constructeur :
Avec [Link].* ;
[Link](“Equation=
+[Link](coeffX2)+ « x2 +»
+[Link](coeffX1)+ « x + » +[Link](coeffX0)) ;
catch (IoException e)
{
[Link](“Erreur:” +e);
}
[Link]();
}
}
Un constructeur :
FileReader ne peut accéder qu’à des caractères et nécessite la gestion de la fin de ligne. Il faut
l’associer à la classe BufferReader qui possède une méthode readLine.
Un constructeur :
La méthode readLine de la classe BufferedReader fournit une référence à une chaîne correspondant à
une ligne de fichier.
Fermeture d’un fichier texte en lecture :
Package coursjava ;
Import [Link].* ;
Try
{
fr= new BufferedReader( new FileReader(“[Link]”));
while((ligne=[Link]()) !=null)
{
[Link](ligne);
}
[Link]();
}
catch(IOException e)
{
[Link](“ERREUR:”+e);
}
}
}
Constructeur :
Public String Tokenizer(String str,String delim)
Méthodes:
(dans les boucles)
-countTokens : compte le nombre de tokens.
-nextToken : donne le token suivant s’il existe en retournant le type chaîne.
-nextElement : donne le token suivant s’il existe en retournant le type objet.
Package coursjava ;
Import [Link].* ;
Import [Link].* ;
Try
{
f= new BufferedReader (new FileReader(“[Link]”));
while((ligne=[Link]())!=null)
{
[Link](“Fichier:” +ligne);
StringTokenizer tok = new StringTokenizer(ligne, « »); NbTok =
[Link]();
Exécution:
99
Fichier: 1.1
Token:1.1
Fichier 2.22 3.333
Token:2.22 Token :3.333
Fichier 4.4444 5.55555 6.666666
Token:4.4444 Token :5.55555 Token :6.666666
Constructeur :
-Les listes chaînées : collection d’éléments de données qui sont chaînées, permettant
l’insertion et les suppressions en n’importe quelle position.
La classe LinkedList du package [Link] permet de manipuler les listes chaînées.
-les piles :
-les files : (queues, FIFO :First In First Out) : cas particulier des listes chaînées avec des
insertions à une extrémité appelée fin de la file et des suppressions à l’autre extrémité appelée tête de
la file.
//Classe autoréférentielle
101
class Nœud
{
private int donnee ;
private Nœud suivant ;
.
.
.
Cette classe définit un Nœud avec 2 variables d’instance private : l’entier donnée et une référence à
un Nœud nommé suivant .
Class Nœud
{
final int DIM=4 ;
Object sommet; //étiquette des noeuds
Object arc[ ] = new Object[DIM]; //tableau d’arc(il y en a 4 : A C G T)
Nœud succ[ ] = new Nœud [DIM] ; //tableau de successeurs
Public Nœud (Object o)
{ sommet=o ;
La liste chaînée est une collection linéaire d’objets d’une classe autoréférentielle appelés
nœuds et reliés par des liens.
L’accès à une liste chaînée s’effectue par une référence au 1er nœud de la liste. Chaque nœud
successif est accessible par le membre de référence de lien stocké dans le nœud précédent.
La référence de lien dans le dernier nœud est mise à null et marque la fin de la liste.
Un nœud contient des données de tout type, y compris des objets d’autres classes.
Programme qui présente des sous-chaînes d’une chaîne en éléments d’une liste chaînée.
Package coursjava ;
//- ------class
NoeudListe
{
Object element ;
NoeudListe suivant ;
103
this (élément, null) ;
}
public NoeudListe()
{
this(null,null) ; }
//Suppression de l’élément.
if(([Link](element))&&(courant !=premierNoeud))
{ [Link]=[Link];
}
else
{
//sup
press
ion
du
1er
elém
ent if
(cour
ant=
=pre
mier
Noe
ud)
{ premierNoeud=[Link];
}
else
{
[Link](element+ »n’existe pas dans la liste »+nomListe) ;
}
if (listeEstVide())
premierNoeud=dernierNoeud=new NoeudListe(element) ;
else
premierNoeud=new NoeudListe(element,premierNoeud) ;
}
105
//Méthode pour insérer en queue de liste : public void
insererEnQueue(Object element)
{
if (listeEstVide())
premierNoeud=dernierNoeud=new NoeudListe (element) ;
13.4. : PILE :
2 méthodes qui interviennent dans une pile :
-push( )
-pop( )
13.5. : FILE :
2 méthodes qui interviennent dans une pile :
-enQueue( ) : ajoute un nouveau nœud en fin de file -deQueue( ) :
supprime un nœud en tête de file.
13.6. :ARBRE BINAIRE :
Un arbre binaire est un arbre dont tous les nœuds comportent au plus deux liens. Le 1er nœud
de l’arbre est appelée racine.
Remarque : L’arbre de recherche binaire correspond à une série de données qui peut varier selon
l’ordre d’insertion des valeurs.
3 TYPES DE PARCOURS :
Parcours en ordre.
-parcourir le sous-arbre gauche avec un appel à parcours en ordre.
-traiter le nœud.
-parcourir le sous-arbre droit avec un appel à parcours en ordre.
Le parcours en ordre d’un arbre de recherche binaire affiche les valeurs des nœuds dans l’ordre
croissant : tri par arbre binaire.
Parcours en pré-ordre.
-traiter le nœud.
-parcourir le sous-arbre gauche avec un appel à parcours en pré-ordre.
-parcourir le sous-arbre droit avec un appel à parcours en pré-ordre.
Parcours en post-ordre.
-parcourir le sous-arbre gauche avec un appel à parcours en post-ordre.
-parcourir le sous-arbre droit avec un appel à parcours en post-ordre.
-traiter le nœud.
Class NoeudArbre
{
int element ;
NoeudArbre gauche ; NœudArbre
droit ;
else
{ [Link](element) ;
}
}
else
{ if (element>[Link])
{ if(droit= =null)
{ droit= new NoeudArbre(element);
}
else
107
{ [Link](element) ;
}
}
}
class Arbre {
private NoeudArbre racine;
public Arbre()
{racine=null;
}
public void insererNoeud(int element)
{ if (racine= = null)
{
racine= new NoeudArbre(element);
}
else
{
[Link](element);
}
}
enOrdre([Link]);
[Link] ;println(nœ[Link]+ » « ) ; EnOrdre(nœ[Link]) :
}
Il existe encore d’autres méthodes mais elles fonctionnent selon le même principe.
13.7. : CLASSE VECTOR :
La classe Vector de [Link] dérive de l’Interface List.
Elle permet de créer des objets du type tableau qui croissent et décroissent dynamiquement en
fonction des besoins, contrairement aux tableaux statiques dont la taille est fixée à la compilation.
Les éléments dans Vector sont des objets. Ainsi, avec des types primitifs, il faut utiliser les
classes enveloppes.
Constructeurs :
-Vector( )
-…
Méthodes :
-void add(int index, Object elem) -…..
Programme avec la classe Vector:
[Link].* ;
[Link]( ) ;
[Link](“firstElement( ):”+[Link]( ));
[Link](“lastElement( ):”+[Link]( )); [Link](o);
[Link]( );
[Link](new Integer(5));
EXECUTION:
Suite d’entiers dans le vecteur: 0 1 2 3 4 5 6 7 8 9
FirstElement( ) : 0
LastElement( ) :9
109
….
Constructeurs : -Stack(
)
-….
Méthodes :
-boolean empty( )
-Object peek( )
[Link].*
ElementEnleve=[Link]( );
.
.
.
.
[Link].*
111
[Link](Position : »+rechercheInt) ;
EXECUTION :
Suite d’entiers dans le tableau : 0 0 0 0 0 0 0 0
…… :87 58 29 11 0 …..
Méthodes :
-int binarySearch(List liste, Object key)
-void copy (List dest, ______)
……
Constructeurs :
-ArrayList( ) ;
-……..
Programme utilisant la classe ArrayList :
[Link].* ;
Class EnsembleConstruction
{
public ArrayList ens ;
[Link](element) ;
[Link](…) ;
}
2 implémentations :
-HashSet : stocke ses éléments dans une table -treeSet
113
CHAPITRE: PROGRAMMATION DES INTERFACES
GRAPHIQUES
Vous avez étudié jusqu’à présent l’écriture de programmes qui n’acceptaient que des caractères tapés
au clavier, les traitaient et affichaient le résultat dans une console. Ce chapitre vous ouvrira la voie
qui permet d’écrire des programmes utilisant une interface utilisateur graphique (GUI, Graphic User
Interface). Vous apprendrez en particulier à écrire des programmes qui permettent de spécifier la taille
et la position des fenêtres, d’y afficher du texte avec diverses polices de caractères, de dessiner des
images, et ainsi de suite.
Les deux chapitres suivants vous montreront comment gérer des événements — tels que les frappes
au clavier et les clics de la souris — et comment ajouter des éléments d’interfaces : menus, boutons,
etc. Après avoir lu ces trois chapitres, vous saurez écrire des programmes graphiques autonomes.
Nous allons présente dans cette section du chapitre le principe de l’interface graphique et quelques
méthodes utilisées , Il y a deux groupes principaux de classes (librairies) utilisées pour créer des
fenêtres en Java : AWT et Swing.
[Link] DES INTERFACES GRAPHIQUES
Les classe prédéfinies présentées au chapitres quatre doivent nous aider pour la création des interfaces
graphiques utilisateurs (Graphical User Interface-GUI) se regroupent dans le package AWT
l’importation préalable qui s’impose :
Lorsque Java fut créé, seule la librairie AWT était disponible pour travailler avec du graphique. Cette
librairie est un simple ensemble de classes telles que JButton (bouton), TextField (champ textuel),
Label (libellé) et autres. Peu après, une autre librairie, plus évoluée, apparut : Swing. Elle inclut aussi
les boutons, les champs textuels et d'autres contrôles. Le nom des composants Swing commence par
la lettre J, par exemple JButton, JTextField, JLabel, etc. Tout est un peu mieux, plus rapide et plus
simple d'utilisation avec Swing, mais dans certains cas, nos programmes sont exécutés sur des
ordinateurs avec d'anciennes versions de Java qui peuvent ne pas supporter les classes Swing.
Création d’un cadre
En Java, une fenêtre de haut niveau — c’est-à-dire une fenêtre qui n’est pas contenue dans une autre
fenêtre est appelée frame (cadre ou fenêtre d’encadrement). Pour représenter ce niveau supérieur, la
bibliothèque AWT possède une classe nommée Frame. La version Swing de cette classe est baptisée
JFrame, qui étend la classe Frame et désigne l’un des rares composants Swing qui ne soient pas
dessinés sur un canevas (grille). Les éléments de décoration (boutons, barre de titre, icônes, etc.) ne
sont pas dessinés par Swing, mais par le système de fenêtrage de l’utilisateur. Nous allons maintenant
étudier les méthodes employées le plus fréquemment lorsque nous travaillons avec un composant
JFrame. Le Listing 7.1 présente un programme simple qui affiche une fenêtre vide sur l’écran, comme
le montre le code source java.
import [Link].*;
/**
* @version 1.32 2007-06-12
* @author Cay Horstmann
*/
public class SimpleFrameTest
{
public static void main(String[ ] args)
{
SimpleFrame frame = new SimpleFrame();
[Link](JFrame.EXIT_ON_CLOSE);
[Link](true);
}
}
class SimpleFrame extends JFrame
{
public SimpleFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
Examinons ce programme ligne par ligne. Les classes Swing se trouvent dans le package [Link].
Le terme javax désigne un package d’extension (pour le distinguer d’un package standard). Pour des
raisons historiques, les classes Swing constituent une extension mais elles font partie de chaque
implémentation de Java SE depuis la version 1.2.
Le bouton
Le bouton est un composant sur lequel l’utilisateur peut cliquer, pour envoyer une commande à
l’application. Il est modélisé par la classe JButton.
L’étiquette(Label)
L’étiquette est une zone permettant d’afficher du texte (non modifiable) ou une icône sur la fenêtre.
L’icône doit être au format GIF et peut être une animation dans ce format. Elle est modélisée par la
classe JLabel.
La méthode setText (‘’Un texte’’) ; permet de modifier le texte affiché par le label.
L’é[Link](‘’ cliquer sur la croix pour quitter le programme’’) ;
La zone de texte
115
La zone de texte permet à l’utilisateur de saisir dedans du texte (utilise dans les formulaires).Elle est
modélisée par la classe JTextField. La méthode getText(), de la classe JtextField permet de récupérer
le texte saisi dans la zone.
String texteSaisie ;
TexteSaisie =[Link] () ;
La Liste déroulante
Cette liste permet à l’utilisateur de sélectionner une option sur une liste de choix déroulante. Elle est
modélisée par la classe JcomboBox.
Exemple :
Création d’une liste déroulante pour le choix de l’état civil.
Jcombobox etatCivil = new jCombobox() ;
[Link](‘’ Célibataire’’) ;
[Link](‘’ Marie’’) ;
[Link](‘’ Divorcé’’) ;
[Link](‘’ Veuf’’) ;
[Link]().add(etatcivil) ;
Les cases à cocher
Les constructeurs sont les suivants :
constructeur Rôle
JcheckBox(String) Précisé l’intitulé
JcheckBox(String) Précisé l’intitulé et l’état
jchekBox(Icon) Précise une Icone comme l’intitulé et l’état
JchekBox(Icon,boolean) Précisé une Icone comme intitulé et l’état
JcheckBox(String,Icon) Précisé un texte et une Icone comme Intitulé
JChecBox(String, Icon,boolean) Précisé un texte et une Icone comme intitulé
et l’état
Un groupe de cases à cocher peut être défini avec la classe ButtonGroup. Dans ce cas, un
seul composant du groupe peut être sélectionné. Pour l’utiliser, il faut créer un objet de la
classe ButtonGroup et utiliser la méthode add() pour ajouter un composant au groupe.
Java est fourni avec de nombreuses classes utiles organisées en paquetages (packages). Par exemple,
la classe String fait partie du paquetage [Link] et le nom complet de la classe String est
[Link]. Le compilateur Java sait où trouver les classes de [Link], mais il y a beaucoup
d'autres paquetages contenant des classes utiles et c'est à toi de dire au compilateur où se trouvent les
classes de ton programme.
Par exemple, la plupart des classes Swing se trouvent dans l'un de ces deux paquetages :
[Link]
[Link]
Ce serait ennuyeux de devoir écrire le nom complet d'une classe à chaque fois qu'on l'utilise. Pour
éviter cela, on peut effectuer une bonnefois des déclarations import (importer) avant la ligne de
déclaration de la classe. Par exemple :
[Link];
[Link];
ClassCalculatrice {
JButton monBouton = new JButton ();
JFrame monCadre = new JFrame ();}
Ces déclarations import permettent d'utiliser ensuite les noms courts des classes, comme JFrame ou
JButton. Le compilateur Java saura où chercher ces classes.
5.2.1. LE MODÈLE ÉVÉNEMENTIELLE DE JAVA
En java, le traitement et le transfert et le transport des messages associés aux évènements sont assurés
par deux objets dans le cadre d’un modèle de communication dénommé le modèle de traitement des
événements par délégation( Délégation Event Model ) . Le message est envoyé par une source ou
déclencheur de l’événement qui sera un composant java (un bouton par exemple), à un récepteur ou
écouteur de l’évènement qui est chargé de gérer l’événement, ce sera un objet de la classe des
écouteurs instancié et ajouté au composant :
Instanciation d’un
objet d’événement
Envoi de
l’objet
Objet d’événement
Ecouteur
Quitter D’é de click
Click souris À l’objet de souris
Click de souris écouteur
Objet source de la
Classe des Bouton
Délégation de la gestion de
cet événement à l’écouteur
La méthode de programmation de l’interception des événements est nettement plus lourde
syntaxiquement en java qu’en Delphi et en Visual Basic, mais elle est permet beaucoup plus de choix
et elle est entièrement objet.
Les écouteurs, chargés de recevoir les événements que produisent de composants, sont des classes
abstraites dont le nom généralement se termine par listener. Toutes ces classes d’écouter d’événements
sont situées dans le package [Link], elles se chargent de fournir les méthodes adéquates aux
traitements envoyés par un déclencheur. Donc pour résumer, les éléments entrant en jeux dans le
modèle événementiel dans java sont
_Le composant (bouton par ex) : est capable de déclencher une action ou un événement (un click sur
le bouton par exemple) ;
_L’événement, qui est l’action déclenché sur un composant est envoyé sous forme d’un message à un
écouteur (un Listener). Ce message est un objet, dont les propriétés contiennent des détails sur
l’événement déclenchée (par exemple pour un clic : la position du curseur, le bouton appuyé peut être
gauche ou droit).
117
_Le Listener : est l’objet chargé de recevoir l’événement (dont le message transmis par le composant).
C’est le listener qui contiendra le code à exécuter dès l’événement est déclenché. C’est pour cela que
les classes des listener sont abstraite, cela permet à l’utilisateur de les spécialiser.
Dans l’exemple précédent, il n’y a pas d’interaction avec l’utilisateur. Les dessins s’affichent, et c’est
tout. La seule interaction concerne la fenêtre qui se ferme en cliquant sur l’icône de fermeture ;
présente une interface graphique comportant une série de boutons qui permettent de sélectionner un
phonème (un son) et d’écrire dans la zone de texte située en dessous. Un bouton permet d’effacer la
zone de texte. Pour qu’un bouton ait une action, il faut le demander en indiquant qu’on se met à
l’écoute du bouton (un Listener en anglais) et en précisant l’objet (et donc les méthodes) qu’il faut
exécuter quand ce bouton est sollicité. Pour un bouton (classe Button, voir l’action doit être prise en
compte lorsque qu’on appuie sur le bouton.
Exemple :
On crée le bouton bEffacer et on se met à l’écoute d’une action sur ce bouton ; siune action est réalisée
sur le bouton, on exécute actionPerformed() de la classeActionEffacer. Dans l’exemple suivant, b est
un tableau de Button. On crée un objet ecoutePhonemede type ActionListener. Ce même objet
ecoutePhoneme est mis à l’écoute de tous lesboutons du tableau b. Si on clique sur un des boutons du
tableau b, la méthodeactionPerformed() de l’objet ecoutePhoneme de la classe CaracterePhoneme
estexécutée.
ActionListener ecoutePhoneme = new CaracterePhoneme();
for(int i=0; i < nbPhon; i++){
b[ I ].addActionListener (ecoutePhoneme); voir Button
}
La méthode actionPerformed(ActionEvent evt) a un paramètre de type ActionEvent qui indique les
caractéristiques de l’événement evt ayant eu lieu concernant ce bouton. [Link]()
fournit le nom (l’étiquette par défaut) du bouton concerné par cet événement (utilisée dans la classe
CaracterePhoneme).
Exemple pour le bouton Effacer : si on clique sur le bouton Effacer, la méthode actionPerformed() de
la classe ActionEffacer est exécutée. Ci-dessous, cette méthode met la chaîne vide dans la zone de
texte (de type TextArea,). Un objet de la classe interne ActionEffacer peut accéder aux attributs
(zoneTexte cidessous) et méthodes de l’objet associé qui a classes internes.
// classe interne
class ActionEffacer implements ActionListener{
public void actionPerformed(ActionEvent evt){
[Link] (""); // voir TextComponent, TextArea}
}
Exemple pour les boutons du tableau de boutons : si on clique sur un des boutons du tableau des
phonèmes, la méthode actionPerformed() de la classe Caractere-Phoneme est exécutée.
[Link]() fournit l’étiquette du bouton. Cette chaîne est ajoutée en fin du texte de la
zone de texte.
// classe interne
class CaracterePhoneme implements ActionListener{
public void actionPerformed (ActionEvent evt){
String etiquette = [Link]();
[Link] (etiquette); voir TextArea}
}
1. Logiciels nécessaires :
Java SE 6 (de préférence) ou Java 5 SENetBeans 6.1 ; 6.5 ; 6.8 ; 7.1 ;7.3 ,8.2etc…
3. Les étapes de création de l'application :
[Link]éation d'un projet dans NetBeans
[Link] des composants graphiques nécessaires sur une fenêtre (Form)
[Link] quelques lignes de code pour le fonctionnement
[Link] l'application
[Link]éparer l'application pour une diffusion
4. Création d'un projet NetBeans :
Pour NetBeans une application doit être construite dans un projet. Plusieurs modèles de projet sont
disponibles permettant de construire une partie importante de la structure d'une application dans un
domaine précis.
File -> New Project (ou un clic sur l'icône New Project)
119
1. Java Desktop Application :
Sélectionner Java -> Java Desktop Application -> un clic sur Next, Java Desktop Application utilise
Swing Application Framework. L'application produite avec Java Desktop Application a une structure
complète. Elle comporte une barre de menus, une barre de progression, une fenêtre de présentation
dans About etc.
2. Choisir un nom et une location pour le projet
[Link] un nom pour le projet dans "Project Name" ici ; exemple " ESMICOM "
[Link] propose par défaut : dossier_de_l'utilisateur/NetBeansProjects comme une place pour ses
projets. Il est possible de modifier ce choix.
[Link] un dossier pour le projet dans "Project Folder". Normalement le dossier aura par défaut le
nom du projet
[Link] la case "Set as Main Project" cochée
[Link] sélectionnée "Basic Application"Un clic sur Finish
121
[Link] est dans la fenêtre Project
[Link] fenêtre "Inspector" montre les composants de l'application (Graphiques et non graphiques)
[Link] espace pour le travail graphique (FrameView)
[Link] bouton "Source" permet de voir le fichier source produit par NetBeans et d'y ajouter des lignes
de code
[Link] bouton "Design" permet de revenir sur l'espace graphique à partir du fichier source
[Link] palette des composants graphiques
7.L'ensemble est dans une fenêtre (Form)
C'est la fenêtre principale de l'application et c'est aussi la place pour ajouter des composants ses
dimensions sont modifiables et s'adaptent automatiquement selon ses composants. Avant d'ajouter
notre premier composant, un petit mot concernant le positionnement automatique(Snapping).Des
règles magnétiques de positionnement sont affichées pour aider au positionnement des composants.
NetBeans affiche des coordonnées horizontales et verticales avec des suggestions pour placer un
composants par rapport aux autres composants (déjà placés) et aux marges de la page .
5. JLabel est ajouté :
Quand on clique sur l'espace de travail JLabel est placé à l'endroit désiré. Il est possible maintenant
de modifier ses dimensions,son titre, couleur etc. La fenêtre de (Properties) est maintenant affichée
permettant de personnaliser des composants et des conteneurs.
Dans la fenêtre source ; les parties de code en grisées ne sont pas modifiable et générées
automatiquement.
123
11. Ajouter un bouton
Un clic dans la palette sur "Button" et un clic par la suite sur l'espace de travail ; les règles sont
affichées pour le positionnement automatique par rapport aux marges, à jLabel1 pour aligner la base
de textes dans les deux composants etc.
Un clic sur -> le menu Build > Build Main Project (ou F11)
13. Une compilation réussite :
Un message indiquant la fin réussite de la compilation est affiché et une indication pour exécuter
l'application en dehors de l'IDE.
5.3.3. CONSTRUCTION DE L’INTERFACE GRAPHIQUE
Comme exemple, nous nous proposons de réaliser un formulaire de saisie d’informations personnelle
sur les clients :
125
[Link]([Link]);
Thread td=new Thread(this);
[Link]();
}
@Override
public void run() {
for (int i =0;i<=101;i++){
try{
[Link](20);
}
catch(Exception e){
[Link]();
}
if(i==100){
[Link]("vous serez rediger dans quelque seconde");
}
[Link](i);
}
interface2 logInterface2 = new interface2();
[Link](true);
dispose();
}
INTERFACE 1
String password;
password=[Link]([Link]());
char [] pword={'1','2','3','4'};
String convertPword=[Link](pword);
127
[Link](true);
}
else{
if(){
[Link]("mot de passe est incorrect,reintroduissez");
[Link](null);
[Link](null);
}
else if (![Link]().equals("ista")){
[Link]("nom d'utilisateur est incorrect,reintroduissez");
[Link](null);
[Link](null);
}
else{
[Link](" le mon d'utilisateur et le nom d'utilidateur sont
incorrect,reintroduissez");
[Link](null);
[Link](null);
}
}
INTERFACE2
String sexe;
private void jRadioButton1ActionPerformed([Link] evt) {
sexe="Masculin";
// TODO add your handling code here:
}
private void jRadioButton2MouseClicked([Link] evt) {
sexe="Feminin";
// TODO add your handling code here:
}
private void jTextField1KeyPressed([Link] evt) {
String nom=[Link]();
[Link]("Votre nom : "+nom);
// TODO add your handling code here:
}
129
private void jTextField2KeyPressed([Link] evt) {
String pnom=[Link]();
[Link]("Votre postnom : "+pnom);
// TODO add your handling code here:
}
private void jTextField2KeyReleased([Link] evt) {
String pnom=[Link]();
[Link]("Votre postnom : "+pnom);
// TODO add your handling code here:
}
private void jTextField3KeyTyped([Link] evt) {
String prnom=[Link]();
[Link]("Votre Prenom :"+prnom);
// TODO add your handling code here:
}
131
String a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab;
a=[Link]();
b=[Link]();
c=[Link]();
d=[Link]();
e=[Link]();
f=[Link]();
g=[Link]();
h=[Link]();
i=[Link]();
j=[Link]();
k=[Link]();
l=[Link]();
m=[Link]();
n=[Link]();
o=[Link]();
p=[Link]();
q=[Link]();
r=[Link]();
s=[Link]();
t=[Link]();
u=[Link]();
v=[Link]();
w=[Link]();
x=[Link]();
y=[Link]();
z=[Link]();
aa=[Link]();
ab=[Link]();
[Link]("NOM:"+a+ "\n POST-NOM:"+b+ "\n
PRENOM:"+c+ "\n Sexe:"+d+ "\n Lieu de Naissance:"+e+ "\n Date de
Naissance:"+f+"\n Adresse:"+g+"\n Quartier:"+h+"\n Commune:"+i+"\n
Ville:"+j+"\n Pays:"+k+"\n Téléphone:"+l+"\n Epérience 1:"+m+"\n
Epérience 2:"+n+"\n Epérience 3:"+o+"\n Etude
1/Primaire/Année:"+p+"\n Etude 2/Humanité/Année:"+q+"\n Etude
3/Université/Année:"+r+"\n Age:"+s+"\n Etat-Civil:"+t+"\n Sports
Pratiqués"+u+"\n Loisirs:"+v+"\n Langue 1:"+w+"\n Orale:"+x+"\n
Ecrite:"+y+"\n Langue 2:"+z+"\n Orale:"+aa+"\n Ecrite:"+ab);
}
private void jButton2MouseClicked([Link]
evt) {
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
133
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
[Link](null);
}
private void jButton3MouseClicked([Link]
evt) {
messageCV appelfenetre=new messageCV();
[Link](true);
private void jButton1MouseClicked([Link] evt) {
CVGraphique appelfenetre=new CVGraphique();
[Link](true);
}
private void jButton2MouseClicked([Link] evt) {
[Link](0);
}
4. L’ACCÈS AUX BASES DE DONNÉES
4.1. Présentation de l’API JDBC
JDBC est l’acronyme de java Database connectivity et désigne une API définie par
ORACLE pour permettre un accès aux base de données avec java.
4.1.1. Les outils nécessaires pour l’utiliser JDBC
Les classes de JDBC version 1.0 sont regroupées dans le package [Link] et sont
incluses dans le JDK à partir de sa version 1.1. La version 2.0 de cette API est incluse
dans la version 1.2 du JDK. Pour pouvoir utiliser JDBC, il faut un pilote qui est
spécifique à la base de données à laquelle on veut accéder.
Avec JDK, Sun fournit un pilote qui permet l’accès aux bases de données via ODBC.
Ce pilote permet de réaliser l’indépendance de JDBC vis –à-vis des bases de données.
4.1.2. Les types de pilotes JDBC :
Il existe quatre types de pilote JDBC :
Type1 : JDBC-ODBC bridge, le pont JDBC-ODBC qui s’utilise avec ODBC et un
pilote ODBC spécifique pour la base à accéder. Cette solution idéale pour des
développements avec exécution sous windows d’une application locale. Cette
solution<<simple>> pour le développement possède plusieurs inconvénients : La
multiplication du nombre de couche rend complexe l’architecture (bien que transparent
pour le développeur) et détériore un peu les performances lors du déploiement, ODBC
et son pilote) rend l’application moins portable et dépendante d’une plateforme.
Type2 : Un driver écrit en java qui appelle l’API native de la base de données. Ce
type de driver convertit les ordres JDBC pour appeler directement les API de la base
135
de données via un pilote natif sur le client. Ce type de driver nécessite aussi
l’utilisation de code natif sur le client.
Type3 : Un driver écrit en java utilisant le protocole natif de la base de données. Ce
type de driver utilise un protocole réseau propriétaire spécifique à une base de
données. Un serveur dédie reçoit les messages par ce protocole et dialogue
directement avec la base de données. Ce type de driver peut être facilement utilisé
par une applet mais dans ce cas le serveur intermédiaire doit obligatoirement être
facilement utilisé par une applet mais dans ce cas le serveur intermédiaire doit
obligatoirement être installé sur la machine contenant le serveur web.
Type 4 : Un driver java natif. Ce type de driver, écrit en java, appelle directement le
SGBD par le réseau. Ils sont fournis par l’éditeur de la base de données.
Les drivers se présentent souvent sous forme de fichiers jar dont le chemin doit être
ajouté au classpath pour permettre au programme de l’utilisateur.
données
Classe Rôle
137
DatabaseMetaData Informations à propos de la base de données :
nom des tables, index, version…
flottant.
getDate(int)
141
BIBLIOGRAPHIE
CONCLUSION GÉNÉRALE
Au cours de notre cours de langage de programmation Java ; celle –ci est un langage complet
permettant de développer des applications exécutées localement et pouvant accéder aux ressources de
l’ordinateur et à des sites distants. Java permet également l’insertion dans des pages web de
programmes téléchargés qui sont exécutés localement mais qui, pour des raisons de sécurité, sont
limités dans leur accès aux ressources de l’ordinateur local. Les bibliothèques de classes permettent
de développer des applications variées ayant des interfaces graphiques conviviales. Les notions
fondamentales d’héritage ; l’encapsulation et le polymorphisme permettent de développer des classes
très générales qui sont des d’outils pouvant être réutilisés dans d’autres applications et sur d’autres
ordinateurs indépendamment du système d’exploitation.
L’interface graphique Java sous l’environnement de développement intégré (IDE) Netbeans, montre
bien la richesse et la souplesse de mise en œuvre des composants graphiques. La programmation objet
est très utile et permet de mettre en commun les caractéristiques des composants telque ( la classe
Component ) et d’obtenir par L’ héritage des composants le plus spécifiques.