Title: Java : Programmation Objet en Java et Initialisation et Hritage, Exception, Collection, Thread et Sw
1Java Programmation Objet en Java et
Initialisation et Héritage, Exception,
Collection, Thread et Swing
- Les outils de bases pour le cours programmation
avancée
2Présentation du cours
- Des techniques de programmation
- Design pattern
- Motifs de conception
- Utilisation des outils vu précédemment
- Réflexivité et chargement dynamique
- RTTI
- JavaBean en illustration
- à utiliser comme des outils à réutiliser
3Organisation des cours
- Intervenant
- Michel Buffa
- Philippe Renevier
- Volume horaire
- 18h de cours
- 33h de TD
- Le mardi
- Un projet et une soutenance orale individuelle
4Programmation Objet en Java et Initialisation et
Héritage
5Constructeur par défaut
- sans argument
- ajouter par le compilateur sil ny a pas de
constructeur - // DefaultConstructor.java
- class MyObj
- int i 0
-
-
- public class DefaultConstructor
- public static void main(String args)
- MyObj nc new MyObj () // Default!
- nc.i 4
-
- ///
6Constructeur par défaut
- Par contre, il nest pas ajouter sil existe déjà
un constructeur (avec ou sans argument) - class MyObj
- int i0
- MyObj (int j) i j
-
- DefaultConstructor.java10 cannot find symbol
- symbol constructor MyObj()
- location class MyObj
- MyObj obj new MyObj()
-
- 1 error
7Surchage et signature
- Signature nom paramètre(s)
- la différence entre deux méthodes impossible sur
le type de retour - Adaptation des types de paramètres
- cf Surcharge.java
- Nombre de paramètre non déterminé
- void printList (Integer args)
-
- for(Integer x args) System.out.println(x "
" )
8Mot clef this
- Référence à lobjet
- public class Incr
- int i 0
- Incr increment()
- i
- return this
- void print()
- System.out.println("i " i)
- public static void main(String args)
- Incr x new Incr ()
- x.increment().increment().increment().print()
-
- Permet aussi dappeler dautres constructeurs
- public Incr() this(0)
- public Incr(int i) this.i i
9Mot clef static
- Variable statique
- static Interger i static Double j
- Bloc statique
- static
- static i new Integer(10) j new
Double(14.5) - note idem pour les non static Interger i
Double j i new Integer(10) j new
Double(14.5) - Méthode statique
- Pas dappel à des éléments non statiques
(linverse est possible) - Par définition, une méthode statique peut être
appelée via la classe, sans aucune référence à un
objet.
10Initialisation
- Dans une méthode
- void f()
- int i
- i // Error -- i not initialized
- Champs de classe
- Ordre important
- int i f() int j g(i) // i initialisé
avant - int j g(i) int i f() // illegal forward
reference
11Initialisation dun objet
- Dabord les champs de classes
- puis le constructeur
- Cf Init.java
12Initialisation des classes et des champs
statiques
- La 1ère fois quun constructeur dune classe X
est appelé (cest une méthode statique)ou la 1ère
fois quune méthode statique (ou un champ de
classe) est appelée ou que la classe est
utilisée, linterpréteur java doit charger la
classe X (elle doit être dans le classpath). - La classe X est chargée, les éléments statiques
sont alors initialisés (intialisation statique) - Puis cest le schéma classique vu ci-dessus en
cas de création dobjet - Cf Init2.java
- Ordre dinitialisation
13Initialisation des tableaux
- Réservation dune place en mémoire
- String s new String4
- int t3 new int2345
- int t4 new int36
- Mais besoin dinitialiser chaque élément
- s0 new String(message)
- Initialisation rapide
- int t 1, 2, 3
- int t2 1, 2, 3, 1, 2, 3, 1, 2, 3,
1, 2, 3
14Effacer des objets
- Garbage Collector
- libérer la mémoire.
- Les objets peuvent ne pas être collectés.
- GC nest pas la destruction.
- GC ne soccupe que de la mémoire.
- Problème allocation de mémoire sans new (jni et
appel dune dll) ou dune ressource particulière
(un périphérique). Comment faire ? - Pour le reste finalize( )
- protected void finalize( ) throws Throwable
- Appeler par le GC quand la jmv détermine quil
ny a plus de reference sur lobjet. - Lobjectif est de libérer des ressources
particulières, de fermer des connexions. - En cas dexception non traîtée, elle est ignorée.
- finalize nest appelé quune seule fois et peut
ne pas être appelé - Cf TestGC.java
- Comment peut marcher un GC ?
- lent un compteur de référence (quand référence
mise à null). Problème, référence circulaire. - A partir de la pile et des ref static, on
explore tout. On trouve tout ce qui vit et on
recopie le contexte dexécution. Le reste est
tout simplement oublié .
15Regrouper les classes package
- Lunité de base dune librairie est le package.
- Mot clef import.
- import javax.swing.
- import java.awt.Color
- Import javax.swing.event.MouseInputListener
- mettre les classes dans une hiérarchie de
répertoire correspondante. - Attention à ne pas prendre de nom système
16Collision de nom
- package java.awt
- public class Button
- public Button(String nom) System.out.println("m
on bouton "nom) - public void coucou( ) System.out.println("mon
bouton fait coucou") -
- import java.awt.Button
- public class test4
- public static void main(String args)
-
- Button b new Button("toto")
- System.out.println(b.getClass())
- b.coucou()
-
-
- exécution
- gtjava test4
17Collision de nom (nom de package différent)
- Même exemple que ci-dessus mais dans un nom de
package différent (package my) pour la classe
Button - gtjavac test5.java
- gttest5.java2 java.awt.Button is already defined
in a single-type import - gtimport my.Button
- gt
- gt1 error
- Nécessité dêtre explicite (java.awt.Button ou
my.Button)
18Accès
- public
- default package (pas de marqueur)
- Accès public en local
- besoin du . dans le classpath
- protected
- donne le default package
- héritage
- private
- Cf Private.java
- constructeur contrôle la fabrication
- class Exemple
- private Exemple()
- static Exemple faireUnExemple() return new
Exemple()
19Héritage et composition
- Héritage
- extends ou implements
- relation est-un
- mot-clef super accès à la superclass
- Composition (et délégation)
- champ de classe
- assemblage liens sémantiques
- réutilisation
- non vérification de la relation est-un
20Héritage et Initialisation
- Initialisation commence par la classe dont on
hérite - class Art Art( ) System.out.println("Art
constructor") - class Drawing extends Art Drawing( )
System.out.println("Drawing constructor") - public class Cartoon extends Drawing
- public Cartoon() System.out.println("Cartoo
n constructor") - public static void main(String args)
Cartoon x new Cartoon() - gt"Art constructor",
- gt"Drawing constructor",
- gt "Cartoon constructor
- Et les champs ? cf Heritage.java
- Compilation javac Heritage/Heritage.java
- Exécution java Heritage.Heritage
21Héritage et Initialisation
- attention à ne pas utiliser quelque chose qui
n'est pas encore initialisé. - PolyConstructors.java
- Note sur lhéritage de méthode
- Si une méthode retourne un objet dune classe X,
une surcharge peut retourner un objet de classe Y
si Y hérite de X
22Héritage
- Mot clef super
- constructeur de la classe dont on hérite
- appel aux méthodes et champs de la classe dont on
hérite - Mot clef final
- Grosso modo cela ne changera pas.
- Raison conception ou efficacité
- Une constante dont la valeur est fixée
- à la compilation (compile-time).
- à lexécution (run-time)
- Initialisation dans la déclaration (new
Randow(40)).nexInt(20) - initialisation dans le constructeur (avant
utilisation !).
23Les méthodes finales
- final argument il ne sera pas modifié.
- class Toto public void spin()
- public class FinalArguments void with(final
Toto g) - //! g new Toto() // Illegal -- g is final
-
- void without( Toto g) g new Toto() //
OK -- g not final - g.spin()
-
- Final methods
- Raison de conception interdit la surchage avec
lhéritage. - Raison defficacité
- Le compilateur peut changer les appels à cette
méthode à des appels en ligne (i.e. comme du
code tapé à lendroit de lappel). - Le compilateur peut écarter lapproche normale
(appel de fonction, avec changement de contexte
dexécution) par linsertion du code à la place
de lappel. - Gain pas de changement de contexte, mais le
code peut grossir très vite - Le compilateur java est censé détecté les
situations où la recopie est trop importante - Toute méthode privée est implicitement finale
- Pas dhéritage (pas daccès) mais pas forcément
derreur de compilation (Private.java) - lajout de final ne change rien (juste explicite)
24Les classes finales
- Une classe finale ne sera jamais déclinée
- Les champs dune classe finale sont à la
discrétion du concepteur (finaux ou non). - Les méthodes dune classe finale sont
implicitement finales - De toutes façons non surchargeables
- Lajout du mot clef final ne change rien
25Classes abstraites
- Permettent de partager du code tout en forçant la
personnalisation - Une classe abstraite les méthodes ne le sont
pas forcément - Une méthode abstraite la classe doit lêtre
- Cf. ClasseAbs.java
- enum
26Inner Class
- Des classes internes et anonymes
27Inner Class
- Définition
- Dans une classe
- Dans une méthode, entre
- En paramètre (anonyme)
- Observable
- ClassePrincipe.class
- ClassePrincipe1NomInterne.class
- ClassePrincipe2.class
28Inner Class pourquoi ?
- Outil supplémentaire
- Héritage supplémentaire (sans être un objet du
type) - Masquage de limplémentation (y compris au
package) - Définition de callback à la volée
- Utile pour la programmation événementielle
29Lien entre linner dans une classe et louter
- Linner a accès aux éléments de la classe qui
linclus - Accès à linstance de la classe avec
ltNomDeClassegt.this - Création dune instance dune inner classe
- ltInstance de NomDeClassegt.new ltInnergt( )
- Ex Bebete.Etat result bebete.new Etat()
- Bebete est une classe contenant une classe
interne Etat bebete est une instance de la
classe Bebete
30Inner dans un bloc dinstruction
- Ne peuvent pas être utiliser en dehors de la
méthode - Utile pour personnaliser des objets sans créer de
classe (masquer limplémentation). - Cf. InnerMeth.java
31Anonymous inner class
- Une classe sans nom, définit par un new
ltNomDeClassegt() ltdu codegt - On peut ainsi étendre nimporte classe
classe, interface ou classe abstraite - Si on a besoin dune référence extérieure, il
faut que lélément soit final
32Les exceptions
33Un mécanisme derreur
- Une exception classe Exception est un objet qui
implémente de Throwable méthode printStackTrace(
) par exemple - Se construit généralement avec un message
(String) - Quelques mots clefs
- throws (la méthode peut lever une ou plusieurs
exception) - throw (lever une exception)
34Gestion des erreurs
- Par propagation la méthode throws les
exceptions quelle peut provoquer - Par attrapage
- Mot clef try catch (ltExceptiongt e) finally
- Plusieurs catch possibles (voir aucun)
- finally en principe toujours exécuté
- Attention, une seule exception est prise en
compte, la dernière cf LostException.java (TIJ 3)
35Les collections
- Comment ranger ses objets
- package java.util
36Une vue densemble
Queue
PriotityQueue
Boites en pointillées interface
Illustration tirée de TIJ 3
37organiser des objets le tableau
- Indexation numérique dobjets
- Type prédéterminé (pas de cast si le type nest
pas générique) - Plusieurs dimension
- Type primitif
- Taille fixée à la création
38organiser des objets la collection
- Une collection contient des éléments isolés, une
map des couples - Avec les génériques, il est possible de spécifier
le type des objets contenus - Pas derreur de remplissage
- Pas de cast pour utilisation
- Adaptation de la taille
- Pas de type primitif, mais adaptation automatique
avec les classes contenantes
39Parcours iterator ou for
- Iterator interface comme point commun entre les
contenants (le type de contenant peut ne pas
importer). - Chaque contenant a la méthode iterator( ).
- Objet suivant next( ).
- test de fin hasNext( ).
- For
- CollectionltString gt postit new
LinkedListltStringgt( ) -
- for(String s postit) System.out.println(s)
40Collection
- boolean add(T)
- Ensures that the container holds the argument.
Returns false if it doesnt add the argument.
(Optional.) - boolean addAll(Collectionlt? Extends Tgt)
- Adds all the elements in the argument. Returns
true if any elements were added. (Optional.) - void clear( )
- Removes all the elements in the container.
(Optional.) - boolean contains(T)
- true if the container holds the argument.
- boolean containsAll(Collectionlt?gt)
- true if the container holds all the elements in
the argument. - boolean isEmpty( )
- true if the container has no elements.
- IteratorltTgt iterator( )
- Returns an Iterator that you can use to move
through the elements in the container. - boolean remove(Object)
- If the argument is in the container, one instance
of that element is removed. Returns true if a
removal occurred. (Optional.) - boolean removeAll(Collectionlt?gt))
- Removes all the elements that are contained in
the argument. Returns true if any removals
occurred. (Optional.) - boolean retainAll(Collectionlt?gt))
41List
- avec ordre d'insertion.
- Add(i, obj) ajout où on veut.
- ArrayList
- Rapide daccès
- Long à lajout et au retrait
- LinkedList
- Comportement de queue et pile
- Insertion et retrait rapide
42Set
- Chaque élément nest ajouté quune seule fois
- Chaque élément doit implémenter equals pour
comparaison - Pas de garantie dordre
- HashSet recherche rapide (utilisation de
hashCode( ) ) - TreeSet conservation de lordre (arbre)
- LinkedHashSet ordre inverse
43Map
- Association (clef, valeur)
- Temps daccès constant (table de hachage)
- MapltK, Vgt
- void clear( )
- Removes all mappings from this map (optional
operation). - boolean containsKey(Object key)
- Returns true if this map contains a mapping for
the specified key. - boolean containsValue(Object value)
- Returns true if this map maps one or more keys to
the specified value. - V get(Object key)
- Returns the value to which this map maps the
specified key. - boolean isEmpty()
- Returns true if this map contains no key-value
mappings. - SetltKgt keySet()
- Returns a set view of the keys contained in this
map. - V put(K key, V value)
- Associates the specified value with the specified
key in this map (optional operation). - void putAll(Maplt? extends K,? extends Vgt t)
- Copies all of the mappings from the specified map
to this map (optional operation).
44Les processus
- Utilisation des Thread et accès synchronisé
45Pourquoi des processus ?
- Pour être plus rapide
- Pour ne pas bloquer un processus (interface).
46Processus Basic
- Utilisation de linterface Runnable
- Méthode public void run( )
- Utilisation de Thread
- new Thread(ltune instance Runnablegt)
- Cf Processus.MainThread (TIJ 4)
- Méthode start( ) qui lance le processus
- Méthode yield( ) pour passer la main (via le
scheduler)
47Arrêter un processus
- Java recommande lutilisation de boolean pour les
processus long - public void run( )
- // code
- while( ! canceled)
- // code
-
- // code
-
48Attendre
- import java.util.concurrent.
- public void run()
- try
- while(! canceled)
- // Old-style
- // Thread.sleep(100)
- // Java SE5/6-style
- TimeUnit.MILLISECONDS.sleep(100)
-
- catch(InterruptedException e)
- System.err.println("Interrupted")
-
-
49Gérer des processus
- Java.util.concurrent.Executors
- Un cadre pour gérer les processus
- Génère des ExecutorService
- Sait comment gérer les tâches
- Auquel on soumet des tâches (objets Runnable)
- Cf CachedThreadPool.java (TIJ 4)
- Méthode execute (interface Executor)
- Méthode shutdown( ) (interface ExecutorService)
ferme les inscriptions
50Les différents types de gestion de processus
- CachedThreadPool
- Un processus par tâche
- FixedThreadPool(i)
- Un maximum de i processus
- SingleThreadExecutor
- Un seul processus pour toutes les tâches
51Des processus avec des valeurs de retours
- Interface java.util.concurrent.Callable
- Paramétrable avec le type de retour
- Méthode public V call( )
- Fait intervenir des FutureltVgt
- Cf CallableDemo.java (inspiré de TIJ 4)
- Méthode submit qui produit un Future
- Accessible quand isDone( )
- Par la méthode get( )
52Partage de ressource
- Problème daccès concurrent
- Mot clef synchronized
- Sur une méthode
- ou un morceau de code
- Lorsquun processus veut exécuter un code
syncronisé - La jvm vérifie si le verrou est disponible,
- Lui donne et
- Le rend disponible à la fin
- Un seul verrou par classe
- Possibilité dutiliser dautre verrous
- java.util.concurrent.locks.
- Interface Lock lock( ) et unlock( )
53La boîte à outils graphiques
54java.awt et javax.swing
- awt 1ère boite à outil de java
- Éléments de base
- Component (et Graphics)
- Container
- Layout (LayoutManager)
- swing extension (dabord JFC puis intégrer
depuis jdk 1.2) - swing faire que tout fonctionne de manière
identique partout
55Component
- Définit un élément graphique
- Une Dimension
- getSize retourne une Dimension
- setSize avec une Dimension ou deux entiers
- Une position
- getLocation retourne un Point
- setLocation avec un Point ou deux entiers
- Coordonnées
- Origine au coin supérieur gauche
- x (width) vers la droite et y (height) vers le
bas - Méthode public void paint(Graphics g)
56Graphics
- Contexte graphique ( morceau décran )
- Permet de dessiner
- Changer de crayon setColor
- drawRect, drawOval, drawPolygon, drawString,
fillRect, fillOval - drawImage(img, x, y, ImageObserver)
- Obtenu automatiquement (repaint(),
redimensionnement, etc.)
57Double-buffering en AWT
- java.awt.image.BufferedImage
- buffImg new BufferedImage(width, height, type)
- type BufferedImage.TYPE_4BYTE_ABGR par exemple
- Dans paint(Graphics g)
- Graphics grph buffImg.createGraphics()
- // on dessine dans grph
- g.drawImage(buffImg, 0, 0, null)
58Container
- Hérite de Component
- Porte dautres Component (y compris des
Container) - Organisation
- LayoutManager
- add / remove dun Component
- Unicité de lieu
- Indice des components
59LayoutManager
- Définit lorganisation
- Basé sur PreferredSize ou une maximisation de
lélément - BorderLayout
- par défaut dans une fenêtre
- ajout en précisant la zone
- add("North" , comp)
- FlowLayout en ligne
- GridLayout en tableau
- GridBagLayout avec des contraintes
- etc.
60Méthodes à connaître
- repaint() !
- setEnabled(true / false) activé / désactivé
- (Rectangle) getBounds / setBounds(x,y, w, h)
positionne et dimensionne - getWidth() largeur / getHeight() hauteur
- getX() et getY() obtenir une coordonnée
- setVisible(true / false)
- getBackground et setBackground objet Color,
définition RGB
61JComponent
- Hérite de Container
- Méthodes de commodité
- setPreferredSize
- setDoubleBuffered(true/false) /
isDoubleBuffered() - setOpaque(true / false)
- Dessin à lécran paint appel
- paintComponent
- paintBorder
- paintChildren
62Petites listes des JComponents
- les boutons
- JButton /JToggleButton / JCheckBox / JRadioButton
- java.awt.ButtonGroup (méthode add)
- Les îcones javax.swing.ImageIcon créer avec le
nom dun fichier image par exemple - Les champs textuels
- JTextField/ JTextArea
- Menus les JMenuBar, JMenu, JMenuItem
- Etc
- http//java.sun.com/docs/books/tutorial/uiswing/
63JFrame
- Nest pas un JComponent
- Pour ajouter getContentPane().add
- Ne pas oublier le setVisible(true)
- Méthode pack permet de calculer la taille de la
fenêtre adéquate
64Événements (1/2)
- Chaque élément graphique subit des événements
- Principe du CallBack
- Interface pour lécouteur
- add et remove pour lécouté
- Appel aux écouteurs par lécouté lorsque
lévénement se produit - Parcours des composants à lécran du dessus vers
le dessous) jusquau premier écoutable
65Événements (2/2)
- processEvent transmettre un événement
- Même processus que pour laffichage
- Les objets Event
- package java.awt.event et javax.swing.event
- getSource() savoir doù il vient
- Spécialisés MouseEvent, ActionEvent, etc.