248
PROJET PROGRAMMATION ORIENTÉE OBJET (POO) Université Antonine 2010 - 2011

Projet Programmation orientée objet (POO)

  • Upload
    nikita

  • View
    51

  • Download
    3

Embed Size (px)

DESCRIPTION

Université Antonine 2010 - 2011. Projet Programmation orientée objet (POO). Plan détaillé. Initiation Java Interfaces Graphiques Awt Swing Evénements ActionListener MouseListener Etc. Rappel sur les notions de POO Application Client - Serveur Base de données - PowerPoint PPT Presentation

Citation preview

Base de Donnes

Projet Programmation oriente objet (POO)Universit Antonine 2010 - 2011

1Plan dtaill Initiation JavaInterfaces GraphiquesAwtSwingEvnementsActionListenerMouseListenerEtc.Rappel sur les notions de POOApplication Client - Serveur Base de donnes Threading et Gestion du Graphisme

Plan dtaill Initiation C#Interface GraphiqueManipulation FichiersEditeur de TexteRseaux et Sockets Serveur ChatConnaissances Acquises Elaborer une bonne dmarche scientifique ncessaire pour le dveloppement dune application

Intgrer les interfaces de programmation ncessaires lapplication en question.

Dvelopper des applications dotes dinterfaces graphiques et/ou de communication (client/serveur).Connaissances Requises Des notions de bases en

Algorithmique L3G

Algorithme OOInitiation Java Introduction Java Orient objetJava ne permet d'utiliser que des objets (hors les types de base)

Sr

Seul le bytecode est transmis, et vrifi par linterprteurLe code source est prserv

7Caractristiques du langage Java SimpleApprentissage facile faible nombre de mots-clssimplifications des fonctionnalits essentiellesDveloppeurs oprationnels rapidement

FamilierSyntaxe proche de celle de C/C++8Caractristiques du langage Java FiableGestion automatique de la mmoire(ramasse-miette ou "garbage collector")Gestion des exceptionsSources d'erreurs limitestypage fort, (le type est impos)pas d'hritage multiple,pas de manipulations de pointeurs, etc.Vrifications faites par le compilateur facilitant une plus grande rigueur du codeVrification des types, des constructeurs des classes, 9Java, un langage InterprtJava est un langage interprtLa compilation d'un programme Java cre du pseudo-code portable : le "byte-code"Sur n'importe quelle plate-forme, une machine virtuelle Java peut interprter le pseudo-code afin qu'il soit excutLes machines virtuelles Java peuvent tre des interprteurs de byte-code indpendants (pour excuter les programmes Java)contenues au sein d'un navigateur(pour excuter des applets Java)1011

Fichier C(.c)Compilateur C

Codeexecutablelangage Compil1112

Fichier Java(.java)Compilateur Javac

bytecode(.class)Machine Virtuelle javaCodeexecutablelangage interprt 1213LAPI de JavaJava fournit de nombreuses librairies de classes remplissant des fonctionnalits trs diverses : c'est l'API Java Ces classes sont regroupes, par catgories, en paquetages (ou "packages")Swing Java2DJava3DJAAS (Java Authentication and Authorization Service)Java Security FrameworkEtc.Interface Graphique en JAVAAPIs correspondantesAWT Utilise des composants du systmes Swing (Sun Microsystems)Composants entirement dessins en Java SWT (Standard Widget Toolkit)Initialement dveloppe par IBMMaintenu par Eclipse foundationUne librairie graphiqueUtilise les composants du systme dexploitation( comme le dll WinApi,..)Elle est plus riche que AWT/Swing

SWING

Les Fentres JWindowConteneur que vous pouvez afficher sur votre cranJframeFentre destine tre la fentre principale de votre applicationJDialogFentre destine aux botes de dialogueLancer un message davertissementEntrer les donnesNote the JoptionPane example(JavaApplication1/JButton7)

. showConfirmDialog. showMessageDialog. showInputDialog. showOptionDialogJFrameimport javax.swing.JFrame;

public class SimpleFenetre extends JFrame{

public SimpleFenetre(){super();build();//On initialise notre fentre}

private void build(){setTitle("Ma premire fentre"); //On donne un titre l'applicationsetSize(320,240); //On donne une taille notre fentresetLocationRelativeTo(null); //On centre la fentre sur l'cransetResizable(false); //On interdit la redimensionnement de la fentresetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix}}Les Fentres JDialogFentre destine aux botes de dialogue. showConfirmDialog int rep=jOptionPane1.showConfirmDialog(this, "Cont O/N:Presss Escape or Close for Cancel", "My_title", jOptionPane1.CLOSED_OPTION);

//0 si OK, -1 si ESCAPE or CLOSE

System.out.println("reponse="+rep);

Les Fentres JDialogFentre destine aux botes de dialogue. showMessageDialog

jOptionPane1.showMessageDialog(this, "Eggs are not supposed to be green.", "Inane warning", jOptionPane1.WARNING_MESSAGE);

Les Fentres JDialogFentre destine aux botes de dialogue. showOptionDialog

Object[] options = {"Yes, please", "No, thanks", "No eggs, no ham!"};

int n = jOptionPane1.showOptionDialog(this, "Would you like some green eggs to go + "with that ham?", "A Silly Question", jOptionPane1.YES_NO_CANCEL_OPTION, jOptionPane1.QUESTION_MESSAGE, null, options, options[2]); System.out.println("n=" + n + "!");

Les Fentres JDialogFentre destine aux botes de dialogue. showInputDialog

Object[] possibilities = {"ham", "spam", "yam"}; //possibilities=null;

String s = (String)jOptionPane1.showInputDialog( this, "Complete the sentence:\n + "\"Green eggs and...\"", "Customized Dialog", jOptionPane1.WARNING_MESSAGE, null, possibilities, "ham");

//If a string was returnedif ((s != null) && (s.length() > 0)) { System.out.println("Green eggs and... " + s + "!");}

Positionnement des composantsLes LayoutsBorderLayout GridLayoutFlowLayout CardLayout BoxlayoutEtc.

BorderLayoutDivise ses composants en 5 rgions : nord, sud, ouest, est, et centre. "nord" et "sud" occupent toute la largeur de la partie rserve nord ou sud,"ouest" et "est" occupent toute la hauteur qui reste de la partie rserve ouest et est,Centre" occupe la place restante. BorderLayoutDemo: JavaApplication1\NewJFrame1

BorderLayout main_layout=new BorderLayout(5,5);

this.setLayout(main_layout);(this=mainFrame)

Panel p1=new Panel();this.add(p1, BorderLayout._____) north, center, south, west, east)p1.setLayout( A layout for p1)

GridLayoutComposants sur une grille, ligne par ligne (dans l'ordre d'adjonction),Les cellules ont la mme taille, la retaille, les cellules se taillent,hgap et vgap sont nuls par dfaut.Demo:JavaApplication1\NewJFrameFrameGridLayout 5 lignes 0 colonneJpanels dans JframeJpanels GridLayout2 lignes 0 colonneGridLayout(int lignes, int cols, int hgap, int vgap)GridLayout(int lignes, int cols)

FlowLayoutFlowLayout est le gestionnaire par dfaut des Panel. Affiche les composants de la gauche vers la droite, et passe la ligne s'il n'y a plus de place.FlowLayout(int align, int hgap, int vgap)FlowLayout(int align)FlowLayout()e.g.FlowLayout fl=new FlowLayout(FlowLayout.center,0,2)FlowLayout

CardLayout

CardLayout

BoxLayout

BoxLayout

BoxLayout

BoxLayout

BoxLayout

BoxLayout

public class Frame1 extends JFrame{ public Frame1() { super(); this.setTitle("Ma premiere application"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null);

BorderLayout bLayout= new BorderLayout(); this.getContentPane().setLayout(bLayout); JPanel buttonsPanel = new JPanel(); JPanel textPanel = new JPanel(); JLabel label = new JLabel("Nom: "); JTextField textField = new JTextField(20); JButton btok = new JButton("ok"); textPanel.add(label); textPanel.add(textField); buttonsPanel.add(btok);

this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); this.getContentPane().add(textPanel, BorderLayout.CENTER); this.pack(); this.setVisible(true); }}

La mthode main public static void main (String args[]) {

Frame1 frame = new Frame1(); } Exercice Dveloppez le code qui permet dafficher la fentre suivante

Java et Evnements Que se passe-t-il lors d'un clic ?En java, un clic gnre un vnement (Un objet)

import javax.swing.*;

public class FenetreAvecBouton extends JFrame {

private JButton unBouton;private Jpanel pane = new JPanel ();

public FenetreAvecBouton (){JButton unBouton = new JButton("Quitter");pane.add (unBouton);setContentPane(pane);//or this.getContentPane().add(pane);}

public static void main (String args []) {new FenetreAvecBouton().setVisible (true);}}

16-43Eventspublic class GoHandler implements ActionListener{ ... public void actionPerformed (ActionEvent e) { ... }} ... JButton go = new JButton (Go); go.addActionListener (new GoHandler ());

Create the Listener:Objects of this class are GoHandlers but also ActionListenersRegister the Listener:This method expects an ActionListener object (GoHandler)This method is called automatically when the button is clicked43ActionListener specifies one method:

void actionPerformed(ActionEvent e);EventsL'objet vnement de Java est un objet de type EventObject

Tout objet de type EventObject a un attribut source qui peut tre rcupr en utilisant la fonction getSource() de la class EventObject

Hirarchie des vnements

Qui cre ce type d'objet ?Un Thread (comme le EventDispatchingThread) dans JVM permet de rcuprer les interactions de lutilisateur avec lapplication Si on clique sur un composant, ce thread cre un vnement relatif laction ralise en utilisant le composant comme source de lvnementEnsuite il appel le handler correspondant ce composantCependant, on ne cre pas les vnements: on se contente de les grer Explication additionnelleQui cre ce type d'objet ?

La gestion des vnements Pour pouvoir grer les vnements, il faut les couter

Tout le principe de la programmation vnementielle repose sur la dfinition des vnements et des objets qui les coutentCatgories des vnementsPour chaque catgorie dvnements, il existe une interface qui doit tre respecte par toute classe souhaitant recevoir cette catgorie vnements.Cette interface exige que toutes les mthodes soient dfinies.Ces mthodes sont appeles lorsque des vnements particuliers surviennent.

Catgories des vnements

Quest ce quun couteur Le diapo prcdent indique que chaque catgorie une interface est associeUn couteur est un objet destin recevoir et grer une catgorie d vnement gnrs par le systmeN'importe quel objet peut devenir un couteur du moment quil implmente les mthodes dfinies dans l'interface.Ecouteurs Par dfaut, un couteur ne rcupre pas tous les vnements produits par le systme

Il n'coute que les objets qu'on lui dit d'couter !

Donc, Il doit tre associ un objet qui gnre des vnements

Ainsi, les objets qui gnrent des vnements possdent des mthodes qui permettent de leur associer des couteursAjout dcouteursPour ajouter un couteur un composant : addActionListenerJButton, JCheckBox, JComboBox, JTextField et JRadioButton.addAdjustementListenerJScrollBaraddFocusListenertous les composants.addItemListenerJCheckBox, JRadioButton et JComboBox.addKeyListenerJTextField , saisie de texte au clavier.addMouseListener, addMouseMotionListenertous les composants.RsumUne mme catgorie peut tre utilise avec plusieurs objet, et un objet peut avoir plusieurs catgoriesLes mthodes de linterface correspondent aux diffrents vnements supports par cette catgorie Le nom de la catgorie dun vnement est gnralement utilis avecLinterface de lcouteur du lobjetLes mthodes de lcouteur et leur vnement pass en paramtreLa mthode de lobjet utilise pour ajouter l couteur cet objetPar exemple la catgorie d vnement Action correspondLinterface ActionListener La mthode ActionPerformed et l vnement ActionEvent en paramtreLa mthode addActionListener

RsumLe eventdispatcher contrle les vnements amorcs partir de linterface graphiqueLes correspond leurs objets sourcesIl Cre les vnements catgories correspondantsSi des couteurs sont dclars pour ces evenements et enregistrs avec les objets sources alors le eventdiapatcher appelle les mthodes correspondantes de lcouteur tout en lui passant lvnement catgorie afin de rpondre lvnement

import javax.swing.*;import java.awt.event.*;

public class FenetreAvecBouton extends JFrameimplements ActionListener {

private JButton unBouton;

public FenetreAvecBouton (){Jpanel pane = new JPanel ();JButton unBouton = new JButton("Quitter");pane.add (unBouton);

setContentPane(pane);}public void actionPerformed (ActionEvent e) {System.exit (0);}}

import javax.swing.*;import java.awt.event.*;

public class FenetreAvecBouton extends JFrameimplements ActionListener {

private JButton unBouton;

public FenetreAvecBouton (){Jpanel pane = new JPanel ();JButton unBouton = new JButton("Quitter");pane.add (unBouton);unBouton.addActionListener(this);setContentPane(pane);}public void actionPerformed (ActionEvent e) {System.exit (0);}}

Le code prsent prcdemment est dconseill CorrectionIl sagit en effet de sparer les interfaces graphiques des vnements rcepteurs import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;

public class MonEvent implements ActionListener {

public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Test "); }

}import javax.swing.*;import java.awt.event.*;

public class FenetreAvecBouton extends JFrame{MonEvent event = new MonEvent();private JButton unBouton;

public FenetreAvecBouton (){Jpanel pane = new JPanel ();JButton unBouton = new JButton("Quitter");pane.add (unBouton);unBouton.addActionListener(event);setContentPane(pane);}}Ou encoreimport javax.swing.*;import java.awt.event.*;

public class FenetreAvecBouton extends JFrame{MonEvent event = new MonEvent();private JButton unBouton;

public FenetreAvecBouton (){Jpanel pane = new JPanel ();JButton unBouton = new JButton("Quitter");pane.add (unBouton);unBouton.addActionListener(event);setContentPane(pane);}class MonEvent implements ActionListener {

public void actionPerformed(ActionEvent e) { getContentPane().setBackground(Color.red); }}}Inner ClassA la possibilit daccder aux attributs de la classe principaleOu encoreimport javax.swing.*;import java.awt.event.*;

public class FenetreAvecBouton extends JFrame{private JButton unBouton;

public FenetreAvecBouton (){Jpanel pane = new JPanel ();JButton unBouton = new JButton("Quitter");pane.add (unBouton);unBouton.addActionListener(event);setContentPane(pane);}ActionListener event= new ActionListener {

public void actionPerformed(ActionEvent e) { getContentPane().setBackground(Color.red); }}

}ExerciceComment faire un couteur pour 2 objets

Solutionimport javax.swing.*;import java.awt.event.*;

public class FenetreAvecDeuxBouton extends JFrame{MonEvent event = new MonEvent();private JButton btOk = new JButton("ok");private JButton btCancel = new Jbutton("Cancel");

public FenetreAvecDeuxBouton (){Jpanel pane = new JPanel ();pane.add (btOk );pane.add (btCancel);btOK.addActionListener(event);btCancel.addActionListener(event);

setContentPane(pane);}}Solutionimport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;

public class MonEvent implements ActionListener {

public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(e.getActionCommand().equals("ok")){ } else if(e.getActionCommand().equals("Cancel")) {. } }

}Les vnements sourisinterface MouseListener{ void mouseClicked(MouseEvent e); void mouseEntered(MouseEvent e); void mouseExited(MouseEvent e); void mousePressed(MouseEvent e); void mouseReleased(MouseEvent e);}Quelques fonctions intressantes de MouseEvent:

Point getPoint()Retourne les coordonnes de la souris lors de la gnration de l'vnement.int getX() Retourne la coordonne en X de la souris lors de la gnration de l'vnement.int getY()Retourne la coordonne en Y de la souris lors de la gnration de l'vnement.Exempleimport java.awt.event.MouseEvent;import java.awt.event.MouseListener;

public class MonMouseListener implements MouseListener{ public void mouseClicked(MouseEvent e) { System.out.println("X: "+e.getX()+" Y: "+e.getY()); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { }}Exercise Demo: JavaApplication1

Dveloppez une application qui permet de rcuprer et afficher les coordonnes de la souris en passant en dessus dune fentreInitiation POO en JAVAPour commencerSe poser les bonnes questionsQuelles sont les objets qui interviennent dans le problme? Quelles sont les donnes, les objets, que le programme va manipuler?Quelles vont tre les relations entre ces objets? Quelles sont les oprations que je vais pouvoir effectuer sur ces objets?69Concevoir un modle UML Avant de construire un btiment il nous faut le planEn programmation objet il faut laborer le schma UML avant de commencer le codage

Quelques dfinitionsObjets Un objet reprsente un concept, une ide ou toute entit du monde physiqueUn objet est une structure qui regroupe des donnes (attributs) et les moyens de traiter ces donnes (des fonctions que l'on appelle "mthodes" en POO)Un fichier est un objet. cet objet existe, on peut l'utiliserLa voiture est un objetUn conducteur est un objetUn gteau est un objet

Caractristiques dun objetLes caractristiques qui reprsentent un objetUne voiture est caractrise par une couleur, un type, marque, un numro de chssis, un moteur, vitesse, etc. Un conducteur a un nom, sexe, nationalit, etc.Un gteau a un type (fort noire, fort blanche, etc.), poids, etc.

ClassesUne classe est un modle de donnesfamille d'objets, ou encore moule objetstous les objets dune mme classe partagent les mmes attributs et les mmes mthodesUne instance de la classe voiture serait par exemple un objet demarque "Renault", modle "Clio", couleur "rouge" vitesse 0

Classesle mot cl class permet de dclarer une classe d'objet.

Nom de la classeAttributs de la classeMthodes de la classepublic class Voiture{//code de la classe}

UMLJavaAttributs dune classeLes attributs d'une classe sont des variables (ou des constantes) dcrivant les caractristiques de l'objetElles composent le typeElles caractrisent l'objet

Variables dune classeType texteType entierpublic class Voiture{private String marque = "bmw";private int vitesse= 10;}

UMLJavaTypes: texte, entier, rel, boolen, etc.Mthodes dune classeReprsentent les moyens de traiter les attributs et les donnes dun objetElles peuvent possder des paramtres.Elles peuvent ventuellement renvoyer une valeur

public [or private] returnType methodName (type1 name1, ..., typeN nameN){ ...}

Mthodes dune classePar exemple, si on souhaite arrter une voiture en marche, il suffit dutiliser une mthode freiner() qui permet dassocier lattribut vitesse la valeur 0

class Voiture{private String marque = "bmw";private int vitesse= 10;public int freiner(){ this .vitesse = 0;return this.vitesse;} }Retourne une variable de type entierUMLMthodes dune classePassage de paramtres une fonction

double u = 3, v = -4; ... Polynomial p = new Polynomial (1.0, -(u + v), u * v); double y = p.getValue (2 * v - u);public class Polynomial{ public Polynomial (double a, double b, double c) { ... } public double getValue (double x) { ... } ...Mthodes dune classePassage de paramtres une fonctionLes donnes de types primitives sont toujours passes par valeur

double x = 3.0; double y = p.getValue ( x );public class Polynomial{ ... public double getValue (double u) { double v; ... }}x: 3.0u: 3.0copycopyu acts like a local variable in getValueMthodes dune classePassage de paramtres une fonctionLes objets sont toujours passes par rfrence

Fraction f1 = new Fraction (1, 2); Fraction f2 = new Fraction (5, 17);

Fraction f3 = f1.add (f2);public class Fraction{ ... public Fraction add (Fraction f) { ... }}A Fraction object:num = 5denom = 17refers to the same objectrefers toMthodes dune classeUne mthode peut avoir plusieurs instruction return

public someType myMethod (...){ ... if (...) return ; else if (...) return ; ... return ;}Mthodes dune classeUne mthode boolenne peut retourner true/false ou bien le rsultat dune expression boolenne

public boolean myMethod (...){ ... if (...) return true; ... return n % 2 == 0;}Mthodes dune classeUne mthode de type void peut utiliser linstruction return pour quitter la mthode

public void myMethod (...){ ... if (...) return; ...}No need for a redundant return at the endConstructeur dune classeLe rle du constructeur est de dclarer et de permettre d'initialiser les donnes membres de la classeLe constructeur est appel automatiquement quand on cre un objet.Un constructeur se dfinit comme une mthode standard, mais ne renvoie aucune valeur. Tous les noms des constructeurs ont le mme nom de la classeSi une classe possde plusieurs constructeurs, ces derniers doivent avoir diffrent nombre et/ou diffrent types de paramtresJava affecte par dfaut une classe ayant aucun constructeur, le constructeur vide.

Constructeur dune classeclass Voiture{private String marque = "";private int vitesse= 0;

public Voiture(String m, int v){this.vitesse=v;this.marque = m;}}UMLJavaConstructeur dune classeLes constructeurs dune mme classe peuvent appeler lun lautre en utilisant le verbe this

class Voiture{private String marque = "";private int vitesse= 0;

public Voiture(String m, int v){this(100); }public Voiture(int v){vitesse=v; }}Constructeur dune classeLes constructeurs sont invoqus en utilisant loperateur new

Fraction f1 = new Fraction ( );Fraction f2 = new Fraction (5);Fraction f3 = new Fraction (4, 6);Fraction f4 = new Fraction (f3);public class Fraction{ public Fraction (int n) { num = n; denom = 1; } ...Etude de Cas (A faire)Elaborer en UML et Java la classe qui reprsente les gteauxAttributspoidstype bon2 Constructeurs Premier, sert initialiser les attributs Poids: 100type: fort noirebon: TRUESecond; prend trois paramtres pour charger les attributsPoidstypebonMthodesBienPreparretourne la valeur de lattribut bonModifieTypePrend le nouveau type en paramtre et modifie la valeur de lattribut type

Solution

class Gateau{private String type= "";private int poids= 0;private boolean bon=true;

public Gateau(){this.poids=100;this.type= fort noire;this.bon= bon;}public Gateau(String type, boolean bon, int poids){this.poids=poids;this.type=type;this.bon= bon;}public boolean bienPrepar(){return this .bon;}public void modifiType ( String nouveauType){this.type = nouveauType;}}JavaUMLInstanciationCrer un objet se fait en "instanciant" une classe. Quand on instancie une classe, on cre une version de l'objet ayant des caractristiques propres9-93InstanciationFraction f1 = new Fraction(3,7);Fraction f2 = f1;Fraction f1 = new Fraction(3,7);Fraction f2 = new Fraction(3,7);A Fraction object:num = 3denom = 7A Fraction object:num = 3denom = 7A Fraction object:num = 3denom = 7f1f2f1f2Refere au meme objet93An assignment

Fraction f2 = f1;

does not create a copy of f1; it simply sets f2 to refer to the same object as f1 two references refer to the same place in memory.Visibilit de donnespublique: les fonctions de toutes les classes peuvent accder aux donnes ou aux mthodes d'une classe dfinie avec le niveau de visibilit public. Il s'agit du plus bas niveau de protection des donnesprotge: l'accs aux donnes est rserv aux fonctions des classes hritires, c'est--dire par les fonctions membres de la classe ainsi que des classes drivesprive: l'accs aux donnes est limit aux mthodes de la classe elle-mme. Il s'agit du niveau de protection des donnes le plus lev

EncapsulationLes attributs et les mthodes d'un objet qui constituent sa structure interne ne sont en gnral pas accessibles aux autres objets, c'est le principe de l'encapsulation

Par exemple, pour pouvoir modifier la couleur d'une voiture, il faudra lui ajouter une mthode publique, changerCouleur, qui s'occupera de changer la valeur de son attribut couleur

Les autres objets n'ont ainsi plus besoin de savoir comment changer la couleur de la voiture, ils se contentent d'appeler la mthode changerCouleur

Encapsulationpublic class MyClass{ // Private fields: private myField; ...

// Constructors: public MyClass (...) { ... } ... // Public methods: public myMethod (...) { ... } ... // Private methods: private myMethod (...) { ... } ... }Public interface: public constructors and methodsEncapsulation: Exemple

On souhaite incrmenter lattribut useCount dune manire scuriseAccs statique: Attribut statiqueUn attribut statique est partage travers tous les objets de la mme classe

Si vous avez utiliser une mme variable travers plusieurs objets, vous pouvez la dclarer statique

class Voiture{public static int roues = 4;}

Voiture v1=new Voiture()v1.roues=4

Voiture v2=new Voiture()//4System.out.println(v2.roues);V2.roues=10;

Voiture v3=new Voiture();//10System.out.println(v3.roues);Accs statiques: Attribut statiqueOn peut lappeler directement via la classe sans instanciation Exemple

Voiture.roues=4Voiture v2=new Voiture()//4System.out.println(v2.roues);Voiture.roues=14Voiture v3=new Voiture();//14System.out.println(v3.roues);//14System.out.println(v2.roues);

Accs statiques: Mthode statiqueLes mthodes statiques manipulent seulement les attributs statiques de leur classe

Les mthodes statiques ne peuvent plus manipuler les attributs non statiques, et, ne peuvent appeler que des mthodes statiques

Sont appeles sans instanciationExemple dappelle des mthodes statiques

double x = Math.random(); double y = Math.sqrt (x); System.exit();Accs statiques: Mthode statiqueUn autre exemple

public class MyClass{ public static final int statConst; private static int statVar; private int instVar; ... public static int statMethod(...) { statVar = statConst; statMethod2(...);

instVar = ...; instMethod(...); }Errors!OKStatic methodAccs statiques: RemarquePas besoin de crer une instance sur une classe ayant tous ses attributs et/ou mthodes statiquesLes classes Math et System sont des exemples

double x = Math.random(); double y = Math.sqrt (x); System.exit();Mthode non statiquePour accder aux mthodes non statiques il est ncessaire de crer une instance sur la classe

Les mthodes non statiques peuvent accder aux attributs et mthodes statiques et non statiques

A faireElaborer une classe Forme Crez deux instances diffrentes de la classe forme et comparez les en utilisant la mthode comparerForme

HritageSouvent, vous aurez besoin d'une classe avec des mthodes et fonctions similaires une autre classe

Il est bon de dfinir des classes gnriques, qui pourront tre rutilises et adaptes tous vos projets

Pour faciliter cela, une classe peut tre une extension d'une autre classe.HritageLa classe drive hrite alors toutes les mthodes et variables de la classe parent

La classe drive que nous appelons fille peut dfinir ses propres fonctions et variables, qui s'ajouteront

Une classe ne peut hriter que d'une seule autre classe, et l'hritage multiple n'est pas support

Les hritages se font avec le mot cl ' extends '.

HritageLe principe dhritage permet la rutilisabilit et l'adaptabilit des objetsClasses filles qui hritent des caractristiques (attributs et mthodes) d'une classe mreLes classes filles peuvent galement dfinir leurs propres caractristiques.

Le principe dhritage rduit la duplication dun mme code tout en lcrivant dans la classe mre

Hritage

Lien dhritageUMLHritage

class Vehicule{protected String marque = ""; public void avance(){//code qui fait avancer le vhicule}public void freine(){//code qui fait freiner le vhicule}}UMLJavaHritageclass Voiture extends Vehicule{private int porte=4;public int nbrPortes(){//retourne nbrPortes}}

la classe voiture possde un attribut marque par hritage, un attribut porte, une mthode freine et une mthode avance par hritage et une mthode nbrPortes()UMLJavaHritage

class Camion extends Vehicule{private int Remorque=40;public int volumeRemorque(){//retourne volumeRemroque}} la classe Camion possde un attribut Remorque et une mthode volumeRemorque, ainsi qu un attribut marque, une mthode freine et une mthode avance par hritagejavaUML

Etude de CasElaborez les classes suivantes HritageRedfinition de mthodeLes mthodes hrits peuvent tre rcrites dans la classe fille class Voiture extends Vehicule{ public void avance(){//code qui fait avancer la voiture} public void freine(){//code qui fait freiner la voiture}} class Vehicule{protected String marque = ""; public void avance(){//code qui fait avancer le vhicule}

public void freine(){//code qui fait freiner le vhicule}}Contrle daccs hritageLes accs aux attributs et mthodes sont redfinissables dans les classes filles pourvu que la directive soit identique ou plus large

Une mthode protge peut tre redfinie comme protge ou publique dans une classe fille.

Une mthode publique ne peut tre que publique dans une classe fille.Contrle daccs hritageAppel des constructeurs dune super classeEn utilisant super, et ceci seulement partir dunconstructeur

public class Walker extends Biped{ // Constructor public Walker(int x, int y, Image leftPic, Image rightPic) { super(x, y, leftPic, rightPic); ... }}BipedWalkerCalls Bipeds constructorIf present, must be the first statementThe number / types of parameters passed to super must match parameters of one of the superclasss constructors.Contrle daccs hritageAppel des constructeurs dune super classe

Il est conseillable dajouter toujours un constructeur vide dans les classes et ceci afin dviter des erreurs de compilation en cas d hritagePar exemple lcriture suivante est errone et peut generer l erreur suivante:

public class NewClass { public class NewClass2 extends NewClass { public NewClass(int a)void f1() {{ } System.out.println("hello") void f0()} { } }}

syntax error: cannot find symbol : constructor ...116Contrle daccs hritageAppel des constructeurs dune super classeAlors elle sera juste en ajoutant le constructeur par dfaut NewClass1

public class NewClass1 public class NewClass2 extends NewClass 1{ {

public NewClass() void f1() { { System.out.println("hello") } } } public NewClass1(int a) { } void f0() { }}

117Contrle daccs hritageAppel des constructeurs dune super classeConclusion:

Pour bien faire fonctionner le code en prsence de plusieurs constructeurs dans une hirarchie de classes, essayer toujours de mentionner explicitement le constructeur par dfaut (sans argument) dans lhirarchie.

118Contrle daccs hritageAppel des mthodes de la classe suprieur

public class CharlieChaplin extends Walker{ ... public void nextStep () { turnFeetIn(); super.nextStep(); turnFeetOut(); } ...}WalkerCharlieChaplinCalls Walkers nextStep

super.someMethod refers to someMethod in the nearest class, up the inheritance line, where someMethod is defined.Contrle daccs hritageLes appels super sont frquemment utiliss dans les sous classes dun classe librairie.

public class Canvas extends JPanel{ ... public void paintComponent (Graphics g) { super.paintComponent (g); ... } ... Contrle daccs hritageEn Java toutes les classes tendent par dfaut la classe Object, une classe concrte et non plus abstraite

public class Object{ public String toString {...} public boolean equals (Object other) {... } public int hashCode() { ... }

// a few other methods ...}PolymorphismePolymorphismePolymorphisme vient du grec et signifie "multiforme "Il y a 3 types de polymorphisme en POOPolymorphisme de classePolymorphisme dhritagePolymorphisme paramtrique

Polymorphisme de classeUne donne membre ou une mthode de deux classes diffrentes peuvent avoir le mme nom, et le langage saura faire la diffrence.

class B {public void lire(String chaine_sql) {// fait une requte SQL dans la base}}class A {public void lire(String fichier_texte) {// lit le fichier texte}}Polymorphisme dhritageUne mme donne ou une mme mthode peut tre redfinie dans une classe driveCa sera cette donne ou mthode que lobjet instanci de la classe drive utilisera

Exempleclass Personne {private String prenom;private String nom;public Personne(String prenom, String nom) {this.prenom = prenom;this.nom = nom;}public String info() {return this.prenom + this.nom;}}class Pirate extends Personne {private String bateau;Public Pirate(String prenom, String nom){super(prenom, nom);}public String info() {return "pirate +this.prenom + +this.nom;}}HritageRedfinition Polymorphisme paramtriqueIl permet de dfinir plusieurs constructeurs/mthodes qui diffrent en fonction du type et/ou du nombre dargumentsPolymorphisme paramtriqueclass A {private String nom;public A() {this.nom= JaneDoe}public A(String nom, String prenom) {this.nom= nom;this.prenom;}

}

Polymorphisme Poly. Dhritage: exemple

public void moveAcross (Biped creature, int distance) { creature.firstStep(); while (creature.distanceTraveled () < distance) creature.nextStep(); creature.stop(); } The actual parameter passed to this method can be a Walker, a Hopper, etc. any subclass of Biped.Correct methods will be called automatically for any specific type of creature: Walkers methods for Walker, Hoppers for Hopper, etc.BipedWalkerLes mthodes de la classe Biper sont redfinies dans les sous classesAbstract Mthodes abstraitesUne mthode abstraite ne doit pas avoir dimplmentation

Elle est indique avec le mot-cl abstract.

public abstract int primtre();Classe abstraiteUne classe contenant une ou plusieurs mthodes abstraites doit tre elle-mme dclare abstraiteNe peut tre instancie : cest dire quon ne peut pas crer dobjet bas sur une classe abstraiteNoter quune classe abstraite peut contenir des mthodes avec leur code

abstract class Forme{} public abstract class Biped{ ... public abstract void firstStep(); public abstract void nextStep(); public abstract void stop(); ... public void draw(Graphics g) { ... }}Classe abstraite Elle peut servir de classe de base dautres classes qui la tend (extends)Ces sous-classes devront implmenter toutes les mthodes abstraites de la superclasse Sinon il faut dclarer ces classes abstraitesOn forme alors une hirarchie de classes abstraitesEn utilisant labstraction, un compilateur peut dtecter des erreurs additionnellesElle est utilise de la mme manire dans le PolymorphismeElle peut contenir des constructeurs qui peuvent tre appels par les sous classesPrfrable davoir un constructeur vide

Exemple

Dveloppez lexemple ci-dessus Italic = AbstractInterfaceInterfaceSpcifie quelles mthodes et variables une classe peut implmenter, sans avoir dfinir comment ces mthodes seront gres Non instanciableSeules les signatures des mthodes dune interface sont dclares (pas dimplmentation)Toutes les mthodes de l'interface doivent tre implmentes Les classes peuvent implmenter plus d'une interface en sparant chaque interface par une virgule

InterfaceUne Interface est similaire une classe abstraite mais pas dattributs et de constructeurs, ainsi que toutes ses mthodes sont abstraites par dfaut.Une classe qui implmente une interface doit fournir toutes les mthodes de linterface.

Une Interface peut tre dfinit comme suit:interface InterfaceName { constant definitions method declarations (without implementations) }

Exemples:

Interface

Mais public static final pour les constantes ainsi que public pour les mthodes sont considrs par dfaut, alors lexemple prcdent peut tre crit comme suit:

Interfaceinterface peutAvancer{public void avancer();public void freiner();}interface peutTourner{public void tourneGauche();public void tourneDroite();} Mthodes sans codeInterfacepublic interface Dance{ DanceStep getStep (int i); int getTempo (); int getBeat (int i);} public class Waltz implements Dance{// Methods: public DanceStep getStep (int i) { ... } public int getTempo () { return 750; } public int getBeat (int i) { ... }} Lecriture suivante est possible: Dance d = new Waltz( );InterfaceAlors Le polymorphisme peut tre gr par les interfaces

public interface Edible{ String getFoodGroup(); int getCaloriesPerServing();}public class Breakfast{ private int myTotalCalories = 0; ... public void eat (Edible obj, int servings) { myTotalCalories += obj.getCaloriesPerServing () * servings; } }Polymorphism: the correct method is called for any specific type of Edible, e.g., a Pancakepublic class Pancake implements Edible{ ...}Abstract VS interfaceAucun code nest prsent dans une interfaceUne interface est donc une classe abstraite qui ne contiendrait que des mthodes abstraitesUne classe ne peut driver que dune classe abstraite mais peut implmenter plusieurs interfacesMot cl Final Une mthode ou une classe est finale, si elle est prcde du mot-cl finalElle ne peuvent plus redfinit et hrit respectivement

class BaseClass{public void test() {System.out.println("test() appel ");}final public void moreTesting() {System.out.println("moreTesting() appel");}}class ChildClass extends BaseClass {public void moreTesting() {System.out.println("moreTesting() appel dans Child Class");}}Fatal error: Cannot override final method BaseClass::moreTesting() RedfinitionTd POOEtude de cas 1On souhaite simuler une gestion de location de vhicules.Un vhicule est caractris par un numro d'immatriculation, un kilomtrage, un modle et une marque. (Classe abstraite) Fonction: avancer, reculer, toString.Parmi les vhicules on distingue les vhicules utilitairesles voitures Les motos Client (Caractris par son nom, prnom, date de naissance) qui loue un vhicule et le conduit

UML

Etude de cas 2Modifiez ltude de cas prcdent afin dajouter Lattribut nbPersonnes la classe MotoLattribut nbPortes la classe VoitureLattribut poids la classe UtilitaireLes attributs doivent tre initialiss par le constructeurRedfinissez la mthode toString dans chaque classe afin dafficher les dtails correspondants

Etude de cas 3Ajoutez la classe VoitureDeSport qui tend la classe VoitureUne voiture de sport a deux portes par dfautFaites les modifications ncessaires en fonction du diagramme ci-dessous

Java et les bases de donnes IntroductionEn java, lapi JDBC (Java DataBase Connectivity) permet de grer les connexions une base de donnes.

En ralit, JDBC permet aux programmeurs Java dcrire un code indpendant de la base de donnes et du moyen de connexion utilisJDBC ?Un package (java.sql.*) contenantun ensemble de classes et dinterfaces pour crire des requtes destines aux SGBD (SQL)Il sert a Crer des connexions une base distanteGrer la cration et l'excution de requtes SQLRcuprer et traiter les rsultatsJDBC General Architecture

Interfaces JDBC 8 interfaces :Connection (created from the DriverManager)Statement,CallableStatement, PreparedStatement(created from the connection)ResultSetCreated from the statements

DatabaseMetaData, ResultSetMetaDataDriverInterface OJDBCOraclePreparedStatement, OracleResultSet

Procdure dune connexion une base de donnes 1 - Enregistrer un pilote Pour qu'un driver soit disponible, il faut charger sa classe en mmoire en utilisant:

Class.forName("driverName")Class.forName("oracle.jdbc.driver.OracleDriver");

DriverManager.registerDriver(instance de driver);DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())

1- Enregistrer un pilote(exemples) Access databaseClass.forName(sun.jdbc.odbc.JdbcOdbcDriver");

Microsoft SQL ServerClass.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver");

MysqlClass.forName(com.mysql.jdbc.Driver");

2 Etablir une connexionOn utilise la mthode getConnection() de DriverManager3 arguments :lURL de la base de donnesle nom de lutilisateur de la baseson mot de passeConnection conn = DriverManager.getConnection(url, user, password);2 Etablir une connexionle DriverManager essaye tous les drivers enregistrs (chargs en mmoire avec Class.forName()) jusqu ce quil trouve un driver qui lui fournisse une connexion

Le chemin de la base depend de la base en questionURL="jdbc:oracle:thin:@computer_name:1521:oracleinstance

2 Etablir une connexionMS Access String chemin= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ= c:\\XmlDB ";

Microsoft SQL ServerString chemin= "jdbc:sqlserver://Computername;" +databaseName=DBname;user=usename;password=passname";

MysqlString chemin= "jdbc:mysql://Computername:port/dbname";

3- Creation dun Statement Statement: permet dexcuter des requtes SQL3 types de Statement :Statement : requtes statiques simplesPreparedStatement : requtes dynamiques prcompiles (avec paramtres dentre/sortie)CallableStatement : procdures stockes3- Creation dun Statement La cration dun statement seffectue a partir de linstance de connexion dj cre Statement req1 = conn.createStatement();

PreparedStatement req2 = conn.prepareStatement(str);

CallableStatement req3 = conn.prepareCall(str);Str est une requte SQL4- Execution de la requte 3 types dexcution pour le statementConsultation (requtes de type SELECT)executeQuery() : retourne un ResultSet (n-uplets rsultants)Modification (requtes de type INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE)executeUpdate() : retourne un entier (nombre de n-uplets traits)Excuter des requtes qlq, procdures stockes, retour de plusieurs ensemble de rsultats (plusieurs ResultSet)execute()

5 - Traiter le rsultat ResultSet de executeQuery()executeQuery() renvoie une instance de ResultSet qui permet daccder aux champs des n-uplets slectionnsseules les donnes demandes sont transfres en mmoire par le driver JDBCil faut donc les lire "manuellement" et les stocker dans des variables pour un usage ultrieurExemplepublic void connect (String host, String user, String pass){//enregistrer le pilote DriverManager.registerDriver(new oracle.jdbc.OracleDriver());//creer la connexionConnection conn = DriverManager.getConnection("jdbc:oracle:thin:@ " +host +" :1521:nomdb", user, pass);//creer un StatementStatement stmt = conn.createStatement();//execution de la requete ResultSet res = stmt.executeQuery(Select nom, prenom from user);}5 - Traiter le rsultat Mthode next() de ResultSetretourne false si dernier tuple lu, true sinonun appel fait avancer le curseur sur le tuple suivantau dpart, le curseur est positionn avant le premier tupleexcuter next() au moins une fois pour avoir le premier5 - Traiter le rsultat Ou encore on peut parcourir le ResultSet davant en arrire :next() vs. previous()en dplacement absolu : aller la n-ime ligneabsolute(int row), first(), last(), ...en dplacement relatif : aller la n-ime ligne partir de la position courante du curseur, relative(int row), afterLast(), beforeFirst(), ...Pour utiliser absolute et relative il faut que le resultset soit ResultSet.TYPE_SCROLL_SENSITIVE 167Exemple {//enregistrer le pilote DriverManager.registerDriver(new oracle.jdbc.OracleDriver());//creer la connexionConnection conn = DriverManager.getConnection("jdbc:oracle:thin:@ " +host +" :1521:nomdb", user, pass);//creer un StatementStatement stmt = conn.createStatement();//execution de la requete ResultSet res = stmt.executeQuery(Select nom, prenom from user);while (res.next()){System.out.println(res.getString(1)+ +res.getString(2));}}Type SQL vs. Type JavaLe driver JDBC traduit le type JDBC retourn par le SGBD en un type Java correspondantle XXX de getXXX() est le nom du type Java correspondant au type JDBC attenduchaque driver a des correspondances entre les types SQL du SGBD et les types JDBCType SQL vs. Type JavaType BDDType JavaNUMERIC, DECIMALgetBigDecimal()TINYINTgetByte()DATEgetDate()REALgetFloat()INTEGERgetInt()DOUBLE, FLOATgetDouble()TIMEgetTime()CHAR, VARCHARgetString()171Exemple Scrollable Result SetPour utiliser absolute et relative il faut que le resultset soit ResultSet.TYPE_SCROLL_SENSITIVE :

Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

String query = select students from class where type=not sleeping ;ResultSet rs = stmt.executeQuery( query );rs.previous(); / / go back in the RS (not possible in JDBC 1) rs.relative(-5); / / go 5 records backrs.relative(7); / / go 7 records forwardrs.absolute(100); / / go to 100th record

Exemple Updatable ResultSetStatement stmt =con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);String query = " select students, grade from class where type=really listening this presentation ;ResultSet rs = stmt.executeQuery( query );while ( rs.next() ){int grade = rs.getInt(grade);rs.updateInt(grade, grade+10);rs.updateRow();}

172Exemple Delete/Update using Statement173Statement stmt = conn.createStatement();String deleteStr = "DELETE FROM Member " +"WHERE Lower(Name) = 'harry potter'";int delnum = stmt.executeUpdate(deleteStr);

String createLehigh = "Create table Lehigh " + "(SSN Integer not null, Name VARCHAR2(32), " + "Marks Integer)";stmt.executeUpdate(createLehigh);String insertLehigh = "Insert into Lehigh values +"(123456789,abc,100)";stmt.executeUpdate(insertLehigh);6 Fermeture de la connexionresultset.close()statement.close()conn.close();

Encore Les requtes prpares La mthode prepareStatement() de lobjet Connection cre un PreparedStatement :PreparedStatement ps = conn.prepareStatement("SELECT * FROM Clients WHERE name = ? ");les paramtres sont spcifis par un "?"ils sont ensuite instancis par les mthodes setInt(), setString(), setDate()ces mthodes ncessitent 2 arguments (setInt(n, valeur))le premier (int) indique le numro relatif de largument dans la requtele second indique la valeur positionnersetNull(n,type) positionne le paramtre NULL (SQL)Exemple PreparedStatementPreparedStatement ps = conn.prepareStatement(Select uid from user where username = ? and password = ?");ps.setString(1, user);ps.setString(2, pass);ResultSet res = ps.executeQuery();}Variable locale Variable locale Exemple PreparedStatementString queryStr = "SELECT * FROM Items " +"WHERE Name = ? and Cost < ?";

PreparedStatement pstmt = conn.prepareStatement(queryStr);

pstmt.setString(1, "t-shirt");pstmt.setInt(2, 1000);

ResultSet rs = pstmt.executeQuery();

Exemple PreparedStatementString deleteStr = DELETE FROM Items " +"WHERE Name = ? and Cost > ?";

PreparedStatement pstmt = conn.prepareStatement(deleteStr);

pstmt.setString(1, "t-shirt");pstmt.setInt(2, 1000);

int delnum = pstmt.executeUpdate();179Exemple PreparedStatementAre these the same? What do they do? String val = "abc";PreparedStatement pstmt = conn.prepareStatement("select * from R where A=?");pstmt.setString(1, val);ResultSet rs = pstmt.executeQuery();String val = "abc";Statement stmt = conn.createStatement( );ResultSet rs = stmt.executeQuery("select * from R where A=" + val);179Exercice Dveloppez un module dauthentification qui permet dauthentifier des utilisateurs. A noter que les informations des utilisateurs sont stockes dans une table users dans la base de donnes oracle

Java et les THREADS IntroductionEn java, il est possible de simuler l'excution de plusieurs taches dans un mme programme en mme temps . C'est le multithreading. L'excution de chaque tache est alors appel un thread.ThreadUn thread nest pas un vrai objet

Un thread est un flot de contrle

Un thread est une srie dinstructions excuterCreation des Threads En Java, il existe deux mthodes pour crer des threads.

Etendre la classe Thread Implmenter linterface Runnable

Etendre la classe Threadpublic class MonThread extends Thread {public void run () {// ici se trouve la description// du comportement du thread}public static void main ( String [] args ) {MonThread t1 = new MonThread ();t1. start ();}A base class with maximum threading functionality.It is far more powerful than the Runnable interface

185Implementer linterface Runnablepublic class Tache implements Runnable {public void run () {// ici se trouve la description// du comportement du thread}public static void main ( String [] args ) {// on cre une tache pour un thread :Tache job = new Tache ();//Runnable job=new Tache();Thread t1 = new Thread (job ); :t1. start ();}When running the Runnable object, a Thread object is created from the Runnable object

Enables any given class (that can also inherit from another class)to operate as a thread without the need to inherit from the thread class(just run a thread into this class, no more thread functionality inherited from the Thread class)186Les mthodes dun Thread void start()Dmarre le thread appelle la mthode run() du thread Elle est appele une seule fois void run()Contient les taches excuter par le thread void stop() Arrte le ThreadA ne pas utiliser Il suffit darrter le thread manuellement Par code (sortir de la fonction run())Utilisation de la mthode interrupt();

Exemple public static void main ( String [ ] args ) { // tape 1Runnable r = new MaTache ();Thread t = new Thread (r);t. start (); // tape 2 : une nouvelle pile est creChat c = new Chat ();c.start();}

Les mthodes dun Thread void yield()Permet larrt momentan du thread et sa re-jointure la queueLe/Les thread/s qui sont dans la queue et de mme priorit seront excuts void sleep(int m) ou sleep(int m, int n)Fais endormir le thread

Calling sleep(t) causes the thread to suspend itself for at least t milliseconds. Calling yield() causes the thread to rejoin the ready queue. 189Exemple yield()class YieldThread extends Thread {public void run() {for ( int count = 0; count < 4; count++) {System.out.println( count + "From: " + getName() );yield();}}}class TestYield {public static void main( String[] args ) {YieldThread first = new YieldThread();YieldThread second = new YieldThread();first.start();second.start();System.out.println( "End" );}}End0From: Thread-00From: Thread-11From: Thread-01From: Thread-12From: Thread-02From: Thread-13From: Thread-03From: Thread-1Rsultat Le thread est nouveau. L'objet est cr mais il n'y a pas encore de file d'excution.Thread t = new Thread (r);Le thread est excutable. Quand vous lancez le thread, une pile est cre. Le thread attend dans la file pour que la JVM le choisisse afin de s'excuter.t. start () ;le thread est en cours d'excution. C'est le thread qui s'excute, le seul. C'est l'ordonnanceur de la JVM qui dcide quel thread va s'excuter un moment donn. Quand un thread s'excute les autres sont en attente. A tout moment l'ordonnanceur peut arrter l'excution du thread (il retourne alors dans l'tat Active) et en choisir un autre. Cycle de vie dun thread Cycle de vie dun thread BornBlockedRunnableDeadStop/Interrupt()start()Active in the queueblock on I/OI/O availableJVMsleep(500)wake upsuspend()resume()waitnotifyWaiting for a monitorAcquire monitornewStop/Interrupt()Quel est le resultat de ce programme ? public class MaTache implements Runnable {public void run () { for ( int i = 0; i < 30; i++) {String nom = Thread . currentThread (). getName ();System .out. println (nom + "est en cours d'excution ");}}public static void main ( String [] args ) {Runnable tache = new MaTache ();Thread a = new Thread ( tache );a. setName (" Caroline ");Thread b = new Thread ( tache );b. setName (" Cedric ");System.out.println("wawawawa");a. start ();b. start ();System.out.println("laaaaaaaa");}}Cedric est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Problme daccs concurrent les Threads partagent les mmes ressources (mmoire, cran, les attributs et mthodes dun mme object partag, etc.)Dans certaines situations, il est ncessaire dobtenir un rsultat cohrentExemple Garantir des oprations de dbits et crdits synchronises qui peuvent tre interprtes, par des oprations de lectures, comme cohrentes tout instantTransaction bancaireReservation billets davionDans certaines situations, il est ncessaire de bloquer l accs concurrent un mme attribut ou mthodeCas o deux thread traitent un mme objet

Problme daccs concurrent Lutilisation des Threads implique de nombreux problmes !Accs concurrent certains conteneurs de donnes (et leurs modifications) !Protection de certaines sections pour viter des interblocagesPar exemple lorsque deux threads essayent de verrouiller alternativement deux fonctions synchronises de deux instances diffrentes dun mme classeSynchronizationUne solution pour rsoudre laccs concurrent

Attention aux mthodes statiques qui sont associes aux classes. Synchroniser de telles mthodes revient a bloquer l'accs toute la classesynchronized public void maMethode {// Cette mthode ne peut tre excute de manire concurrente...}198Les critures suivantes sont Equivalentespublic synchronized void a() { // some code }

public void a() {synchronized (this) { // some code }}

Synchronizationpublic class MaTache implements Runnable {public void run () {synchronized (this){ for ( int i = 0; i < 30; i++) { String nom = Thread . currentThread (). getName (); System .out. println (nom + "est en cours d'excution "); }}}Resultat Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Caroline est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Cedric est en cours d'excution Les methodes wait() et notify()wait()Sexcute dans un bloc synchronizedMet le thread en excution en attente(bloquee) jusqu ce quun autre thread cre sur le mme objet excute la mthode notify() ou notifyAll() Libre le monitor de lobjet/fonction courant(e)Wait est similaire yield sauf que wait attend l excution de notify pour remettre le thread dans la queue, l ordonnanceur le choisit, et le thread essaye dacqurir le monitor pour verrouiller lobjet/la fonction.public class CubbyHole { private int contents; private boolean available = false; public synchronized void get() { if (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false;System.out.println( consume " + contents); notifyAll(); } public synchronized void put(int value) { if (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; System.out.println( produce: " + contents); notifyAll(); }}ApplicationsExemple 1PrintThread1 a = new PrintThread1("*");PrintThread1 b = new PrintThread1("-");a.start();b.start();

ApplicationsExemple 1 suite

class PrintThread1 extends Thread { String name; public PrintThread1(String name) { this.name = name; } public void run() { for (int i=1; i