Académique Documents
Professionnel Documents
Culture Documents
cours de Java
ENSERB informatique
Sommaire
Avertissement : Le prsent cours fait rfrence la version 1.2 de Java, aussi appel Java 2. Sommaire _______________________________________________________________________________ 1 Sommaire _______________________________________________________________________________ 2 Chapitre 1 Les bases du langage Java _______________________________________________________ 5 Les donnes ___________________________________________________________________________ Les primitives ________________________________________________________________________ Table des primitives _____________________________________________________________ Portabilit _____________________________________________________________________ Initialisation des primitives ________________________________________________________ Les valeurs littrales _____________________________________________________________ Casting sur les primitives _________________________________________________________ Les constantes ________________________________________________________________________ Les handles __________________________________________________________________________ final __________________________________________________________________________ Les chanes de caractres _______________________________________________________________ Les tableaux _________________________________________________________________________ Dclaration ____________________________________________________________________ Initialisation ___________________________________________________________________ Les vecteurs _________________________________________________________________________ Les collections________________________________________________________________________ Les itrareurs_________________________________________________________________________ Les comparateurs _____________________________________________________________________ 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7
Les oprateurs _________________________________________________________________________ 7 Description des principaux oprateurs _____________________________________________________ 8 Oprateur daffectation ___________________________________________________________ 8 Oprateurs arithmtiques deux oprandes ___________________________________________ 8 Oprateurs un oprande _________________________________________________________ 8 Oprateurs relationnels ___________________________________________________________ 8 Mthode equals _________________________________________________________________ 9 Oprateurs logiques______________________________________________________________ 9 Oprateurs darithmtique binaire___________________________________________________ 9 Loprateur trois oprandes ______________________________________________________ 9 Oprateurs de casting ___________________________________________________________ 10 new _______________________________________________________________________________ 10 instanceof __________________________________________________________________________ 10 Loprateur + pour String ______________________________________________________________ 10 Priorit des oprateurs_________________________________________________________________ 10 Les structures de contrle ______________________________________________________________ 10 Mots cls_____________________________________________________________________________ static ________________________________________________________________________ final _________________________________________________________________________ synchronized __________________________________________________________________ native________________________________________________________________________ transient _____________________________________________________________________ volatile_______________________________________________________________________ abstract ______________________________________________________________________ 11 11 11 12 12 12 12 12
Chapitre 2 Concepts de base de la programmation oriente objet_________________________________ 13 Introduction__________________________________________________________________________ 13 Tout est objet ! ___________________________________________________________________ 13 Illustration des concepts de classe et dobjet________________________________________________ 13 Les classes ___________________________________________________________________________ 14
Page 2 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Dfinition __________________________________________________________________________ Les classes final _____________________________________________________________________ Les classes internes ___________________________________________________________________ Plusieurs classes dans un mme fichier______________________________________________ Les classes imbriques ou static ___________________________________________________ Les classes membres ____________________________________________________________ Les classes locales______________________________________________________________ Les classes anonymes ___________________________________________________________ Les champs __________________________________________________________________________ Dfinition __________________________________________________________________________ Variables dinstances & Variables static __________________________________________________ Les variables final ____________________________________________________________________ Les mthodes _________________________________________________________________________ Les retours__________________________________________________________________________ Les mthodes dinstances ______________________________________________________________ Les mthodes static ___________________________________________________________________ Les mthodes native __________________________________________________________________ Les mthodes final ___________________________________________________________________ Les constructeurs _____________________________________________________________________ Les constructeurs : cration dobjets______________________________________________________ Les constructeurs (constructor)____________________________________________________ Exemple de constructeurs ________________________________________________________ Cration dobjets (object) ________________________________________________________ Surcharger les constructeurs ______________________________________________________ Autorisation daccs aux constructeurs ______________________________________________ Initialisation des objets ________________________________________________________________ Les initialiseurs de variables dinstances et statiques ___________________________________ Les initialiseurs dinstances ______________________________________________________ Les initialiseurs statiques ________________________________________________________ Les variables final non initialises _________________________________________________ Les finaliseurs _______________________________________________________________________ La destruction des objets (garbage collector)_______________________________________________ Le concept de lhritage ________________________________________________________________ Hirarchie des classes _________________________________________________________________ Extends ______________________________________________________________________ Rfrence la classe parente______________________________________________________ Redfinition des champs et des mthodes__________________________________________________ Redfinition des mthodes _______________________________________________________ La surchage _________________________________________________________________________ Surcharger les mthodes _________________________________________________________ Accessibilit ________________________________________________________________________ public________________________________________________________________________ protected _____________________________________________________________________ Autorisation par dfaut __________________________________________________________ private _______________________________________________________________________ Les classes abstraites, les interfaces, le polymorphisme ______________________________________ Le mot cl abstract ___________________________________________________________________ Mthodes et classes abstraites _____________________________________________________ Les interfaces _______________________________________________________________________ Casting ____________________________________________________________________________ Sur-casting ___________________________________________________________________ Sous-casting __________________________________________________________________ Polymorphisme ______________________________________________________________________ Utilisation du sur-casting ________________________________________________________ Late-binding __________________________________________________________________ Polymorphisme ________________________________________________________________
14 15 15 15 16 17 17 17 17 17 17 17 18 18 18 18 19 19 19 19 19 20 20 20 21 21 21 22 22 23 23 23 23 23 23 24 24 24 25 25 25 25 25 25 25 26 26 26 27 27 27 28 28 28 28 29
Page 3 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Chapitre 3 Spcificits du langage _________________________________________________________ 31 Les entres / sorties ____________________________________________________________________ 31 Package _____________________________________________________________________________ Les packages ________________________________________________________________________ Les packages accessibles par dfaut ________________________________________________ Linstruction package ___________________________________________________________ Linstruction import ____________________________________________________________ 31 31 31 31 31
Le clonage ___________________________________________________________________________ 31 Les threads___________________________________________________________________________ 31 Programme principal : la mthode main __________________________________________________ 31 Les exceptions (exception) et les erreurs (error) _____________________________________________ Deux types derreurs en Java _____________________________________________________ Principe ______________________________________________________________________ Attraper les exceptions __________________________________________________________ 32 32 32 32
Annexes _______________________________________________________________________________ 33 La machine virtuelle Java (JVM)_________________________________________________________ 33 Compilation __________________________________________________________________________ 33 Diagramme de classe UML ____________________________________________________________ Reprsentation dune classe ____________________________________________________________ visibilit______________________________________________________________________ Relations de dpendances ______________________________________________________________ Gnralisation Relation dhritage________________________________________________ Association Relation de contenance_______________________________________________ Gnralisation particulire Implmentation dune interface ____________________________ Autres relations de dpendance____________________________________________________ 33 33 33 33 34 34 34 34
Page 4 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
taille 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 1 bit 0 bit
enveloppeur Character Byte Short Integer Long Float Double Boolean Void BigInteger BigDecimal
Les classes BigInteger et BigDecimal sont utiliss pour reprsenter respectivement des valeurs entires et dcimales de prcision quelconque. Il nexiste pas de primitives quivalente. Le type char sert reprsenter les caractres, conformment au standard UNICODE. Il est le seul type numrique non sign ! Remarquons que le type boolean nest pas un type numrique. Portabilit
A linverse de ce qui se passe avec les autres langages, la taille des primitives est toujours la mme en Java, et ce quelque soit lenvironnement ou le type de la machine. On garantit ainsi la portabilit des programmes Java. Initialisation des primitives
Les primitives doivent tre dclares et initialises avant dtre utilises. Une primitive non initialise produira une erreur la compilation : Variable may not have been initialized . Remarquons que les primitives, lorsquelles sont employe comme membre de classe, possde des valeurs par dfaut. Il nest donc pas ncessaire de les initialiser !
primitive
valeurpar dfaut
Page 5 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Les valeurs littrales primitive char int long float double boolean syntaxe x 5 (dcimal), 05 (octal), 0x5 (hexadcimal) 5L, 05L, 0x5L 5.5f ou 5f ou 5.5E5f 5.5 ou 5.5d ou 5.5E5d ou 5.5E5 false ou true
Les constantes
Java ne comporte pas de constantes proprement parler. Il est cependant possible de simuler lutilisation de constantes laide du mot cl final. Une variable dclare final ne peut plus tre modifie une fois quelle a t initialise. Lorsquun lment est dclar final, le compilateur est mme doptimiser le code compil afin damliorer sa vitesse dexcution. Remarquons que les variables dclares final peuvent tre initialises lors de lexcution et non seulement lors de leur dclaration !
Les handles
dfinition final
Lutilisation de final nest pas rserv aux primitives. Un handle dun objet peut parfaitement tre dclar final. Cependant, la contrainte ne sapplique alors quau handle, qui ne peut plus voir son affectation modifie. Lobjet, lui, reste modifiable.
Page 6 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
peut plus tre modifi. En effet, la longueur des chanes tant assure de ne jamais varier, leur utilisation est trs efficace en termes de performances. Par ailleurs, il faut noter que Java dispose dune autre classe, appele StringBuffer, qui permet de grer des chanes dynamiques. Remarquons quil est galement possible de traiter des instances de la classe String comme des chanes dynamiques, sous certaines prcautions. Chanes littrales
Les chanes de caractres existent aussi sous forme littrale. Il suffit de placer la chane entre guillemets comme dans lexemple suivant : "Bonjour maman !" Les chanes littrales peuvent contenir des caractres spciaux issues du type char : caractres spciaux \b \f \n \r \t \\ \ \" \012 \uxxxx description backspace saut de page saut de ligne retour chariot tabulation horizontale \ " caractre en code octal caractre en code hxadcimal (unicode)
Les tableaux
Les tableaux Java sont des structures pouvant contenir un nombre fixe dlments de mme nature. Il peut sagir dobjet ou de primitives. Chaque lment est accessible grce un indice correspondant sa position dans le tableau. Les tableaux de Java sont des objets, mme lorsquils contiennent des primitives. Dclaration
Initialisation
Les oprateurs
Les oprateurs Java sont voisins du C.
Page 7 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
oprateur daffectation
On dispose du raccourci : x = y = z = 2. Oprateurs arithmtiques deux oprandes symbole * / % description soustraction multiplication division modulo (reste de la division) arit 2 2 2 2 exemple yx 3*x 4/2 5%2
Il nexiste pas en Java doprateur dexponentiation. Pour effectuer une exponentiation, il convient dutiliser la fonction pow(double a, double b) de la classe java.lang.Math. La division des entiers fournit un rsultat tronqu et non arrondi. Oprateurs un oprande symbole ++ ++ --description oppos pr-incrmentation post-incrmentation pr-dcrmentation post-dcrmentation arit 1 1 1 1 1 exemple x ++x x++ --x x--
oprateurs un oprande
Oprateurs relationnels symbole == < > <= >= != description quivalent plus petit que plus grand que plus petit ou gal plus grand ou gal non quivalent arit 2 2 2 2 2 2 exemple x == 0 x<2 x>2 x <= 3 x >= 3 a != b
oprateurs relationnels
Les notions dquivalence et de non quivalence sappliquent toutes les primitives, ainsi quaux handles dobjets. Il faut noter que lquivalence applique aux handles dobjets concerne les handles, et non les objets euxmmes ! Deux handles sont quivalents sils pointent vers le mme objet. Il ne sagit donc pas dobjets gaux, mais dun seul objet. Pour tester si deux objets distincts (ou non) sont effectivement gaux, il convient dutiliser la mthode equals. Considrons le petit programme suivant : Integer a = new Integer(100) ; Integer b = new Integer(100) ; Integer c = a ;
Page 8 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
System.out.println(a == b) ; System.out.println(a == c) ; System.out.println(a.equals(b)) ; La premire impression affiche false, la deuxime true et la dernire true. Par ailleurs, on aurait pu tout aussi bien remplacer a.equals(b) par b.equals(a).
Mthode equals
En fait, la mthode equals appartient la classe Object et toutes les autres classes en hritent. On donne cidessous sa dfinition initiale, qui compare les handles : public equals(Object obj) { return (this == obj) ; } Dans cette dfinition, on constate que equals se comporte exactement comme ==. En revanche, dans la plus part des classes (comme Integer, voir lexemple prcdent) la mthode est redfinie pour quelle compare le contenu des objets plutt que leur handles. Cette mthode est souvent problmatique et il convient de consulter la documentation. Oprateurs logiques symbole && || ! description et ou non arit 2 2 1 exemple a && b a || b !a
oprateurs logiques
Lvaluation des expressions logiques est stoppes ds lors que le rsultat est dtermin. Lvaluation partielle optimise le code mais peut avoir des effets indsirables. Une manire de forcer lvaluation consiste utiliser les oprateurs darithmtique binaire. Oprateurs darithmtique binaire
Les oprateurs darithmtiques binaires agissent au niveau des bits de donnes, sans tenir comte de ce quils reprsentent. symbole & | ^ ~ << >> >>> description et ou ou exclusif non dcalage gauche dcalage droite dcalage droite sans extension du signe arit 2 2 2 1 2 2 2 exemple a&b a|b a^ b ~a a << 2 b >> 2 b >>> 2
Rappelons que le bit de signe (des types entiers) est le bit de poids fort. On peut utiliser les oprateurs darithmtique binaire avec des valeurs logiques, qui sont des valeurs sur 1 bit. Lintrt de cette possibilit est que, sagissant doprateurs arithmtiques, ils sont toujours valus. Loprateur trois oprandes symbole ?: description condition ? vrai : faux arit 3 exemple y<5?4*y:2*y
Page 9 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Si condition est vrai, alors on retourne lvaluation de lexpression vrai, sinon on retourne celle de faux. Oprateurs de casting
new
Loprateur new permet dinstancier une classe, cest--dire de crer une instance de cette classe.
instanceof
L'oprateur instanceof permet de tester un objet est une instance dune classe donne (ou de l'une de ses sousclasses). Il prend en paramtre gauche un handle, et droite un nom de classe ; il retourne un boolean. String y = "bonjour" ; boolean a = y instanceof String ; Dans cet exemple, a vaut true. Loprateur instanceof ne permet de tester le type dune primitive. Il existe galement une version dynamique de loprateur instanceof, sous la forme dune mthode de la classe class.
Page 10 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
syntaxe return ; return (type de retour) ; if (expression) instruction ; if (expression) {bloc dinstructions }
commentaires cas dune mthode void les parenthses sont obligatoire en Java autour de lexpression boolenne. De mme le point-virgule est obligatoire en fin de bloc.
instruction conditionnelle if
if (expression) instruction ; else instruction ; if (expression) {bloc dinstructions} instruction conditionnelle else else {bloc dinstructions} if (expression) ; else {bloc dinstructions} if (expression) {bloc dinstructions} else if {bloc dinstructions} instruction conditionnelle else if else if {bloc dinstructions} else {bloc dinstructions}
On ne peut pas donner une instruction vide aprs la condition if. Il sagit en fait dune structure de contrle part entire crite en deux mots ! la partie initialisation se compose dune ou plusieurs initialisations (spares par des virgules. La partie test est une expression boolenne. La partie incrmentation peut contenir plusieurs instruction spares par des virgules. Interruption de litration en cours et passage linstruction suivant la boucle. Interruption de litration en cours et retour au dbut de la boucle avec excution de la partie incrmentation.
la boucle for
break ; utilisation de break et continue dans les boucles continue ; while (expression boolenne) {bloc dinstructions} switch (variable) case valeur1 : instructions1 ; case valeur2 : instructions2 ; default : instructions ;
linstruction while
linstruction switch
Les bloc sont dlimits par deux instructions case ! Lorsquune galit est trouve, le bloc dinstruction correspondant est excut, ainsi que tous les blocs suivant ! Pour quun seul bloc ne soit excut, il faut utiliser explicitement linstruction break.
Mots cls
static
Un lment dclar static appartient une classe et non ses instances. Les objets instancis partir dune classe ne possdent pas les lments de cette classe qui ont t dclar static. Un seul lment existe pour la classe et il est partag par toutes les instances. Cela ne limite en aucune faon laccessibilit mais conditionne le rsultat obtenu lors des accs. Les primitives, les objets et les mthodes peuvent tre dclar static. final
De nombreux langages de programmation, par exemple, font la diffrence entre les donnes dont la valeur peut tre modifie (les variables) et celles dont la valeur est fixe (les constantes). Java ne dispose pas de constantes. Ce nest pas une limitation, car Java dispose dun mcanisme beaucoup plus puissant, avec le modificateur final, qui permet non seulement dutiliser une forme de constantes, mais galement dappliquer ce concept dautres lments comme la mthode ou les classes.
Page 11 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
synchronized
Le mot cl transient sapplique aux variables dinstances (primitives et objets). Il indique que la variable correspondante est transitoire et que sa valeur ne doit pas tre conserv lors des oprations de srialisation. La srialisation est une opration qui permet denregistrer un objet Java sur un disque, afin de le conserver pour une session ultrieure, ou de lenvoyer travers un rseau. Lors de la srialisation, tous les champs sont sauvegards lexception de ceux dclars transient. volatile
Le mot cl volatile sapplique aux variables pour indiquer quelles ne doivent pas tre lobjet doptimisation. En effet, le compilateur effectue certaines manipulations pour acclrer le traitement (utilisation des registres). Ces optimisations peuvent savrer problmatiques ds lors que plusieurs processus utilisent la mme variable, celleci risque de ne pas tre jour ! Il est donc ncessaire dempcher une telle optimisation. abstract
Le mot cl abstract peut tre employ pour qualifier une classe ou une mthode. Cf. Classes abstraites, Interface, Polymorphisme
Page 12 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Animal
Chien
Chat
Page 13 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Chien
Chat
milou
rantanplan
flix
sylvestre
Il est vident que le rapport entre milou et Chien nest pas de la mme nature que le rapport entre Chien et Animal. Chien est une sous-classe de Animal. Dans la terminologie de Java, on dit que Chien tend la classe Animal. En revanche milou nest pas une classe. Cest un reprsentant de la classe Chien. Selon la terminologie Java, on dit que milou est une instance de la classe Chien.
Les classes
Dfinition
La classe regroupe la dfinition des membres de classe, cest--dire : - des mthodes, les oprations que lon peut effectuer ; - des champs, les variables que lon peut traiter ; - des constructeurs, qui permettent de crer des objets ; - et encore dautres choses plus particulires. Plus prcisment, une classe peut contenir des variables (primitives ou objets), des classes internes, des mthodes, des constructeurs, et des finaliseurs. La dclaration d'une classe se fait de la faon suivante : [Modificateurs] class NomClasse { corps de la classe } Le nom de la classe doit dbuter par une majuscule. Considrons lexemple suivant : Class Animal { // champs boolean vivant ; int ge ; // constructeurs Animal() { } // mthodes
Page 14 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Il arrive frquemment que certaines classes ne soient utilises que par une seule autre classe. Considrons lexemple suivant : Class Animal { // champs boolean vivant ; int ge ; Coordonnes position ; // constructeurs Animal() { position = new Coordonnes() ; } ... } Class Coordonnes { // champs int x = 0; int y = 0; ... } Toutes ces classes sont dfinies dans le mme fichier, ce qui convient dans le cadre de la dmonstration mais certainement pas pour la pratique courante de la programmation efficace. Chacune de ces classes pourrait tre dfinie sparment dans un fichier et affecte un package.
Page 15 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Lors de la compilation du prcdent fichier Animal.java, le compilateur produit deux fichiers : Animal.class et Coordonnes.class. Les classes imbriques ou static
Il peut tre avantageux dans certains cas placer la dfinition dune classe lintrieur dune autre, lorsque celleci concerne uniquement la classe principale . Voyons pour notre exemple : Class Animal { // champs boolean vivant ; int ge ; Coordonnes position ; // classes imbriques static Class Coordonnes { // champs int x = 0; int y = 0; ... } // constructeurs Animal() { position = new Coordonnes() ; } ... } La dfinition de la classe Coordonnes est maintenant imbrique dans la classe Animal. Par ailleurs, la rfrence la classe Coordonnes devient Animal.Coordonnes. De manire gnrale, les rfrences une classe imbrique en Java se font en utilisant le point comme sparateur. Lors de la compilation du fichier ci-dessus, Animal.java, le compilateur produit deux fichiers : Animal.class et Animal$Coordonnes.class pour la classe imbrique. Quant au chemin daccs, notons que mesclasses.Animal dsigne la classe Animal dans le package mesclasse, tandis que mesclasses.Animal.Coordonnes dsigne la classe Coordonnes imbrique dans la classe Animal, elle-mme contenu dans le package mesclassses. Ainsi il est possible dutiliser la directive import pour importer les classes imbriques explicitement ou en bloc : import mesclasses.Animal.Coordonnes ; import mesclasses.Animal.* ; Les classes imbriques peuvent elles-mmes contenir dautres classes imbriques, sans limitation de profondeur, du moins du point de vue de Java. Un dernier point. La classe Coordonnes a t dclare static, ce qui est obligatoire pour toute classe imbrique. En revanche, les interfaces imbriques sont automatiquement dclares static et il nest donc pas ncessaire de les dclarer explicitement comme telles.
Page 16 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
La particularit des classes imbriques est quelles sont Les classes locales
Les champs
Dfinition
Ltat reprsente lensemble des variables qui caractrisent une classe ; on parle encore de champs ou de membres. Notons que Java initialise par dfaut les variables membres. Considrons lexemple suivant : Class Animal { // champs int ge ; static int longvit = 100 ; }
Page 17 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
final float pi = 3.14 ; Dclarer une variable final offre deux avantages. Le premier concerne la scurit. En effet, le compilateur refusera toute affectation ultrieure dune valeur la variable. Le deuxime avantage concerne loptimisation du programme. Sachant que la valeur en question ne sera jamais modifi, le compilateur est mme de produire un code plus efficace. En outre, certains calculs prliminaires peuvent tre effectus.
Les mthodes
Les mthodes sont les oprations ou les fonctions que l'on peut effectuer sur une classe. On distingue deux types de mthodes : les accesseurs, qui ne modifient pas ltat et se contente de retourner la valeur dun champs ; les modificateurs, qui modifient ltat en effectuant un calcul spcifique.
Une dclaration de mthode est de la forme suivante : [Modificateurs] Type nomMthode ( paramtres ...) { corps de la mthode } Le nom de la mthode dbute par une minuscule ; la coutume veut quun accesseur dbute par le mot get et quun modificateur dbute par le mot set .
Page 18 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Il est important de noter que les mthodes static ne peuvent en aucun cas faire rfrence aux mthodes ou aux variables non static de la classe. Elles ne peuvent non plus faire rfrence une instance. (La rfrence this ne peut pas tre employ dans la mthode static.) Les mthodes static ne peuvent pas non plus tre redfinies dans les classes drives.
Les constructeurs
Nous allons maintenant nous intresser au dbut de la vie des objets : leur cration et leur initialisation. Puis nous dirons aussi un mot sur la fin de vie des objet en traitant du garbage collector.
Les constructeurs sont des mthodes particulires en ce quelles portent le mme nom que la classe laquelle elles appartiennent. Elles sont automatiquement excutes lors de la cration dun objet. Le constructeur par dfaut ne possdent pas darguments. Les constructeurs nont pas de type et ne retournent pas. Les constructeurs ne sont pas hrits par les classes drives. Lorsquun constructeur est excut, les constructeurs des classes parentes le sont galement. Cest le chanage des constructeurs. Plus prcisment, si en premire instruction le compilateur ne trouvent pas un appel this() ou super(), il rajoute un appel super(). Lutilisation de this() permet de partager du code entre les constructeurs dune mme classe, dont lun au moins devra faire rfrence au constructeur de la super-classe.
Page 19 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Une mthode peut porter le mme nom quun constructeur, ce qui est toutefois formellement dconseill.
Exemple de constructeurs
Considrons lexemple suivant : class Animal { // champs boolean vivant ; int ge ; // constructeurs Animal() { } Animal(int a) { ge = a ; vivant = true ; } // mthodes } Si nous avions donn au paramtre a le mme nom que celui du champs ge, il aurait fallu accder celle-ci de la faon suivante : Animal(int ge) { this.ge = ge ; vivant = true ; } Toutefois, pour plus de clart, il vaut mieux leur donner des noms diffrents. Dans le cas de linitialisation dune variable dinstance laide dun paramtre, on utilise souvent pour le nom du paramtre la premire (ou les premires) lettre(s) du nom de la variable dinstance. Par ailleurs, il faut remarqu que laccs un paramtre lintrieur dune mthode est toujours plus rapide que laccs une variable dinstance. Le gain de performance est de 20%. Par consquent, il faut utiliser les paramtres chaque fois que cest possible. Cration dobjets (object)
Tout objet java est une instance dune classe. Pour allouer la mmoire ncessaire cet objet, on utilise loprateur new, qui lance l'excution du constructeur. La cration dun Animal se fait laide de linstruction suivante : Animal nouvelAnimal = new Animal(3) ; Surcharger les constructeurs
Les constructeurs, tout comme les mthodes, peuvent tre surchargs dans le sens o il peut y avoir plusieurs constructeurs dans une mme classe, qui possdent le mme nom (celui de la classe). Un constructeur sidentifie de part sa signature qui doit tre diffrente davec tous les autres constructeurs.
Page 20 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Supposons que la plupart des instances soient cres avec 0 pour valeur initiale de ge. Nous pouvons alors rcrire la classe Animal de la faon suivante : class Animal { // champs boolean vivant ; int ge ; // constructeurs Animal() { ge = 0 ; vivant = true ; } Animal(int a) { ge = a ; vivant = true ; } // mthodes } Ici, les deux constructeurs possdent des signatures diffrentes. Le constructeur sans paramtre traite le cas o lge vaut 0 la cration de linstance. Une nouvelle instance peut donc tre cre sans indiquer lge de la faon suivante : Animal nouvelAnimal = new Animal() ; Autorisation daccs aux constructeurs
Les constructeurs peuvent galement tre affects dune autorisation daccs. Un usage frquent de cette possibilit consiste comme pour les variables, contrler leur utilisation, par exemple pour soumettre linstanciation certaines conditions.
Considrons la dclaration de variable suivante : int a ; Si cette dclaration se trouve dans une mthode, la variable na pas de valeurs. Toute tentative dy faire rfrence poduit une erreur de compilation. En revanche, sil sagit dune variable dinstance (dont la dclaration se trouve en dehors de toute mthode), Java linitialise automatiquement au moment de linstanciation avec une valeur par dfaut. Pour les variables statiques, linitialisation est ralise une fois pour toute la premire utilisation de la classe.
Page 21 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Les variables de type numrique sont initialises 0. Le type boolen est initialis false. Nous pouvons cependant initialiser nous-mmes les variables de la faon suivante : int a = int b = float c boolean 1 ; a*7 ; = (bc)/3 ; d = (a < b) ;
Les initialiseurs de variables permettent deffectuer des oprations dune certaine complexit, mais celle-ci est tout de mme limite. En effet, ils doivent tenir sur une seule ligne. Pour effectuer des oprations plus complexes, il convient dutiliser les constructeurs ou encore les initialiseurs dinstances. Les initialiseurs dinstances
Un initialiseur dinstance est tout simplement plac, comme les variables dinstances, lextrieur de toute mthode ou constructeur. Voyons lexemple suivant : class Exemple { // champs int a ; int b ; float c ; boolean d ; // initialiseurs { a b c d } } Les initialisateurs dinstances permettent de raliser des initialisations plus complexes. Ils offrent en outre lavantage par rapport aux constructeurs dtre beaucoup plus rapides. De plus les initialisateurs permettent dutiliser les exceptions pour traiter les conditions derreurs. Un autre avantage des initialisateurs est quils permettent deffectuer un traitement quelle que soit la signature du constructeur appel. Il est ainsi possible de placer le code dinitialisation commun tous les constructeurs dans un initialiseur et de ne traiter dans les diffrents constructeurs que les oprations spcifiques. Les initialisateurs comportent cependant des limitations. Il nest pas possible de leur passer des paramtres comme dans le cas des constructeurs. De plus, ils sont excuts avant les constructeurs et ne peuvent donc utiliser les paramtres de ceux-ci. Les initialiseurs statiques = = = = 1 ; a*7 ; (b-a)/3 ; (a < b);
Un initialiseur statique est semblable un initialiseur dinstance, mais il est prcd du mot static. Considrons lexemple suivant : class Voiture { // champs static int capacit ;
Page 22 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
// initialiseurs static { capacit = 80; System.out.println("La variable vient dtre initialise.\n") ; } // constructeurs Voiture() { } // mthodes static int getCapacit() { return capacit; } } Linitialiseur statique est excut au premier chargement de la classe, que ce soit pour utiliser un membre statique, Voiture.getCapacit()ou pour linstancier, Voiture maVoiture = new Voiture(). Les membres statiques (ici la variable capacit) doivent tre dclars avant linitialiseur. Il est possible de placer plusieurs initialiseurs statiques, o lon souhaite dans la classe. Ils seront tous excuts au premier chargement de celle-ci, dans lordre o ils apparaissent. Les variables final non initialises
Le concept de lhritage
Hirarchie des classes
De plus chaque classe drive dune classe de niveau suprieur, appele sur-classe. Cela est vrai pour toutes les classes sauf une. Il sagit de la classe Object, qui est lanctre de toutes les classes. Toute instance dune classe est un objet du type correspondant, mais aussi du type de toutes ses classes anctres. SousClasse hrite de toutes les caractristiques de Classe, et donc, par transitivit, de SurClasse. Une classe est toujours construite partir dune autre classe dont elle est drive. Une classe drive est une sous-classe d'une sur-classe. Extends
Lorsque le paramtre extends est omis, la classe dclare est une sous classe de l'objet Objet.
Page 23 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
SurClasse
Classe
SousClasse
Une deuxime dclaration d'une mthode dans une classe drive remplace la premire. Voyons un exemple avec la mthode crie( ) redfinie dans la classe Chien drive de la classe Animal. Class Animal { // champs // mthodes void crie() { } } Class Chien extends Animal { // champs // mthodes void crie() { System.out.println("Ouah-Ouah !") ; } }
Page 24 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
La surchage
Surcharger les mthodes
Signature dune mthode Une mthode est dite surcharge si elle permet plusieurs passages de paramtres diffrents.
Accessibilit
En Java, il existe quatre catgories dautorisations daccs, spcifis par les modificateurs suivants : private, protected, public. La quatrime catgorie correspond labsence de modificateur. Nous allons les prsenter en partant du moins restrictif jusquau plus restrictif. public
Les classes, les interfaces, les variables (primitives ou objets) et les mthodes peuvent tre dclares public. Les lments public peuvent tre utiliss par nimporte qui sans restriction ; il est accessible l'extrieur de la classe. protected
Cette autorisation sapplique uniquement aux membres de classes, cest--dire aux variables (objets ou primitives), aux mthodes et aux classes internes. Les classes qui ne sont pas membre dune autre classe ne peuvent pas tre dclares protected. Dans ce cas, laccs en est rserv aux mthodes des classes appartenant au mme package, aux classes drives de ces classes, ainsi quaux classes appartenant aux mmes packages que les classes drives. Plus simplement, on retiendra quun lment dclar protected nest visible que dans la classe o il est dfini et dans ses sousclasses. Autorisation par dfaut
Lautorisation par dfaut sapplique aux classes, interfaces, variables et mthodes. Les lments qui disposent de cette autorisation sont accessibles toute les mthodes des classes du mme package. Les classes drives ne peuvent donc y accder que si elles sont explicitement dclares dans le mme package. Rappelons que les classes nappartenant pas explicitement un package appartiennent automatiquement au package par dfaut. Toute classe sans indication de package dispose donc de lautorisation daccs toutes les classes se trouvant dans le mme cas. private
Lautorisation private est la plus restrictive. Elle sapplique aux membres dune classe (variables, mthodes, classes internes). Les lments dclars private ne sont accessibles que depuis la classe qui les contient ; il n'est visible que dans la classe o il est dfini. Ce type dautorisation est souvent employ pour les variables qui ne doivent tre lues ou modifies qu laide dun accesseur ou dun modificateur. Les accesseurs et les modificateurs, de leur ct, sont dclars public, afin que tout le monde puisse utiliser la classe.
Page 25 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Une mthode dclare abstract ne peut tre excute. En fait, elle na pas dexistence relle. Sa dclaration indique simplement que les classes drives doivent la redfinir. Les mthodes abstract prsentent les particularits suivantes : Une classe qui contient une mthode abstract doit tre dclare abstract. Une classe abstract ne peut pas tre instancie. Une classe peut tre dclare abstract, mme si elle ne comporte pas de mthodes abstract. Pour pouvoir tre instancie, une sous-classe dune classe abstract doit redfinir toute les mthodes abstract de la classe parente. Si une des mthodes nest pas redfinie de faon concrte, la sous-classe est elle-mme abstract et doit tre dclare explicitement comme telle. Les mthodes abstract nont pas dimplmentation. Leur dclaration doit tre suivie dun point-virgule.
Ainsi dans lexemple prcdent la mthode crie( ) de la classe Animal aurait pu tre dclare abstract, ce qui signifie que tout Animal doit tre capable de crier, mais que le cri dun animal est une notion abstraite. La mthode ainsi dfinie indique quune sous-classe devra dfinir la mthode de faon concrte. abstract class Animal { // champs // mthodes abstract void crie() ; } class Chien extends Animal { // champs // mthodes void crie() { System.out.println("Ouah-Ouah !") ; } } class Chat extends Animal { // champs // mthodes void crie() { System.out.println("Miaou-Miaou !") ; }
Page 26 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
} De cette faon, il nest plus possible de crer un animal en instanciant la classe Animal. En revanche, grce la dclaration de la mthode abstract crie( ) dans la classe Animal, il est possible de faire crier un animal sans savoir sil sagit dun chien ou dun chat, en considrant les instances de Chien ou de Chat comme des instances de la classe parente. Animal animal1 = new Chien() ; Animal animal2 = new Chat() ; animal0.crie() ; animal1.crie() ; Le premier animal crie "Ouah-Ouah !" ; le second, "Miaou-Miaou !".
Les interfaces
Une classe peut contenir des mthodes abstract et des mthodes non abstract. Cependant, il existe une catgorie particulire de classes qui ne contient que des mthodes abstract. Il sagit des interfaces. Les interfaces sont toujours abstract, sans quil soit ncessaire de lindiquer explicitement. De la mme faon, il nest pas ncessaire de dclarer leurs mthodes abstract. Les interfaces obissent par ailleurs certaines rgles supplmentaires. Elles ne peuvent contenir que des variables static et final. Elles peuvent tre tendues comme les autres classes, avec une diffrence majeure : une interface peut driver de plusieurs autres interfaces. En revanche, une classe ne peut pas driver uniquement dune ou de plusieurs interfaces. Une classe drive toujours dune autre classe, et peut driver, en plus, dune ou plusieurs interfaces.
Casting
Sur-casting
Un objet peut tre considr comme appartenant sa classe ou une classe parente selon le besoin, et cela de faon dynamique. Nous rappelons ici que toutes classes drive de la classe Object, qui est un type commun tous les objets. En dautres termes, le lien entre une classe et une instance nest pas unique et statique. Au contraire, il est tabli de faon dynamique, au moment o lobjet est utilis. Cest la premire manifestation du polymorphisme ! Le sur-casting est effectu de faon automatique par Java lorsque cela est ncessaire. On dit quil est implicite. On peut lexpliciter pour plus de clart, en utilisant loprateur de casting : Chien chien = new Chien() ; Animal animal = (Animal)chien ; Aprs cette opration, ni le handle chien, ni lobjet correspondant ne sont modifis. Les handles ne peuvent jamais tre redfinie dans le courant de leur existence. Seule la nature du lien qui lie lobjet aux handles change en fonction de la nature des handles. Le sur-casting est un peu moins explicite, lorsquon affecte un objet un handle de type diffrent. Par exemple : Animal animal = new Chien() ;
Page 27 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Sous-casting
Polymorphisme
Utilisation du sur-casting
Considrons lexemple suivant, qui reprend les dfinitions prcdentes des classes Animal, Chien, et Chat et illustre une premire sorte de polymorphisme avec sur-casting implicite sur la mthode crie( ). public class Main { // mthodes public static void main(String[] argv) { Chien chien = new Chien() ; Chat chat = new Chat() ; crie(chien) ; crie(chat) ; void crie(Animal animal) { animal.crie() ; } } Le premier animal crie "Ouah-Ouah !" ; le second, "Miaou-Miaou !". Late-binding
Il existe un moyen dviter le sous-casting explicite en Java, appel late-binding. Cette technique fondamentale du polymorphisme permet de dterminer dynamiquement quelle mthode doit tre appele. Dans la plupart des langages, lorsque le compilateur rencontre un appel de mthode, il doit tre mme de savoir exactement de quelle mthode il sagit. Le lien entre lappel et la mthode est alors tabli la compilation. Cette technique est appele early binding (liaison prcoce). Java utilise cette technique pour les appels de mthodes dclares final. Elle a lavantage de permettre certaines optimisations. En revanche, pour les mthodes qui ne sont pas final, Java utilise la technique du late binding (liaison tardive). Dans ce cas, le compilateur ntablit le lien entre lappel et la mthode quau moment de lexcution du programme. Ce lien est tabli avec la version la plus spcifique de la mthode et doit tre diffrenci du concept abstract. Considrons lexemple suivant pour sen convaincre. class Animal { // mthodes void crie() { } } class Chien extends Animal { // mthodes void crie() { System.out.println("Ouah-Ouah !") ; } }
Page 28 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
class Chat extends Animal { // mthodes void crie() { System.out.println("Miaou-Miaou !") ; } } public class Main { // mthodes public static void main(String[] argv) { Chien chien = new Chien() ; Chat chat = new Chat() ; crie(chien) ; crie(chat) ; void crie(Animal animal) { animal.crie() ; } } Le premier animal crie "Ouah-Ouah !" ; le second, "Miaou-Miaou !". La mthode crie appel dans la mthode crie de la classe Main est bien la plus spcifique, celle de Chien ou de Chat et non celle de Animal !
Polymorphisme
Le programme ci-dessous illustre le concept du polymorphisme. La classe Animal utilise la mthode abstraite qui pour dfinir la mthode printQui de manire plus ou moins abstraite. Cela entrane une factorisation du code. abstract class Animal { // mthodes abstract String qui() ; void printQui() { System.out.println("cet animal est un " + qui()) ; } } class Chien extends Animal { // mthodes String qui() { return "chien" ; } } class Chat extends Animal { // mthodes String qui() { return "chat" ; }
Page 29 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
} Limplmentation de la mthode qui est reli lappel, uniquement au moment de lexcution, en fonction du type de lobjet appelant et non celui du handle ! Cest--dire, Animal animal1 = new Chien() ; Animal animal2 = new Chat() ; animal1.printQui() ; animal2.printQui() ; donne comme rsultat : cet animal est un chien cet animal est un chat
Page 30 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Linstruction package
Linstruction import
Le clonage
Le clonage est une technique de cration dobjets
Les threads
Les threads (en franais processus indpendants) sont des mcanismes importants du langage Java. Ils permettent d'excuter plusieurs programmes indpendants les uns des autres. Ceci permet une excution parallle de diffrentes tches de faon autonome. Un thread ragit aux diffrentes mthodes suivantes : destroy( ) : arrt brutal du thread ; interrupt( ) permet d'interrompre les diffrentes mthodes d'attente en appelant une exception ; sleep( ) met en veille de thread ; stop( ) : arrt non brutal du thread ; suspend( ) : arrt d'un thread en se gardant la possibilit de le redmarrer par la mthode resume( ) ; wait( ) met le thread en attente ; yield( ) donne le contrle au schduleur.
La mthode sleep( ) est souvent employe dans les animations, elle permet de mettre des temporisations d'attente entre deux squences d'image par exemple.
Page 31 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
En Java, on peut classer les erreurs en deux catgories : - les erreurs surveilles, - les erreurs non surveilles. Java oblige le programmeur traiter les erreurs surveilles. Les erreurs non surveilles sont celles qui sont trop graves pour que le traitement soit prvu priori., comme par exemple la division par zro. Public class Erreur Public static int x = z = x / } } { void main (String[] args) { 10, y = 0, z = 0; y ;
Dans ce cas, linterprteur effectue un traitement exceptionnel, il arrte le programme et affiche un message : Exception in thread "main" java.lang.ArithmeticException : / by zero at Erreur.main(Erreur.java:5) Principe
Lorsquune erreur de ce type est rencontre, linterprteur cre immdiatement un objet, instance dune classe pariculire, elle-mme sous-classe de la classe Exception. Cet objet est cr normalement avec loprateur new. Puis linterprteur part la recherche dune portion de code capable de recevoir cet objet et deffectuer le traitement approri. Sil sagit dune erreur surveille par le compilateur, celui-ci a oblig le programmeur fournir ce code. Dans le cas contraire, le traitement est fourni par linterprteur lui-mme. Cette opration est appele lancement dune exception (throw). Pour trouver le code capable de traiter lobjet, linterprteur se base sur le type de lobjet, cest--dire sur la classe dont il est une instance. Pour reprendre lexemple de la division par zro, une instance de la classe ArithmeticException est lance. Si le programme ne comporte aucun bloc de code capable de traiter cet objet, celui-ci est attrap par linterpryeur lui-mme. Un message derreur est alors affiche Exception in thread "main". Attraper les exceptions
Nous avons vu que Java noblige pas le programmeur attrapper tous les types dexceptions. Seuls ceux correspondant des erreurs surveilles doivent obligatoirement tre attraps. En fait, les exceptions qui ne peuvent pas tre attrapes sont des instances de la classe RuntimeException ou une classe drive de celle-ci. Cependant rien ninterdit dattraper ces exceptions. Nous avons dit
Page 32 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Annexes
La machine virtuelle Java (JVM)
Java est un langage multi-plates-formes qui permet, selon Sun Microsystems, son concepteur, dcrire une fois pour toute des applications capables de fonctionner dans tous les environnements. Cet objectif est atteint grce lutilisation dune machine virtuelle Java (JVM) qui excute les programmes crits dans ce langage.
Compilation
code source .java compilation javac bytecode .class excution java
compilation du code source : javac *.java ; excution sur la JVM : java MainFile.
oprations
Relations de dpendances
En UML, on distingue plusieurs types de relations de dpendances : la gnralisation, lassociation, la gnralisation particulire.
Page 33 sur 34
Esnard Aurlien
cours de Java
ENSERB informatique
Une classe contient une instance dune autre classe. partie de Class0 Class1
Toutes les classes ne sont pas lis par une association ou une gnralisation (par exemple : String) ; il y a aussi des interactions entre les objets qui surviennent lexcution On peut les faire apparatre dans le diagramme de classe sous forme dune relation de dpendance dependancy en prcisant paramtre ou variable locale . En fait, la relation de dpendance est trs gnrale, elle indique quune classe a besoin de linterface dune autre classe ; on dit aussi quune classe est cliente dune autre classe. Dans lexemple ci-dessous, Maclasse utilise des String comme paramtres de mthodes. utilis par MaClasse String
Page 34 sur 34