Vous êtes sur la page 1sur 34

Esnard Aurlien

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

Diagramme de squence UML _________________________________________________________ 34

Page 4 sur 34

Esnard Aurlien

cours de Java

ENSERB informatique

Chapitre 1 Les bases du langage Java


Les donnes
Les primitives
Les concepteurs de Java ont dot ce langage dune srie dlments particuliers appels primitives. Ces lments ressemble des objets, mais ne sont pas des objets ! Ils sont crs de faon diffrente, et sont galement manipuls en mmoire de faon diffrente. Cependant il peuvent tre envelopps dans des objets spcialement conu cet effet, et appels enveloppeurs (wrappers). Table des primitives primitive tendue char byte short int long float double boolean void prcision quelconque prcision quelconque 0 65 535 -128 +127 -32 768 +32 767 - 2 147 483 648 +2 147 483 647 de 2 +2 -1 de 1.4E-45 3.40282347E38 de 4.9E-324 1.7976931348623157E308 true ou false
63 63

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

primitive boolean char byte short int long float double

valeurpar dfaut false \u0000(null) (byte)0 (short)0 0 0L 0.0f 0.0d

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

Casting sur les primitives

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.

Les chanes de caractres


En Java, les chanes de caractres sont des objets. Ce sont des instances de la classe String. Depuis les premiers langages de programmation, les chanes de caractres ont pos des problmes ! En effet, sil est facile de dfinir diffrents types numriques de format fixe, les chanes de caractres ne peuvent pas tre reprsentes dans un format fixe car leur longueur peut varier de 0 un nombre quelconque de caractres. Java utilise une approche particulire. Les chanes de caractres peuvent tre initialises une valeur quelconque. Leur longueur est choisie en fonction de leur valeur dinitialisation. En revanche, leur contenu ne

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 vecteurs Les collections Les itrareurs Les comparateurs

Les oprateurs
Les oprateurs Java sont voisins du C.

Page 7 sur 34

Esnard Aurlien

cours de Java

ENSERB informatique

Description des principaux oprateurs


Oprateur daffectation symbole = = += description affectation soustraction et affectation addition et affectation arit 2 2 2 exemple x=2 x= 2 x += 2

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

oprateurs arithmtiques deux oprandes

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

oprateurs darithmtique binaire

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

oprateur trois oprandes

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.

Loprateur + pour String


Les chanes de caractres dispose de l'oprateur + qui permet de concatner deux chanes ; += est aussi valide pour les chanes de caractres. String x = "maman" ; System.out.println("bonjour" + x) ;

Priorit des oprateurs


Les oprateurs par ordre de prsance dcroissante sont les suivants : Oprateurs Appel de mthode . [] () - + ++ -- ! ~ (cast) new */% +<< >> >>> < > <= >= == != & ^ | && || ?: = op= , Ordre dvaluation De gauche droite

Les structures de contrle


Les structures de contrle sont presque les mmes que celles utilises en C ou en C++. On les rappelle ci-dessous en prcisant les spcificits Java.

Page 10 sur 34

Esnard Aurlien

cours de Java

ENSERB informatique

structure de contrle retour dune mthode

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

for(initialisation ; test ; incrmentation) {bloc dinstructions}

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

Cf. Threads. native

Cf. Les mthodes. transient

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

Chapitre 2 Concepts de base de la programmation oriente objet


Introduction
Tout est objet !
Le principe fondamental dun langage orient objet est que le langage doit permettre dexprimer la solution dun problme laide des lments de ce problmes. Par exemple, un programme traitant des images doit manipuler des structures de donnes reprsentant des images, et non leur traduction sous formes dune suite de bits. De cette faon, on procde une abstraction. Java est laboutissement (pour le moment, du moins) de ce concept. Pour Java, lunivers du problme traiter est constitu dobjets. Cette approche est la plus naturelle car elle correspond notre faon dapprhender lunivers, ce qui facilite la modlisation des problmes. Rappelons ici le deuxime et troisime prcepte de Descartes extraits du discours de la mthode (1637) et qui vont dans ce sens : Le deuxime, de diviser chacune des difficults que jexaminerais , en autant de parcelles quil se pourrait, et quil serait requis pour les rsoudre. Le troisime, de conduire par ordre mes penses, en commenant par les objets les plus simples et les plus aiss connatre, pour monter peu, comme par degrs, jusques la connaissance des plus composs ; et supposant mme lordre entre ceux qui ne se prcdent point naturellement les uns les autres. Tout est donc objet. Il faut entendre par objet, lment de lunivers relatif au problme traiter. Les objets appartiennent des catgories appeles classes, qui divisent cet univers.

Illustration des concepts de classe et dobjet


Si notre problme concerne les animaux, nous pouvons crer une classe que nous appellerons Animal. Si nous devons considrer les chiens et les chats, nous crerons les trois classes drive de la classe Animal : les classes Chien et Animal. Peu importe que cette division ne soit pas pertinent dans lunivers rel, il suffit quelle le soit dans celui du problme traiter. Nous reprsenterons cette division de lunivers de la faon suivante :

Animal

Chien

Chat

Page 13 sur 34

Esnard Aurlien

cours de Java

ENSERB informatique

Considrons prsent le modle suivant : Animal

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

void viellit() { ++ge ; } void crie() { } }

Les classes final


Une classe peut tre dclare final, dans un but de scurit ou doptimisation. Une classe final ne peut tre tendue pour crer des sous-classes. Par consquent, ses mthodes ne peuvent pas tre redfinies et leur accs peut donc se faire sans recherche dynamique. Une classe final ne peut pas tre clone.

Les classes internes


Une classe Java peut contenir, outre des primitives, des objets (du moins leurs rfrences) et des dfinitions de mthodes, des dfinitions de classe. Nous allons maintenant nous intresser de plus prs cette possibilit. Plusieurs classes dans un mme fichier

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

Les classes membres

La particularit des classes imbriques est quelles sont Les classes locales

Les classes anonymes

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 ; }

Variables dinstances & Variables static


Dans lexemple ci-dessus, ge est une variable dinstance, tandis que longvit reprsente une variable static. Dans cet exemple, nous avons considr que la longvit tait une caractristique commune tous les animaux, mettons 100 ans ! Il nest donc pas ncessaire de dupliquer cette information dans chacune des instances de la classe. Nous avons donc choisi de dclarer longvit comme une variable static. Il en rsulte que cette variable appartient la classe et non ses instances. Pour comprendre cette nuance, considrons une instance de la classe Animal, appel monAnimal. Lobjet monAnimal possde sa propre variable ge, laquelle il est possible daccder grce la syntaxe : monAnimal.ge Lobjet monAnimal ne possde pas de variable longvit. Normalement, longvit appartient la classe Animal, et il est possible dy accder en utilisant la syntaxe : Animal.longvit Cependant, Java nous permet galement dutiliser la syntaxe : monAnimal.longvit Mais il faut bien comprendre que ces deux expressions font rfrence la mme variable. On peut utiliser le nom de la variable seul pour y faire rfrence, uniquement dans la dfinition de la classe.

Les variables final


Une variable dclare final ne peut plus voir sa valeur modifie. Elle remplit alors le rle de constante dans dautres langages. Une variable final est le plus souvent utilise pour encoder des valeurs constantes. Par exemple, on peut dfinir la constante Pi de la manire suivante :

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 .

Les retours Les mthodes dinstances Les mthodes static


Les mthodes peuvent galement tre dclar static. Imaginons que nous souhaitons construire un accesseur pour la variable longvit (voir exemple prcdent). Nous pouvons le faire de la faon suivante : Class Animal { // champs int ge ; static int longvit = 100 ; // mthodes static int getLongvit() { return longvit ; } } La mthode getLongvit peut tre dclar static car elle ne fait rfrence qu des membres static (en loccurrence, la variable longvit). Ce nest pas une obligation. Le programme fonctionne aussi si la mthode nest pas dclar static. Dans ce cas, cependant, la mthode est duplique chaque fois quune instance est cre, ce qui nest pas trs efficace. Comme dans le cas des variables, les mthodes static peuvent tre rfrences laide du nom de la classe ou du nom de linstance. On peut utiliser le nom de la mthode seul , uniquement dans la dfinition de la classe.

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 mthodes native


Une mthode peut galement tre dclare native, ce qui a des consquences importantes sur la faon de lutiliser. En effet, une mthode native nest pas crite en Java, mais dans un autre langage. Les mthodes native ne sont donc pas portable dun environnement un autre. Les mthodes native nont pas de dfinition. Leur dclaration doit tre suivie dun point-virgule. ()

Les mthodes final


Les mthodes peuvent galement tre dclar final, ce qui restreint leur accs dune toute autre faon. En effet, les mthodes final ne peuvent pas tre redfinies dans les classes drives. Ce mot cl est utilis pour sassurer que la mthode dinstance aura bien le fonctionnement dtermin dans la classe parente. (Sil sagit dune mthode static, il nest pas ncessaire de la dclarer final car les mthodes static ne peuvent jamais tre redfinies.) Les mthodes final permettent galement au compilateur deffectuer certaines optimisations qui acclrent lexcution du code. Pour dclarer une mthode final, il suffit de placer ce mot cl dans sa dclaration de la faon suivante : final int calcul(int i, int j) {...} Le fait que la mthode soit dclar final na rien voir avec le fait que ces arguments le soient ou non. Nous reviendrons sur lutilit des mthodes final dans le chapitre concernant le polymorphisme, et notamment le concept early & late binding.

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 : cration dobjets


Les constructeurs et les initialiseurs sont des lments trs importants car ils dterminent la faon dont les objets Java commencent leur existence. Ces mcanismes, servant contrler la cration dinstance de classe, sont fondamentalement diffrents des mthodes. Les constructeurs (constructor)

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.

Initialisation des objets


Il existe en Java trois lments pouvant servir linitialisation : - les constructeurs, - les initialiseurs de variables dinstances et statiques, - les initialiseurs dinstances et statiques. Nous avons dj prsent linitialisation utilisant un constructeur. Voyons les deux autres manires. Les initialiseurs de variables dinstances et statiques

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

Les finaliseurs La destruction des objets (garbage collector)


Avec certains langages, le programmeur doit soccuper lui-mme de librer la mmoire en supprimant les objets devenus inutiles. Avec Java, le problme est rsolu de faon trs simple : un programme, appel garbage collector, ce qui signifie littralement ramasseur dordures , est excut automatiquement ds que la mmoire disponible devient infrieure un certain seuil. De cette faon, aucun objet inutilis nencombrera la mmoire.

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

Rfrence la classe parente Object

SurClasse

Classe

SousClasse

Redfinition des champs et des mthodes


Redfinition des mthodes

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

Les classes abstraites, les interfaces, le polymorphisme


Le mot cl abstract
Mthodes et classes abstraites

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

Le sous-casting doit obligatoirement tre explicite en Java.

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

Chapitre 3 Spcificits du langage

Les entres / sorties Package


Les packages
Les packages accessibles par dfaut

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.

Programme principal : la mthode main


() Cette mthode doit imprativement tre dclar public. Ainsi la classe contenant la mthode main( ), le programme principal, doit tre public. Rappelons ici quun fichier contenant un programme Java ne peut contenir quune seule dfinition de classe dclare public. De plus le fichier doit porter le mme nom que la classe, avec lextension .java.

Page 31 sur 34

Esnard Aurlien

cours de Java

ENSERB informatique

Les exceptions (exception) et les erreurs (error)


Deux types derreurs en Java

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.

Diagramme de classe UML


UML (Unified Modeling Language) propose une modlisation des langages unifies. Nous allons lutiliser particulirement pour construire un diagramme de classe, qui modlise larchitecture des classes dans un programme Java. Ce diagramme est construit partir des classes crs par le programmeur (mises en gras) et il indique les relations de dpendances entre classes par des flches, selon une typologie donne.

Reprsentation dune classe


nom de la classe attributs

oprations

visibilit + # public protg priv

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

Gnralisation Relation dhritage

SuperClass hrite de Class

Association Relation de contenance

Une classe contient une instance dune autre classe. partie de Class0 Class1

Gnralisation particulire Implmentation dune interface

Interface implmente Class

Autres relations de dpendance

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

Remarquons que lassociation et la gnralisation sont aussi des relations de dpendances.

Diagramme de squence UML

Page 34 sur 34

Vous aimerez peut-être aussi