Organisation du Module POO en Java
Organisation du Module POO en Java
Module
Cours 0 de
PrograMMation orientée objet
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Chaque élément de module se déroulera en 7 semaines.
S? S1
S7 S2
E1
S6 S3
S5 S4
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Présentation du module :
Module
P.O.O
E1 : JAVA E2 : C++
50% 50%
Prendre des notes Pratiquer régulièrement Passer le QCM de Faire les exercices demandés
chaque cours. ( TP, TD ou devoir )
généralités
S? S1 Généralités
&
Le paradigme objet
P.O.O
Application S7 S2 &
compléte
Héritage
JAVA
Les bases de
Polymorphisme
données S6 S3 &
Collections
Programmation Interfaces
graphique S5 &
S4 Exceptions
INTRODUCTION
4
Modes de
programmation
Procédurale O.O
main () {
// Déclarations !!
double Largeur = 7.0;
double Hauteur = 2.0 ;
// Affichage !!
print (" Surface du rectangle : "+
Surface (largeur, hauteur) );
INTRODUCTION
5
Modes de
programmation
Procédurale O.O
Traitement Données
Influencent
INTRODUCTION
6
Modes de
programmation
Procédurale O.O
INTRODUCTION
7
Encapsulation
Abstraction
Héritage
Polymorphisme
Générésités
…….
HISTORIQUE DE JAVA
9
HISTORIQUE DE JAVA
10
C : 1975-2000
JAVA : 2001-2018
Python : 2019-2021
HISTORIQUE DE JAVA
11
Lancement
Langage portable =
1995
HISTORIQUE DE JAVA
12
OAK
HISTORIQUE DE JAVA
13
HISTORIQUE DE JAVA
14
2010
HISTORIQUE DE JAVA
15
L’histoire de JAVA a commencée depuis 1991 et lancé 1995 par SUN Microsystems sous un projet nommé
(‘‘Green Project’’).
Un langage accompagné d’un ensemble énorme de bibliothèques standard couvrant de très nombreux
domaines.
PRÉSENTATION DE JAVA
16
Pas de pointeur
Simple Pas d’héritage multiple
permettre d'accéder aux fichiers
à partir de n'importe quelle
machine sur Internet.
Distribué Robuste
Dynamique Sur
Multi-thread Portable
décomposée en unités d’exécution
fonctionnant simultanément s'exécuter dans différentes plateformes.
PRÉSENTATION DE JAVA
17
Il est basé sur une architecture logicielle nécessitant une machine virtuelle java (JVM).
JAVAC JVM
[Link] (Compilateur) [Link] (machine virtuelle)
(Code source) (bytecode)
-
------ < =>,)‘& 1001000101
%$#!^]\[
------ < =>,)‘&
%$#!^]\[
------ < =>,)‘&
PLATE-FORMES JAVA
18
Java ME : “Micro Edition”. Edition qui sert à écrire des applications embarquées
Java EE : “Enterprise Edition”. Rajoute certaines API et fonctionnalités pour les entreprises.
Java Fx: Créer des applications Internet riches à l'aide d'une API d'interface utilisateur légère. C'est
un ajout récent à la famille des plates-formes Java.
?
?
PLATEFORME JAVA
20
JRE
JVM
+ JDT
+
API
JDK
JVM signifie Java Virtual Machine permet de traduire Byte Code en code de la machine hôte (host machine).
JRE signifie Java Runtime Environment, il comprend JVM et un certain nombre de bibliothèques Java qui
aident à exécuter des programmes écrits en langage Java.
API : est l'abréviation Application Programming Interface c'est une large collection de software composants
groupés en bibliothèques appelés packages.
JDK est l'abréviation de Java Development Kit, il se compose de 2 composants JRE et JDT.
JDT est l'abréviation de Java Development Tools fournissent des outils pour le développement
d'applications Java, tels que Javac aide à compiler le code source des programmeurs en Byte Code.
SAID EL ABDELLAOUI Programmation Orientée Objet : Java EST-Safi
INTRODUCTION GÉNÉRALITÉS 1ERE APPLICATION 2EME APPLICATION QCM
PLATE-FORMES JAVA
21
Installation :
Le JDK peut être téléchargé gratuitement à partir du site de Oracle ([Link])
Exécuter [Link]. Le JDK sera installé dans le répertoire c:program files\java et
installe également jre1.8 dans le même dossier.
Les programmes nécessaire au développement java sont placés dans le répertoire c:\jdk1.5\bin a savoir:
[Link] Compilateur java.
L’aspect le plus utile de la classe System est les variables qu’elle déclare, qui permettent d’avoir une
interaction avec le système. On y trouve les variables in, out et err.
La variable in représente le flux d’entrée standard du système, alors que la variable out représente le flux
de sortie standard. La variable err est le flux d’erreur standard. ( les flux vont être détailler prochainement )
[Link]("Chaine de caractère") ;
[Link]("Erreur à l’ouverture") ;
[Link]
public static void main ( String [ ] args ) {
[Link] ("Bonjour tout le monde !! ");
}
}
La classe contenant la méthode statique main doit obligatoirement être public pour que la machine
virtuelle y ait accès.
Le profil de cette méthode est public static void main ( String [ ] args )
public : pour qu’elle puisse être exécutée par la machine virtuelle java (JVM).
static : pour que l’exécution puisse avoir lieu avant même la création d’une instance de la classe.
args : tableau d’objets String (chaînes de caractères) contenant les arguments de la ligne de
commande
Classe 2
Classe 1 Classe 1
Attributs
Attributs
Méthodes
Méthodes Interfaces
PACKAGES
26
Un Package est une collection nommé de classes, d’interfaces et de sous-packages. Il permet de les
regrouper sémantiquement.
Exemples :
AWT : Abstract Windows Toolkit
Réseau : Sockets (serveurs, clients), Web …
Entrées/Sorties : [Link]
SQL
Swing, SWT, … java
Exemple
[Link] ; [Link] ;
[Link] ; [Link];
java
L’aspect le plus utile de la classe System est les variables qu’elle déclare, qui permettent d’avoir une
interaction avec le système. On y trouve les variables in, out et err.
La variable in représente le flux d’entrée standard du système, alors que la variable out représente le flux de
sortie standard. La variable err est le flux d’erreur standard. ( les flux vont être détailler prochainement )
[Link]("Chaine de caractère") ;
[Link]("Erreur à l’ouverture") ;
paradigme objet
Description
Class Objet
Instance
❑ Classe est un type abstrait caractérisé par des propriétés (Attributs et méthodes).
Syntaxe :
class nom_de_la_class {
// Corps de la classe }
Exemple
class Rectangle {
// Attributs !!
double largeur = 11.0;
double hauteur = 7.0;
// Méthode !!
double surface () {
return (largeur × hauteur) }
}
Description
Class Objet
Instance
Syntaxe :
Exemple :
R1
Class Rectangle
C1
H =3.0
L=2.7 R2
Class Cercle Rayon =0
….1 H =6.9
… L=7.3
…..
Types de données
en java
Types Objets
primitifs (instances de classe)
❑ Java manipule différemment les valeurs des types primitifs et les objets : les variables contiennent des
valeurs de types primitifs ou des références aux objets
❑ Exemple :
◼ Attributs : vitesse
+ Hauteur : float
Attributs
+ Langeur : float
Attributs : vitesse
Velo
+vitesse : int
[Link] [Link]
class Velo { public class DemoVelo {
// Attributs public static void main (String [ ] args) {
int vitesse = 0; // Génère 2 objets différents du type Velo
// Méthodes Velo V1 = new Velo();
void Accelerer(int increment) { Velo V2 = new Velo();
vitesse = vitesse + increment; } // Invoque les méthodes
[Link](10);
void Freiner(int decrement) { [Link]();
vitesse = vitesse – decrement; } [Link](20);
[Link](); }
Void ImprimeEtat() { }
[Link](" Vitesse = " + vitesse);
} Affichage :
} ◼ vitesse: 10 V1
◼ vitesse: 20
vitesse
V2
Chaque objet (V1 et V2) instance de la classe Velo = 010
possédera sa propre vitesse
vitesse
= 020
CONSTRUCTEURS
INTRODUCTION GÉNÉRALITÉS SYNTAXE DE BASE LE PARADIGME OBJET QCM EXERCICES
CONSTRUCTEUR DE CLASSE
13
DESTRUCTEUR DE CLASSE
15
❑ Quand un objet n’est plus utilisé (aucune variable du programme ne contient une référence sur
cet objet), il est automatiquement détruit et la mémoire est récupérée (garbage collector)
❑ Un destructeur peut être utilisé pour libérer les ressources spécifiques (déconnexion d’une base
de données, fermeture d’un fichier, ...).
❑ Exemple
class Rectangle {
// Attributs !!
double largeur = 11.0;
double hauteur = 7.0;
// Constructeur!!
public Rectangle (double l, double h) {
Largeur = l
hauteur = h }
// Deconstructeur !!
public void finalize() {
[Link](”finalisation de ” + this); }
}
EXEMPLE
16
ATTRIBUTS
17
ATTRIBUTS
18
Classe Voiture
Classe Voiture Attributs
Type : String
Modèle : int
Matricule : String
Couleur : String
Vitesse Max : Float
Méthodes
Demarrer()
Accelerer()
Changer_couleur()
Recuperer_modele()
IMPLÉMENTATION DE CLASSE
20
INSTANCE DE LA CLASSE
21
Classe Voiture
Attributs
Type : String
Modèle : int
Matricule : String
Couleur : String
Vitesse Max : Float
Méthodes
Demarrer()
Accelerer()
Changer_couleur()
Recuperer_modele()
CONSTRUCTEUR DE LA CLASSE
22
class voiture{
/* Attributs*/
String Type; int Modele; String Matricule;
String Couleur; float Vitesse_max;
/* Constructeurs*/
[Link]
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr;
Couleur=Clr; Vitesse_max=Vmax;
}
voiture(String Tp, int Mdl, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Couleur=Clr; Vitesse_max=Vmax;
}
…
}
class Test{
Public static void main(String[] args){
[Link]
class Test{
Public static void main(String[] args){
[Link]
class Test{
public static void main (String [] args){
Voiture x = new Voiture ("Peugeot206", 2006, "22-1445", "Bleu" ,180);
[Link]
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr;
Couleur=Clr; Vitesse_max=Vmax;
}
voiture(String Tp, int Mdl, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Couleur=Clr; Vitesse_max=Vmax;
}
voiture(){ // ajouter un constructeur par défaut sans arguments }
}
class Test{
public static void main (String [] args){
Voiture x = new Voiture ("Peugeot206", 2006, "22-1445", "Bleu" ,180);
[Link]
Type :
Modèle :
Matricule:
Couleur :
Vitesse Max :
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr; Couleur=Clr; Vitesse_max=Vmax;
}
public static void main (String [] args){
/* Création d’une instance*/
voiture x = new voiture ("Peugeot206", 2006, "22-1445", "Bleu" ,180);
/* Affichage d’un attribut */
[Link]("Le type de x est"+ [Link]);
}
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr;
Couleur=Clr; Vitesse_max=Vmax; }
public static void main (String [] args){
/* Création d’une instance*/
voiture x = new voiture ("Peugeot206", 2006, "22-1445", "Bleu" ,180);
/* Affichage d’un attribut */
[Link]("Le type de x est"+ [Link]);
}
ACCESSEURS ET MODIFICATEURS
32
ACCESSEURS ET MODIFICATEURS
34
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr;
Couleur=Clr; Vitesse_max=Vmax;
}
ACCESSEURS ET MODIFICATEURS
35
voiture(String Tp, int Mdl, String Mtr, String Clr, float Vmax){
Type=Tp; Modele=Mdl; Matricule=Mtr;
Couleur=Clr; Vitesse_max=Vmax;
}
ACCESSEURS ET MODIFICATEURS
36
ACCESSEURS ET MODIFICATEURS
37
MÉTHODE TOSTRING()
39
La représentation d’un objet sous forme de chaîne de caractères se fait avec la méthode toString().
La méthode toString() est définie dans la classe Object ; en conséquence toutes les classes Java en hérite.
La méthode toString() définie dans la classe Object, admet pour prototype :
Si la méthode n’est pas redéfinie, elle renvoie le nom de la classe de l'objet concerné suivi de
l'adresse de cet objet.
Nom_Package.Nom_Class@15db9742
Sinon, elle invoque la méthode redéfinie
MÉTHODE TOSTRING()
40
class Person {
private String name; address;
private int age;
Person(String name, String address, int age){
[Link] = name; [Link] = address; [Link] = age; }
//la méthode d’ffichage de l’objet
public void Affiche(){
[Link] (name+" "+address+" "+age ) ; }
}
MÉTHODE TOSTRING()
41
class Person {
private String name; address;
private int age;
Person(String name, String address, int age){
[Link] = name; [Link] = address; [Link] = age; }
//surcharger la méthode toString()
public String toString(){
return name+" "+address+" "+age; }
}
MOT STATIQUE
42
MOT STATIQUE
43
Exemple :
[Link]
[Link](x)
[Link](90) ...
ATTRIBUTS DE CLASSE
44
Le modificateur static permet la création d’attributs de classe (aussi appelés attributs statiques et
variables de classe).
La valeur d’un attribut de classe est partagé par touts les objets de la classe.
Tout objet de la classe peut changer sa valeur.
Les attributs de classe peuvent être manipulés sans la création d’un objet !
• ++[Link];
Exemple : public class Demo_Velo {
ATTRIBUTS DE CLASSE
45
[Link] ++;
[Link]([Link]); }
}
Héritage
Introduction
2
Class Guerrier
Class Voleur
- String nom
- Int energie - String nom
- Int duree_vie - Int energie
- Arme arme - Int duree_vie
-Voler (Personnage)
En commun
Introduction
3
Class Personnage
- String nom
- Int energie
- Int duree_vie
+ Void rencontrer (personnage)
Class Sorcier
- Baton baton
Héritage
4
L’héritage permet de créer des classes plus spécialisées, appelées sous-classes, à partir de classes plus
générales déjà existantes, appelées super-classes.
Classe mère
Spécialisation Généralisation
Sous classe
Syntaxe :
Héritage
5
Lorsqu’une sous-classe C1 est créée à partir d’une super-classe C,
Le type est hérité : un C1 est (aussi) un C
C
C1 va hériter de l’ensemble :
des attributs de C
Exemple :
Class
Personnage
Class Guerrier
Guerrier va hériter de l’ensemble des attributs et des méthodes de Personnage (sauf cons).
class Personnage{
String nom
int energie, duree_vie;
public void rencontrer(Personnage p) {
[Link] ("Saluer !! "); } }
Héritage
7
La visibilité en héritage
Classe mère
A
Attributs Attributs
Sous classe
+ double x; B
+ int a;
- int y;
+ float b;
# string z;
Méthodes Méthodes
… +int f(){ … }
Attention !
l’héritage doit être utilisé pour décrire une relation « est-un » ("is-a")
Héritage
8
La visibilité en héritage
Attributs
Classe mère
public double x; A B obj = new B();
private int y;
protected string z;
obj
Méthodes Sous classe
… B
Héritage
9
La visibilité en héritage
Attributs
Classe mère B objB = new B();
public double x; A A objA = new A();
private int y;
protected string z;
A l’intérieur d’une classe, on peut accéder à tous les attributs et les méthodes directement par leur
nom (accès direct)
L’accès aux attributs et aux méthodes à l’extérieur des classes java dépond des modificateurs
d’accès. Ces modificateurs définissent divers degrés d’accès aux membres des classes.
Il existe 4 modificateurs d’accès :
public : visibilité totale à l’intérieur et à l’extérieur de la classe (mot-clé public)
privé : visibilité uniquement à l’intérieur de la classe (mot-clé private)
par défaut (aucun modificateur) : visibilité depuis toutes les classes du même paquetage.
Un troisième type d’accès régit l’accès aux attributs/méthodes au sein d’une hiérarchie de classes :
protégé : assure la visibilité des membres d’une classe dans les classes de sa descendance (et
dans les autres classes du même paquetage). Le mot clé est «protected».
Class Personnage
- String nom
- Int energie
- Int duree_vie
Class Sorcier
- Baton baton
Masquage : un identificateur qui en cache un autre -- > pour les variables (« shadowing »)
Redéfinition : une méthode déjà définie dans une super-classe a une nouvelle définition dans une sous-classe
-- > pour les méthodes (« shadowing ») en utilise le mot @override
Redéfinition : Une sous-classe peut redéfinir une méthode déjà définie dans la super-classe.
Class Personnage
class Personnage{
- String nom //...
- Int energie public void rencontrer ( Personnage perso ) {
- Int duree_vie [Link] (" Saluer !! "); }
+Void rencontrer (personne) }
class Demo_Personnages{
public static void main ( string [] args) {
[Link](G);
[Link](P);
}
Exemple :
Lorsque la super-classe admet un constructeur par défaut, l’invocation explicite de ce constructeur dans la
sous-classe n’est pas obligatoire
Le compilateur se charge de réaliser l’invocation du constructeur par défaut
[Link]
Classe mère
Généralisation
Spécialisation
A Constructeurs
public A(){ … }
public A(type1 arg1){…}
Sous classe public A(type1 arg1,type2 arg2){…}
…
B
[Link]
Classe mère
Généralisation
Spécialisation
A Constructeurs
public A(){ … }
public A(type1 arg1){…}
Sous classe public A(type1 arg1,type2 arg2){…}
…
B
public B(){
// super();
…
}
Si la classe mére n’admet pas de constructeur par défaut, l’invocation explicite d’un de ses constructeurs est
obligatoire dans les constructeurs de la sous-classe
La sous-classe doit admettre au moins un constructeur explicite.
class FigureGeometrique{
private Position position;
public FigureGeometrique (double x, double y)
{ position= new Position(x, y); }
}
class FigureGeometrique{
private Position position;
public FigureGeometrique ()
{ position= new Position(0.0, 0.0); }
// ...
}
A(……){
a1=… a1
a2=… a2 1
}
B(……){
a1 b1
super(……)
b1=… a2
2
}
C(……){
super(……) a1 b1 c1
c1=… 3
c2=… a2 c2
}
Conseils
20
Pour éviter qu’une classe soit héritable, ou méthode non-redéfinissable, on utilise ‘final’
Classe mère
final class A
Sous classe
class B
Une méthode finale ne peut être redéfinie dans les sous classes : Définir le comportement une fois pour toute de
tous les objets dérivant de la classe A.
Classe mère
final [type] fct(){ … }
Un attribut déclarée ‘final’ ne peut être modifié par les sous classes : on fixe une fois pour toute la valeur d’attribut.
Classe mère
final [type] attribut=val;
Sous classe
attribut = val;
Classe mère
Généralisation
Spécialisation
A
Sous classe
B
Parfois, il est utile de connaître la classe d’instance de chaque objet instancié : ‘instanceof’
True
Objet instanceof
false
NomClasse
Exemple : True
X = objB instanceof A
A objA = new A(); True
X = objB instanceof B
B objB = new B();
X= objA instanceof A True
boolean X;
X = objA instanceof B false
Classe mère
Généralisation
Spécialisation
A
Sous classe
B
class
A
class
B
SAID EL ABDELLAOUI Programmation Orientée Objet : Java EST - Safi
TD 2
Université Cadi Ayyad
Ecole Supérieure de Technologie – Safi
INTRODUCTION
3
Class Personnage
- String nom
- Int energie
- Int duree_vie
Class Sorcier
- Baton baton
INTRODUCTION
4
Class Personnage
class Rencontre { - String nom
public static void main(String [] args) { - Int energie
Personnage v =new Personnage(...); - Int duree_vie
Guerrier g =new Guerrier(...); Void rencontrer (personnage)
[Link](v);
}
} Class Guerrier
- Arme arme
2. Résolution dynamique des liens : Le type effectif (type de creation ) est déterminant (java)
unPersonnage contient la référence à un objet de type Guerrier
Choix de la méthode de la classe Guerrier (le personnage frappera le personnage)
SOLUTION
6
Class Personnage
class Rencontre { - String nom
public static void main(String [] args) { - Int energie
Personnage v =new Personnage(...); - Int duree_vie
Guerrier g =new Guerrier(...); Void rencontrer (personnage)
[Link](v);
}
} Class Guerrier
- Arme arme
Exécution : Frapper!
Autre exemple !!
7
Personnages :
Résumé
Le polymorphisme est peut être vu comme la capacité de choisir dynamiquement la méthode qui
correspond au type effectif (de création) de l’objet
Le polymorphisme ! Un même code s’exécute de façon différente selon la donnée à laquelle il
s’applique.
Introduction
10
Tableaux
Statique Dynamique
Une fois la taille est fixé au cours Sa taille peut croit ou décroît
d’initialisation on peut plus la pendant que le programme
modifier pendant le programme s’exécute.
s’exécute
INTRODUCTION
11
Tableaux Statiques
Dans un tableau statique , une fois la taille est fixé au cours d’initialisation on ne peut plus la
modifier pendant l’exécution du programme
Pour afficher les éléments d’un tableau, on fait appel à la boucle for :
COLLECTIONS
12
Tableaux Dynamique
Un tableau dynamique est une collection de données homogènes dont le nombre peut varier au cours du
déroulement du programme. On peut par exemple retirer ou ajouter des éléments au tableau.
Ensemble des classes gérant un stock d’objet Java :
COLLECTIONS
13
COLLECTIONS : ARRAYLIST
14
Importation :
Il faut importer au début du programme la bibliothèque adéquate par la ligne :
import [Link];
Déclaration :
Exemple :
ArrayList <String > Tableau;
Déclaration et initialisation :
On peut remplacer type par n’importe quel autre type évolué comme String, Integer, Double ...
Méthodes spécifiques :
Résumé des méthodes applicables sous la forme :
[Link](args);
COLLECTIONS : ARRAYLIST
15
[Link](args);
COLLECTIONS : ARRAYLIST
16
import [Link];
Exemples :
class ArrayListEemple1 {
public static void main (String[ ]args){
import [Link];
class ArrayListEemple2 {
public static void main (String[ ]args){
[un, deux] ArrayList<String> liste = new ArrayList<String>();
un deux deux [Link]( "un" ); [Link]( "deux" );
[ premier , deux]
[Link](liste); // [un, deux]
for ( String v :liste){ [Link] ( v+ " "); }
[Link] ([Link](1));
[Link](0, " premier " );
[Link](liste); } }
[Link]érateur
17
SAID
Saïd EL
ELABDELLAOUI
ABDELLAOUI Programmation
OrientéeOrientée Objet : Java
Objet : Java 2020
2017
2020// 2021
2021
2018
COLLECTIONS SPÉCIALES
COLLECTIONS MÉTHODES
INTRODUCTION POLYMORPHISME COLLECTIONS CLASSE OBJECT TD
SPÉCIALES ABSTRAIRES
Tableaux
Statique Dynamique
Tableaux
Statique Dynamique
Tableaux
Statique Dynamique
[Link](new Voleur(...));
[Link](new Guerrier...)); [Link](new Sorcier(...));
Tableaux
Statique Dynamique
class Personnages {
//attribut public class Demo_Personnage {
ArrayList <Personnage> personnages; public static void main (String [] args){
//Constructeur
Personnages (){ Personnages P = new Personnages();
personnages = new ArrayList < Personnage >();} [Link]( new Voleur(...));
//Méthodes [Link]( new Guerrier(...));
public void Ajouter(Personnage P){ [Link]( new Sorcier(...));
if (p!=null) [Link](p) } P. Afficher();
public void Afficher(){ }
for (Personnage element: personnages) }
{[Link](element);} }
}
Exemple :
class FigureFermee {
//...
// difficile à définir à ce niveau !..
public double surface(...) {
???
}
// ...pourtant la méthode suivante en aurait besoin !
public double volume(double hauteur) {
return hauteur×surface(); }
}
Définir surface de façon arbitraire sachant qu’on va la redéfinir plus tard n’est pas une bonne solution (source
d’erreurs) !
Première solution :
Ajouter une méthode quelconque définie arbitrairement :
class Personnage{
// ...
// On n'affiche rien : corps de la méthode vide
public void afficher(){ }
// ...
}
☞ Mauvais modèle de la réalité
Bonne solution : Signaler que la méthode doit exister dans chaque sous-classe sans qu’il soit
nécessaire de la définir dans la super-classe
☞ Déclarer la méthode comme abstraite
Syntaxe :
abstract Type nom_methode (liste d’arguments);
Exemples :
abstract class FigureFermee{
public abstract double surface();
public abstract double perimetre();
// On peut utiliser une méthode abstraite :
public double volume (double hauteur) {
return hauteur×surface(); }
}
26
SAID EL ABDELLAOUI Programmation Orientée Objet : Java 2020 / 2021
COLLECTIONS MÉTHODES
INTRODUCTION POLYMORPHISME COLLECTIONS CLASSE OBJECT TD
SPÉCIALES ABSTRAIRES
CLASSES ABSTRAITES
27
class jeu {
S’ils ont oublié de définir la méthode afficher, le code ci-dessus génère une erreur de
compilation car on ne peut pas créer d’instance de Guerrier :
Guerrier is abstract; cannot be instantiated
Cercle n’est pas une classe abstraite Polygone reste par contre une classe abstraite
CONSTRUCTEURS ET POLYMORPHISME
29
abstract class A
{
public abstract void m(); // méthode invocable de manière polymorphique
public A() { m(); }
}
class B extends A{
private int b;
public B() { b=1; }
public void m() { // A() est invoquée implicitement juste avant
[Link]("b vaut : "+b);
}
}
class Test{
public static void main(String []args ) {
B b= new B(); // définition de m pour la classe B
}
}:
affiche : b vaut 0
[Link]
Attributs
Abstract Poids : double
Couleur : String
Méthodes
Crier() : void
Il existe en Java une super-classe commune à toutes les classes : la classe Object qui constitue le sommet
de la hiérarchie.
Permet à tout les objets d’utiliser les différentes méthodes de la classe mère.
Fait partie du package ‘[Link]’
clone() getClass()
SAID
Saïd EL
ELABDELLAOUI
ABDELLAOUI Programmation
OrientéeOrientée Objet : Java
Objet : Java 2020
2017
2020// 2021
2021
2018
COLLECTIONS MÉTHODES
INTRODUCTION POLYMORPHISME COLLECTIONS
SPÉCIALES ABSTRAIRES
CLASSE OBJECT TD
Méthode toString()
34
class Voiture{
[Link]
class Test{
Public static void main(String[] args){
Voiture V1 = new Voiture("Peugeot206",2006, "22-1445", "Bleu",180);
[Link]
[Link](V1); // [Link]([Link]());
}
}
SAID
Saïd EL
ELABDELLAOUI
ABDELLAOUI Programmation
OrientéeOrientée Objet : Java
Objet : Java 2020
2017
2020// 2021
2021
2018
COLLECTIONS MÉTHODES
INTRODUCTION POLYMORPHISME COLLECTIONS
SPÉCIALES ABSTRAIRES
CLASSE OBJECT TD
Méthode equals ()
35
equals() est une méthode utilisée pour comparer deux objets pour l'égalité. L'implémentation par défaut
de la méthode equals() dans la classe Object renvoie true si et seulement si les deux références
pointent vers la même instance. Il se comporte donc comme la comparaison par == .
On redéfinit (« override ») une méthode d’instance si les paramètres et leurs types sont identiques et les
types de retour compatibles :
Méthode equals ()
36
class Test{
Public static void main(String[] args){
[Link]
Voiture x Voiture y
--------- ---------
Type : Peugeot206 Type : HondaCivic
Modele : 2006 Modele : 2008
--------- ---------
Méthode equals ()
37
class Test{
Public static void main(String[] args){
[Link]
Voiture x Voiture y
--------- ---------
Type : Peugeot206 Type : HondaCivic
Modele : 2006 Modele : 2008
--------- ---------
Méthode equals ()
38
class Test{
Public static void main(String[] args){
[Link]
x y
Type : Peugeot206
Modele : 2006
---------
Méthode equals ()
39
Même si x et y sont créés avec les mêmes champs, ils pointent vers deux objets différents en mémoire. Par
conséquent, l'implémentation equals() par défaut equals() évaluée à false .
Pour comparer le contenu d'un objet à l'égalité, equals() doit être redéfinie.
[Link]
///
@Override
public boolean equals(Voiture obj1) {
return ([Link] == [Link] && [Link] == [Link] && [Link] == [Link]
&& [Link] == [Link] && this.Vitesse_max == obj.Vitesse_max); }
///
[Link]
Exécution : True
Méthode equals ()
40
Même si x et y sont créés avec les mêmes champs, ils pointent vers deux objets différents en mémoire. Par
conséquent, l'implémentation equals() par défaut equals() évaluée à false .
Pour comparer le contenu d'un objet à l'égalité, equals() doit être redéfinie.
///
@Override
[Link]
///
[Link]
Exécution : True
Méthode hashcode()
41
class Test{
Public static void main(String[] args){
Voiture x = new Voiture ("Peugeot206", 2006, "22-1445", "Bleu" ,180);
[Link]
Voiture y = x;
boolean b = [Link](y);
[Link](b);
[Link]([Link]());
[Link]([Link]()); }
}
true
19770577
19770577
Supposons que l’on souhaite programmer un jeu mettant en scène les entités suivantes :
Chaque entité sera principalement dotée d’une méthode evolue() : gérant l’évolution de l’entité dans le jeu.
class Entite
+ void evolue( )
Idéalement, il nous faudrait mettre en place une hiérarchie de classes telle que celle-ci :
Class Graphique
+ Void dessiner(…)
Mais ….Java ne permet que l’héritage simple : chaque sous-classe ne peut avoir qu’une seule classe parente
directe !
Imposer un contenu commun à des sous-classes en dehors d’une relation d’héritage est le rôle joué par la
notion d’interface en Java.
interface Graphique
+Void dessiner(…)
Interface ≠ Classe
Objectifs d’utilisation des interfaces :
Une interface permet de remédier le problème de limitation de l’héritage multiple
Une interface permet d’imposer à certaines classes d’avoir un contenu particulier et
unifier sans que ce contenu ne fasse partie d’une classe.
Syntaxe :
interface UneInterface {
//constantes ou méthodes abstraites
}
Exemple :
Une interface est une « classe» purement abstraite dont toutes les méthodes sont abstraites et
publiques ( les mots-clés abstract et public sont optionnels sans la déclaration des méthodes).
Il ne peut y avoir de constructeur dans une interface. Impossible de faire new.
Lorsqu'une classe C implémente une interface I elle doit redéfinir toutes les méthodes de I, sinon elle
doit être abstraite et il faut dans ce cas la définir abstraite.
Une interface attribue un type supplémentaire à une classe d’objets, on peut donc :
Déclarer une variable de type interface
Y affecter un objet d’une classe qui implémente l’interface
(éventuellement, faire un transtypage explicite vers l’interface)
Exemple :
// Autre exemple !
Graphique graphique;
Entite entite = new Balle(..); class Balle
// transtypage indispensable !
graphique = (Graphique) entite;
Une classe peut implémenter plusieurs interfaces (mais étendre une seule classe)
Séparer les interfaces par des virgules
Exemple :
Nous avons vu que l’héritage permet de mettre en place une relation de type « est-un » entre
deux classes.
Lorsqu’une classe a pour attribut un objet d’une autre classe, il s’établit entre les deux classes
une relation de type « a-un » moins forte que l’héritage (on parle de délégation).
Une interface permet d’assurer qu’une classe se conforme à un certain protocole.
Elle met en place une relation de type « se-comporte-comme » : une Balle « est-une » entité
du jeu, elle « se-comporte-comme » un objet graphique et comme un objet interactif.
Une exception est une erreur qui se produit dans un programme et qui conduit à son arrêt.
Exemple 2 :
Les exceptions permettent d’anticiper les erreurs qui pourront potentiellement se produire lors de
l’utilisation d’une portion de code.
Entrée : x, y
Sortie : y/x
Si x=0
Erreur
Sinon
retourner y/x
Nous allons capturer l’erreur avec un bloc try {…}catch{…}, puis réaliser un traitement en conséquence
Déroulement du programme
1) Nous isolons le code susceptible de lever une exception :
[Link](j/i);
1) Une exception de type ArithmeticException est levée lorsque le programme atteint cette ligne.
2) Le bloc catch contient un objet de type ArithmeticException en paramètre. Nous l’avons appelé "e".
3) L’exception étant capturée, l’instruction du bloc catch s’exécute !
4) Le message d’erreur personnalisé s’affiche alors à l’écran.
catch : Gère les erreurs associées (i.e. les ‘attrape’ pour les traiter)
TRY :
try introduit un bloc réceptif aux exceptions lancées par des instructions, ou des méthodes appelées
à l’intérieur de ce bloc (ou même des méthodes appelées par des méthodes appelées par des méthodes
… à l’intérieur de ce bloc)
Exemple : try { Y=f(x); // f pouvant lancer une exception }
CATCH :
catch est le mot-clé introduisant un bloc dédié à la gestion d’une ou plusieurs exceptions.
Tout bloc try doit toujours être suivi d’au moins un bloc catch gérant les exceptions pouvant être lancées
dans ce bloc try.
Si une exception est lancée mais n’est pas interceptée par le catch correspondant, le programme s’arrête
(message ‘Exception in thread….’) et affichage de la trace d’exécution.
Syntaxe :
catch (type nom) {…..}
Intercepte toutes les exceptions de type type lancées depuis le bloc try précédant type peut-être une classe
prédéfini de la hiérarchie d’exceptions de java ou une classe d’exception créée par le programmeur.
THROW :
throw est l’instruction qui signale l’erreur au reste du programme. Fréquemment utiliser pour les
teste de condition
Exemple 1 :
Objet : exception
L’objet est de type Exception, il est ‘lancé’ au reste du programme pour être ‘attrapé ‘
Exemple 2 :
if (…) {
throw new Exception (" Quelle erreur !! ");
}
//….
Une méthode lançant une exception sans la traiter localement doit généralement informer qu’elle le fait.
Ceci se fait en ajoutant une clause throws à l’entête de la méthode
Syntaxe :
Exemple :
Nous allons capturer l’erreur avec un bloc try {…}catch{…}, puis réaliser un traitement en conséquence
import [Link].*;
public class teste {
public static void main (String[] args) {
int j = 20, i = ?; // initialiser deux variables de type int
i = 0 i = 1
exception est une classe de [Link] qui possède de nombreuses sous-classes et qui hérite de Throwable.
Throwable
ArrayIndexOutOfBoundException NumberFormatException
Deux constructeurs :
Erreur avec ou sans message
public Throwable()
public throwable(String message)
try {
if (age >= 150)
{ throw new Exception ("age trop grand"); }
if (x == 0.0)
{ throw new ArithmeticException ("Division par zero"); }
}
// Il faut commencer de l’exception la plus précise à la plus générale
catch (ArithmeticException e){
[Link]([Link]());
[Link](); }
Un bloc catch n’est exécuté que si une exception e type correspondant a été lancée depuis le
bloc try correspondant.
Sinon le bloc catch est simplement ignoré.
En l’absence du bloc finally, si un bloc catch est exécuté, le déroulement continue ensuite
normalement après ce bloc catch ( ou après le dernier des blocs catch du même bloc try,
lorsqu’il y en plusieurs).
class Inverse {
public static void main (String [] args){
try { int b = [Link](args[0]);
int c=100/b;
[Link]("Inverse *100 =" +c); }
4.1
catch(NumberFormatException e1) {
[Link](" Il faut un nombre entier !!");}
0
catch(ArithmeticException e2) {
[Link](" Parti vers l infini !!"); } 4
Exemple d’exécution :
interfaCes graphiques
Partie II : Programmation par événement : Comment faire pour que le programme réagisse?
BD
3 niveaux
Composer la fenêtre :
JPanel, JScrollPane, JSplitPane, …
Eléments de base :
JButton, JCheckBox, JTextField, JTextArea, …
import [Link].*;
public class HelloWorld {
public static void main (String[] args) {
JFrame f = new JFrame("Hello World");
// [Link]("Hello World");
//Composants ajoutés au frame courant.
[Link](300,200); Définir la taille
[Link](JFrame.EXIT_ON_CLOSE);
300px
[Link](true);
} }
200px
import [Link].*;
public class HelloWorld extends JFrame{
helloWord(){
setTitle ("Hello World"); // ou [Link] ("Hello World");
setSize(300,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
[Link]
JFrame hérite de Frame
Component
JButton , JLabel, JMenu
Container [Link] JTextField, etc. héritent
Top-level containers
tous de la classe de base
Window JWindow
JComponent qui fait parti
Frame JFrame
de swing.
Dialog JDialog JComponent hérite
indirectement de
JComponent
JBotton
JMenuItem
JFileChooser
import [Link].*;
import [Link].*;
public class Exemple extends JFrame {
public Exemple(){
setTitle("Mon cadre");
setSize(400,100);
JPanel pan= new JPanel(); //Instanciation d’un objet JPanel
[Link]([Link]);//definition de la couleur de fond.
add(pan); //equivalent à [Link](pan);
setVisible(true);
}
public static void main (String[] args) { new Exemple(); }
}
ES COMPOSANTES DE BASES
JLABEL
15
Avec un JLabel, on peut créer un texte "étiquette" et/ou une image. On peut également intègre du HTML,
spécifier la position du texte par rapport à l’image ou spécifier l’emplacement par rapport à son conteneur.
Quelques méthodes publiques de cette classe :
o JLabel(string, Icon, Int) // Création d’un Jlabel
o Void setText(string) // Modifie le texte du Jlabel
o String getText() // Retourne le texte du Jlabel
o Void seticon(Icon) //Spécifier la position du texte par rapport à l’icône
Void setHorizontalTextPosition(int)
Void setVerticalTextPosition(int)
o Void setToolTipText(string) //Associe un info bulles
Étiquette pouvant contenir du texte et image :
Exemple :
Le bouton est centré sur le conteneur. Par défaut, Jpanel gère la mise en page.
Dans cet exemple, on utilise la pane de JFrame. Le bouton occupe l’espace totale de la fenêtre.
Java utilise les layout managers pour gérer la position des éléments sur la fenêtre.
Tous ces Layout Managers se trouvent dans le package [Link].
Pour utiliser layout manager on utilise la fonction suivante:
Syntaxe :
Swing possède plusieurs gestionnaires de placement qui implémente des modèles de disposition courants :
Classe Description
Dispose les composants d’un container les uns derrière les autres en ligne et à
[Link] leur taille préférée, en retournant à la ligne si le container n’est pas assez large.
Dispose les composants d’un container dans une grille dont toutes les cellules
[Link] ont les mêmes dimensions.
Exemple :
import [Link].*;
import [Link].*;
public class Exemple extends JFrame{
private JPanel pan= new JPanel();
private JButton bouton = new JButton ("OK");
public Exemple(){
setTitle("Mon bouton");
setSize(300,150);
[Link](bouton);// ajout du bouton au pan
add(pan); // ajout du pan au cadre
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main (String[] args) {new Exemple(); }
}
Swing possède plusieurs gestionnaires de placement qui implémente des modèles de disposition courants :
Classe Description
Affiche un composants d’un à la fois parmi l’ensemble des composants d’un
[Link] container (pratique pour créer des panneaux comme ceux de la boite de
dialogue de préférences d’Eclipse).
Dispose les composants en ligne à leur hauteur préférée ou en colonne à leur
[Link]
largeur préférée.
Dispose les composants d’un container dans une grille dont les cellules
peuvent avoir des dimensions variables. La position et les dimensions de la
[Link]
cellule d’un des composant varient en fonction de sa taille préférée et des
contraints de classe Java .[Link] qui lui sont associées.
Dispose les composants d’un container en fonction de leur taille préférée et
[Link] de contraintes qui spécifient comment ces composants sont rattachés les uns
par rapport aux autres.
FlowLayout
C’est le gestionnaire de placement par défaut d’un JPanel
Il place les objets sous leur taille préférée de gauche à droit et de haut en bas
On ne passe à la prochaine ligne que quand l’espace restant sur la ligne n’est plus suffisant pour
contenir le composant.
Syntaxe :
[Link](new FlowLayout());
[Link](B1); //JButton B1= new JButton("button 1")
import [Link].*;
import [Link].*;
import [Link].*;
public class Fenetre1 extends JFrame{
JButton b1 = new JButton("bouton N1"); JButton b2 = new JButton("bouton N2");
JButton b3 = new JButton("bouton N3"); JButton b4 = new JButton("bouton N4");
JPanal P= new JPane();
public Fenetre1 {
setTitle("Hello World"); setSize(300,200);
[Link](new FlowLayout());
[Link](bouton);
setDefaultCloseOperation(this.EXIT_ON_CLOSE);
setLocationRelativeTo([Link]());
setDefaultCloseOperation(3);
}
}
BorderLayout
Il place les composants dans une région de notre choix ( NORTH, WEST, CENTER, EAST, SOUTH).
Si la région n’est pas spécifiée, la composant est positionné au centre.
Syntaxe :
[Link](new BorderLayout());
[Link](B1, [Link]);
import [Link].*;
import [Link].*;
public class Exemple extends JFrame{
private JButton b1 = new JButton(" Centre ");
public Exemple() {
setTitle("Border Layout"); setSize(300,250);
setLocationRelativeto(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new borderLayout()); //la layout utiliser
//On ajoute les boutons au content pane de la JFrame
getContentPane().add(b1, [Link]);
getContentPane().add(new JButton(" ouest"), [Link]);
getContentPane().add(new JButton(" sud"), [Link]);
getContentPane().add(new JButton("nord"),[Link]);
getContentPane().add(new JButton(" est"), [Link]);
setVisible(true); }
public static void main (String[] args) { new Exemple(); } }
GridLayout
Ajoute les composants suivant une grille définie par un nombre de lignes et de colonnes.
Syntaxe :
BoxLayout
Avec, vous pourrez ranger vos composants à la suite soit sur une ligne, soit sur une colonne. Le mieux,
c'est encore un exemple de rendu (voir figure suivante) avec un code
Syntaxe :
1ere Etape : Au début, on utilise un pan avec BorderLayout avec les bordures Centre EST et Sud comme
illustré sur la figure suivante
import [Link];
import [Link].*;
public class sport1 extends JFrame {
private JButton sud = new JButton ("sud");
private JButton centre = new JButton ("centre");
private JButton est = new JButton ("est");
private JPanel pan1 = new JPanel();
public sport1(){
setTitle("Mélange de Layouts ");
setSize(300,250);
add(pan1);
[Link](new BorderLayout());
[Link](sud,[Link]);
[Link](centre,[Link]);
[Link](est,[Link]);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) { new
sport1(); } }
2éme Etape : On ajoute un autre pan BorderLayout avec les bordures Nord, Centre et Sud2
3éme Etape : On ajoute un autre pan GridLayout avec 5 linges et 1 colonne et on le place au nord du
2eme pane
//…… Debut
// La Premiere division
//……
// La Deuxieme division
//…
// La Troisieme division
[Link](pan3,[Link]);
[Link](new GridLayout(5,1));
[Link](new JButton("nom1"));
[Link](new JButton("nom2"));
[Link](new JButton("prenom1"));
[Link](new JButton("prenom2"));
[Link](new JButton("adresse"));
//…Reste
4éme Etape : Après on ajoute un autre pan4 de type GridLayout avec 9 ligne et 1 colonne et on le place à
l’est de pan1.
//…… Debut
//…
// La Quatrieme division
[Link](pan4,[Link]);
[Link](new GridLayout(9,1));
[Link](new JButton("tennis"));
[Link](new JButton("squash"));
[Link](new JButton("natation"));
[Link](new JButton("athletisme"));
[Link](new JButton("randonnée"));
[Link](new JButton("foot"));
[Link](new JButton("basket"));
[Link](new JButton("volley"));
[Link](new JButton("pelanque"));
//…Reste
5éme et 6éme Etape : Après on ajoute un autre pan4 de type GridLayout avec 9 ligne et 1 colonne et on le
place à l’est de pan1.
public sport5(){
//….
// La Premiere division
[Link](new BorderLayout());
[Link](pan6,[Link]); // changement
// La Deuxieme division
[Link](pan5,[Link]);
// La Troisieme et Quatrieme division
// ……
// La Cinquieme division
[Link](new FlowLayout());
[Link](new JButton("sexe"));
[Link](new JButton("homme"));
[Link](new JButton("femme"));
// La sixième division
[Link](new FlowLayout());
[Link](new JButton("ok"));
[Link](new JButton("annuler"));
public sport5(){
//….
// La Premiere division
[Link](new BorderLayout());
[Link](pan6,[Link]); // changement
// La Deuxieme division
[Link](pan5,[Link]);
// La Troisieme et Quatrieme division
// ……
// La Cinquieme division
[Link](new FlowLayout());
[Link](new JButton("sexe"));
[Link](new JButton("homme"));
[Link](new JButton("femme"));
// La sixième division
[Link](new FlowLayout());
[Link](new JButton("ok"));
[Link](new JButton("annuler"));
public sport5(){
//….
// La Premiere division
[Link](new BorderLayout());
[Link](pan6,[Link]); // changement
// La Deuxieme division
[Link](pan5,[Link]);
// La Troisieme et Quatrieme division
// ……
// La Cinquieme division
[Link](new FlowLayout());
[Link](new JButton("sexe"));
[Link](new JButton("homme"));
[Link](new JButton("femme"));
// La sixième division
[Link](new FlowLayout());
[Link](new JButton("ok"));
[Link](new JButton("annuler"));
Des La Machine
Seuls les
L Virtuelle
événements événements
’utilisateur reçoit tous
sont alors écoutés
réalise une les événements
générés sont
action
transmis
Action
événement
Botton
Listener
.addXXXListener(.......)
Capturer et gérer
l’événement
Généralisation
Les sources d’ évènement procèdent des méthodes addXXXListener() qui leur permettent d’enregistrer les
écouteurs d’ vènement sélectionnés de type XXXListener.
Lorsqu’un évènement arrive à la source, celle-ci envoie une notification à tous mes objets écouteurs
recensés pour cet évènement.
Evénement
Botton
Listener
.addXXXListener(.......)
Capturer et gérer
l’événement
Généralisation
Dans JAVA, pour qu’un objet puisse répondre à un événement, il faut lui attacher un écouteur (Listener).
Ces évènements sont gérés par AWT
Listeners : interface
WindowListener MouseListener
ActionListener KeyListener
Pour gérer les Pour gérer les
événements Pour gérer les évènements de
Pour gérer les
sur la fenêtre évènements produits la souris
évènements
sur les composantes du clavier
graphiques
ActionListener
L'événement actionPerformed est produit quand on valide une action par un clique ou par la touche
de validation du clavier.
Pour gérer cet événement dans une application, il faut :
1. Créer une classe implémentant l'interface ActionListener
2. Brancher un bouton sur un écouteur addActinListner
3. Redéfinir la réponse aux événements utilisateur, produits dans l'interface, dans la méthode
actionPerformed.
Quand on clique, par exemple, sur un bouton qui est branché sur cet écouteur, la méthode
actionPerformed de l'écouteur s'exécute.
La classe implémentant cette interface s'appelle un listener (écouteur) ou un gestionnaire
d'événements.
public Exemple(){
setTitle(" Vider un TextField ");
[Link](new FlowLayout());
[Link](this); // la fenêtre est écouteur 2.
[Link](saisie); [Link](BVider); add(pan);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);// La sixième division
}
public Exemple(){
setTitle(" Vider un TextField ");
[Link](new FlowLayout());
[Link]( new ActionListener() {
@Override
2. & 3.
public void actionPerformed(ActionEvent e) {
[Link](""); }
}
);
[Link](saisie); [Link](BVider); add(pan);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);// La sixième division
} }
Lorsqu’un événement se produit dans un composant, il est envoyés aux Listeners enregistrés.
Chaque auditeur définit les actions à exécuter dans des méthodes aux noms prédéfinis.
Exemple :
Lors d’un clic sur un bouton, un ActionEvent est envoyé aux ActionListener enregistrés.
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
[Link] ([Link]());//Lire le contenu du t et l’ajouter à la liste
}});
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
[Link](0); }});
setBounds(10,10,250,250);
setVisible(true); }
Remarques :
L'interface ActionListener utilisée dans l'exemple n'est pas limitée aux clic sur des boutons, elle peut être
utilisée dans bien d'autres situations, par exemple:
Lors de la sélection d'un élément de menu.
Lors de la sélection d'un élément dans une liste avec un double-clique.
Lorsque la touche "Entrée" est activée dans un champ de texte. On peut ajouter la ligne:
[Link](this);
Lorsqu'un composant Timer déclenche l'écoulement d'un temps donné.
En résumé, ActionListener s'utilise de la même manière dans toutes les situations qu'on vient d'évoquer;
unique méthode actionPerformed() reçoit en paramètre un objet de type ActionEvent. Cet objet fournit des
informations sur l'événement qui a été déclenché.
Dans JAVA, pour qu’un objet puisse répondre à un événement, il faut lui attacher un écouteur (Listener).
Ces évènements sont gérés par AWT
Listeners : interface
WindowListener MouseListener
ActionListener KeyListener
Pour gérer les Pour gérer les
événements Pour gérer les évènements de
Pour gérer les
sur la fenêtre évènements produits la souris
évènements
sur les composantes du clavier
graphiques
MouseListener
import [Link].*;
import [Link].*;
import [Link].*;//package pour les événements
public class Exemple extends JFrame implements MouseListener {
private JLabel saisie= new JLabel("clique Coordonnées : ");
private JPanel pan= new JPanel();
public Exemple1(){
setSize(300,300);
setTitle(" Vider un TextField ");
setDefaultCloseOperation(EXIT_ON_CLOSE);
[Link](new FlowLayout());
[Link](saisie);
add(pan);
[Link](this);// la fenetre est ecouteur
setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane jop1= new JOptionPane();
[Link](null,"x = "+[Link]()+" Y= "+[Link]()); }
@Override
public void mouseEntered(MouseEvent arg0) { }
@Override
public void mouseExited(MouseEvent arg0) { }
@Override
public void mousePressed(MouseEvent arg0) { }
@Override
public void mouseReleased(MouseEvent arg0) { }
}
public class EXO2{ public static void main(String[] args) {new Exemple1();} }
2) La classe doit déclarer qu’elle utilisera une ou plusieurs interfaces d’écoute : par exemple
ActionListener
4) Implémenter les méthodes déclarées dans les interfaces ,par exemple :actionPerformed()
Dialog Frame
Tabbed Pane Split pane
Tool bar
Internal frame
Layered pane
Progress bar
Tool tip
Slider
Tree
JDBC
• 1 : Présentation
• 6 : Déconnexion
• 7 : SQLException
JDBC (Java DataBase Connectivity): c’est la relation entre Java et les bases de données.
JDBC : un driver (pilote) fournit des outils pour traiter les BD.
JDBC permet à un programme java d’interagir localement ou à distance avec une base de données relationnelle.
Fonctionne selon le principe Client-Serveur
SGBD
Programme
(ex :phpMyAdmin,MySQL…)
JAVA
DriverManager
getConnection()
Canal de
Connection Connection Connection communication TCP
vers une BD
createStatement()
JDBC permet à un programme java d’interagir localement ou à distance avec une base de données relationnelle.
Fonctionne selon le principe Client-Serveur
SGBD
Programme
(ex :phpMyAdmin,MySQL…)
JAVA
Opération 1 :
Télécharger phpMyAdmin du site officiel de phpMyAdmin
Installer phpMyAdmin
Utiliser un serveur de base de données de votre choix : XAMPP, MySQL ,oracle…ect
Préparation :
Créer une base de donnée nommé «BDTest» contenant une table nommée «Personne». Cette table
contient 3 champs : Nom(Varchar(10)), Prenon(Varchar(10)) et Age(int)).
Remplissez
Opération 2 :
Télécharger le driver JDBC nommé "mysql-connector-java" du site officiel de MySQL . C’est un dossier
compressé. Après décompression ,vous allez trouver le fichier jar correspondant au driver.
Ajouter le driver JDBC à votre projet comme suit :
Cliquer avec le bouton droit de la souris sur le nom du projet dans l’explorateur
Eclipse -> Propriétés->Java Build Path -> onglet Librairies->cliquer sur le bouton ’’add external JAR’’-
>sélectionner le driver JDBC de Mysql.
Opération 3:
Ouvrir le projet auquel nous avons ajouter le driver.
Ajouter des classes au projets et via des instruction Java,
Le programme peut:
Fermer la connexion
(1) [Link]("[Link]");
Exemple :
String url="jdbc:mysql://localhost/BDTest";
con= [Link](url,"root","");
public BaseSQL() {
try{
//Chargement pilote
[Link]("[Link]");
//Ouverture de connexion
String url="jdbc:mysql://localhost/BDTest";
con= [Link](url,"root","");
[Link]("connexion bien rétablie !!");
//Exécution d’une requête
//Traitements des données
//Fermeture de la connexion
} catch (Exception ex){ [Link]("Erreur :"+ex);
}
public static void main(String [] args ) {new BaseSQL ();}
}
(3) st =[Link]();
Le résultat d’une requête est récupéré par un objet res de type interface ResultSet et permet d’accéder aux
données extraites grâce à la requête.
(5) [Link]();
Pour récupérer les données dans chaque colonne, l’interface ResultSet propose plusieurs méthodes adaptées
aux types des données récupérées :
getString(NumCol),getInt(NumCol),getDate(NumCol).
//……
import [Link];
public class BaseSQL {
//……
private ResultSet rs;
private Statement st;
public BaseSQL() {
try{ //……
//Exécuter d’une requête
st =[Link]();
String requete = "select * from Personne";
rs = [Link](requete);
//Traiter les résultats (affichage)
[Link]("Enregistrements de la table");
while([Link]()){
String Nom = [Link]("nom");
String Prenom = [Link]("prenom");
int Age = [Link]("age");
[Link]( "Nom: "+Nom+" Prenom: "+Prenom+ "Age: "+Age);
}
//Fermeture de la connexion
} catch (Exception ex){//…… }
}
} Resultset Resultset
Fermeture de la connexion :
La méthode close() permet de libérer les ressources prises par la création d’objets de type ResultSet ,
Statement et Connection.
(6) [Link]();
Elle existe pour chacune de ces interfaces. Elle est le plus souvent employé pour une Connection, car
elle libère en même temps toutes les ressources qui lui sont associées.
//……
import [Link];
La mise à jour d'une base de données peut être effectuée par une requête SQL de type :
INSERT,
UPDATE ,
DELETE
à travers la méthoed executeUpdate("Requête") sur un objet de type Statement.
Le résultat renvoyé par l'exécution de la requête indiquera le nombre de lignes mises à jour dans la
base, contrairement à une requête de sélection qui renvoie un ResultSet.
import [Link];
//……
public class BaseSQL {
//……
private Statement st;
//String N="", P=""; int A;
public BaseSQL () {
try {
//……
String requete1="INSERT INTO Personne VALUES('saber','Mohammed',20)";
// pour ajouter des valeurs non déterminées:
String requete="INSERT INTO Personne(nom, prenom, age)"+
"VALUES('"+N+"','"+P+"','"+A+"')";
[Link](requete1);
try{
String requete2= "update Personne set age=21 where prenom='mohammed'";
int b =[Link] (requete2);
[Link]( " Enregistrement modifiée.");
}catch(Exception ex){
[Link]("Erreur: "+ex);}
}
try {
st = [Link]();
String requete3 = "CREATE TABLE Personne(id int not null auto_increment,nom
VARCHAR (15), prenom varchar (15), age(INT), primary key(id))";
[Link](requete3);
}catch(Exception ex){
[Link]("Erreur: "+ex);
}
}
try{
String requete4 = "delete from Personne where prenom = 'mohammed'";
[Link](requete4);
[Link]("Enregistrement supprimé. ");
}catch(Exception ex){
[Link]("Erreur: "+ex);}
}
Interface Graphique
if([Link]()==modif){
try{//Connexion
String url ="jdbc:mysql://localhost/BDTest";
[Link]("[Link]");
con =[Link](url,"root","");
Statement st = [Link]();
[Link]("connexion est bien etablie");
String requete= "update Personne set age=21 where prenom='mohammed'";
[Link] (requete);
[Link]( "Enregistrement modifiée.");
}catch(Exception e1){
[Link]();}
}
if([Link]()==supp){
try{//Connexion
String url ="jdbc:mysql://localhost/test";
[Link]("[Link]");
con =[Link](url,"root","");
Statement st = [Link]();
[Link]("connexion est bien etablie");
String requete = "delete from Personne where nom = '"+ nom +"' ";
[Link](requete);
[Link]("Enregistrement supprimé. ");
}catch(Exception e1){
[Link]();}
}
Remarque : On remarque qu’il y a du redondance dans la partie de la connexion pour chaque bouton, pour ce
fait, on va créer une classe nommée BDSQL qui va retourner un élément de type
Schéma Globale :
Connection : con
nom: String
prenom : String Window() Main()
BaseSQL()
Age : int
finalize()
Insert(…)
BASESQL
import [Link];
import [Link];
import [Link];
import [Link];
public class BaseSQL {
private Connection con;
public BaseSQL(){
try{
[Link]("[Link]");
String url="jdbc:mysql://localhost/javadb";
con=[Link](url,"root","");
[Link]("Connexion bien");
}catch(Exception ex){
[Link]("Erreur:"+ex);
}
}
BASESQL
public void Insert(Personne P) throws SQLException {
String requete1 ="INSERT INTO Personne Value('" + [Link] + "','" +
[Link] + "'," + [Link] + ")";
//[Link](requete1);
Statement st = [Link]();
[Link](requete1);
}
@Override
protected void finalize() throws Throwable {
[Link]();
if(con == null) return;
[Link]();
[Link]("connextion close");
Personne
Main
Window
import [Link]; [Link](new
import [Link].*; ActionListener(){
import [Link]; @Override
import [Link].*; public void actionPerformed(ActionEvent o){
public class Window extends JFrame { Personne p = new Personne();
private JTextField j1 = new JTextField (""); [Link] = [Link]();
private JTextField j2 = new JTextField (""); [Link] = [Link]();
private JTextField j3 = new JTextField (""); [Link] = [Link]([Link]());
private JButton ajouter = new JButton("Ajouter");
JPanel pan = new JPanel(); BaseSQL b = new BaseSQL();
public Window(){ try {
setSize(300,300);setTitle("Exemple de Mysql"); [Link](p);
[Link](new GridLayout(4,2)); } catch (SQLException e) {
[Link](new JLabel("Nom:")); [Link](j1); // TODO Auto-generated catch block
[Link](new JLabel("Prenom:"));[Link](j2); [Link]();
[Link](new JLabel("Age:")); [Link](j3); } finally {
[Link](ajouter); b = null;
[Link]();
} });
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}