Professional Documents
Culture Documents
Java
1
Prsentation
II. III.
IV.
V.
Premier programme Java Les types primitifs de Java Les oprateurs Les instructions de contrle
2
VI.
1. 2. 3. 4. 5. 6. 7.
Rgle dcriture des mthodes Notion de classe Notion de constructeur Accesseurs et modificateurs Affectation et comparaison dobjets Surdfinition ou surcharge Variables et mthodes de classe Dclaration Dclaration avec initialisation Utilisation d'un tableau La taille d'un tableau Exercices Passage des paramtres Les tableaux d'objets
VII.
1. 2.
Les tableaux
3.
4. 5. 6. 7.
VIII.
1. 2.
IX.
1. 2. 3. 4. 5. 6. 7. 8. 9.
Lhritage
Gnralisation-Spcialisation Hritage et constructeurs Modificateurs de visibilit Redfinition et surcharge Polymorphisme Classes et mthodes finales Les classes abstraites Les interfaces La classe Object
X.
Les exceptions
4
I. Prsentation
La plateforme java, uniquement software, est excute sur la plateforme du systme dexploitation Elle est constitue de :
Atouts de Java
Langage de programmation simple ; Orient objet ; Comporte un grand nombre dobjets prdfinis pour lutilisateur ; Neutre architecturalement ( = portabilit ) ; Distribu gratuitement !!!
6
Neutralit architecturale
Un programme Java est compil puis interprt.
MonProgramme.java
Compilateur JAVA
MonProgramme.class
Mac(JVM)
Windows(JVM)
Unix(JVM)
Historique du langage
Langage simple, portable et orient objets Pour la programmation de petits appareils lectromnagers Emprunte la portabilit du Pascal (VM) et la syntaxe du C++
8
Historique du langage
OAK tant un nom dpos, le projet sappellera JAVA Apparition des Applets qui ont fait le succs de Java (remplacs aujourdhui par Flash)
Historique du langage
Dcembre 98 : SUN annonce une nouvelle dnomination pour ses produits Java :
Plate-forme Java 2
Historique du langage
Pourquoi Java ?
11
l'hritage ;
12
1. Notion dobjet
Objet = unit autonome qui a ses propres donnes et un ensemble de procdures qui agissent sur ces donnes ;
13
1. Notion dobjet
a) les donnes
En terme de programmation, les donnes sont stockes dans des variables. Si nous reprsentons plusieurs voitures, chacune aura ses propres variables. (*)
14
1. Notion dobjet
b) les comportements
Pour accder aux donnes, il faut prvoir un ensemble de comportements, ils constitueront une interface entre lobjet et les programmes.
Exemples de comportement : acclrer, freiner, tourner(gauche), tourner(droite),
15
1. Notion dobjet
En jargon orient objet, on dira que :
- les donnes sont les attributs dun objet ; - les comportements sont les mthodes de lobjet ;
16
2. Notion de classe
Les objets sont dfinis par des classes ; Une classe est le moule dun objet ;
2. Notion de classe
En jargon orient objet, on dira :
18
3. Notion dencapsulation
Soit un lecteur Mp3, il nest pas ncessaire de connatre son fonctionnement interne pour pouvoir lutiliser. Lutilisateur se sert uniquement de son interface (play, stop, next) Les objets en POO doivent fonctionner de la mme manire.
19
3. Notion dencapsulation
Lorsquun objet est parfaitement crit, lutilisateur ne peut accder directement aux donnes ;
Il doit passer par les mthodes qui servent dinterface entre lobjet et ses utilisateurs ;
20
3. Notion dencapsulation
21
4. Notion dhritage
L'hritage est une technique qui permet de crer une nouvelle classe partir d'une classe existante. La sous-classe hrite des caractristiques de la classe de base.
Intrt : pouvoir dfinir de nouveaux attributs et mthodes pour la sous-classe, qui viennent s'ajouter ceux et celles hrits. (*)
22
23
24
25
Remarque : Pour obtenir ces valeurs on peut faire appel aux constantes prdfinies Byte.MIN_VALUE, Byte.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, etc
26
27
Le type caractre
char
2 octets
28
Le type boolen
boolean
Exemple d'initialisation :
29
Initialisation de variable
int n = 5 ; int n ; n = 5 ; int duo = 2 * n ; En Java, une variable doit tre initialise avant d'tre utilise (sinon erreur de compilation).
30
Les constantes
final int N = 20 ; final int N = 2 * p ;
final int N ; N = Clavier.lireInt () ; // Premire affectation : OK N=N+1; // 2me affectation : erreur de compilation
31
32
Oprateurs arithmtiques
+
* / %
addition
soustraction multiplication division modulo, reste de la division sur entiers ou flottants
33
34
35
36
Oprateurs relationnels
< <= > >= == != infrieur infrieur ou gal suprieur suprieur ou gal gal diffrent
37
Oprateurs logiques
! & ^ | && ngation et ou exclusif ou inclusif et avec court-circuit
||
38
La 2me condition nest value que si cest indispensable pour valuer la condition complte
Exemple:
if (n!=0 && trouv==true)
// si n=0, la suite nest mme pas value => plus rapide !
39
Oprateurs dincrmentation
++ pr ou post-incrmentation -- pr ou post-dcrmentation
Oprateur gauche de son oprande : on incrmente ou dcrmente d'abord ; Oprateur droite de son oprande : on incrmente ou dcrmente aprs ;
40
Exemples
a = ++ i ;
// i=i+1; a=i;
a = i ++ ;
//
a=i;
i=i+1;
tab[i++] = Clavier.lireInt() ;
// garnit tab[i] puis incrmente i
i ++ ; ++ i ;
42
Loprateur de CAST
Si a et b sont de type float, et n de type entier : n=a/b; donne une erreur de compilation "possible loss of precision - found float - required int"
43
n = (int) (a / b) ;
Que pensez-vous de ceci ? n = (int) a / b ; Nouvelle erreur de compilation
44
Remarque :
le cast (la conversion) est possible galement vers les autres types de donnes numriques
45
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;
46
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;
// oui
47
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;
48
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;
49
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ; // // // //
Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ; // // // // //
http://java.sun.com
pour J2SE
52
53
Les alternatives
Instruction "if"
if (condition) { instr1 ; instr2 ; } else { instr3 ; instr4 ; }
54
Les alternatives
Instruction "switch"
switch (expression) { case const-1 : instr1 ; instr2 ; ; break; case const-2 : instr3 ; instr4 ; ; break; default : instr5 ; instr6 ; ; }
55
Les alternatives
Exemple1
switch (cat) { case 1 : System.out.println ("Junior"); case 2 : System.out.println ("Adulte"); case 3 : System.out.println ("Senior"); default : System.out.println ("Non dfini") ; }
56
Les alternatives
Exemple2
switch (mois) { case 1 : case 2 : case 3: case 4 : case 5 : case 6 : System.out.println ("Premier semestre") ; break ; case 7 : case 8 : System.out.println ("Vacances") ; break ; default : System.out.println ("Fin de l'anne") ; }
57
Les rptitives
Instruction "do while"
do {
} while (condition) ;
srie d'instructions ;
Les rptitives
Exemple
int som = 0; do { System.out.println(Entrez votre nombre); nb = Clavier.lireInt() ; som += nb; } while (nb != 0) ;
59
Les rptitives
Instruction "while"
while (condition) { srie d'instructions ; } On vrifie la condition avant d'entrer dans la rptitive !!!
60
Les rptitives
Exemple
int nb, som=0; while (nb != 0) { System.out.println(Entrez votre nombre); nb = Clavier.lireInt() ; som += nb; }
Les rptitives
Erreur de compilation ! Il faut initialiser nb avant de lutiliser !
int nb=0, som=0;
Que se passe-t-il ?
Les rptitives
int nb, som=0; System.out.println(Entrez votre nombre); nb = Clavier.lireInt() ;
while (nb != 0) { som += nb; System.out.println(Entrez votre nombre); nb = Clavier.lireInt() ; }
63
Les rptitives
Instruction "for"
for ( initialisations ; condition ; incrmentations ) { } srie-d'instructions ;
64
Les rptitives
Exemple 1
Les rptitives
Exemple 2
int i ; for ( i = 1 ; i < 4 ; i++ ) System.out.println ( "Passage " + i) ; System.out.print ( "I vaut " + i ) ;
Les rptitives
Exemple 3
Exercices
Afficher les annes jusqu'en 2500. bissextiles d'aujourd'hui
Remarque : une anne est bissextile si elle est multiple de 4 mais pas multiple de 100. Rsoudre cet exercice 1) avec for ; 2) avec while ; 3) avec do while ;
68
Les rptitives
Instruction "break"
-
Break peut tre utilise dans une rptitive pour sortir prmaturment ;
Exemple : Calculer la somme de maximum 10 nombres entrs au clavier ou s'arrter avant si on entre 0
69
Les rptitives
int i, n, som ; for ( i=1, som=0 ; i <= 10 ; i++ ) { n = Clavier.lireInt() ; if ( n == 0) break ; // Ce break nous branche som += n ; } // ici System.out.print( "Somme des " + (i-1) + " nb = " + som) ;
70
Les rptitives
Instruction "break" avec tiquette
-
Dans le cas de rptitives imbriques, break fait sortir de la boucle la + interne ; Pour sortir de + d'un niveau, on utilisera le break avec tiquette :
71
Les rptitives
Instruction "break" avec tiquette
boucle : while () { for () { break boucle ; // Ce break nous branche } } // ici cette fois
72
Les rptitives
Instruction "continue"
73
Les rptitives
Exemple
int i ; for ( i = 1 ; i <= 5 ; i++ ) { System.out.println (i) ; if ( i < 4 ) continue ; System.out.println ("Fin " + i) ; } System.out.println ("Fin de boucle") ;
Les rptitives
Solution
1 2 3 4 Fin 4 5 Fin 5 Fin de boucle
75
Les rptitives
Instruction "continue" avec tiquette
-
Dans le cas de rptitives imbriques, continue concerne la boucle la + interne ; Pour descendre de + d'un niveau il y a le continue avec tiquette :
76
Les rptitives
Instruction "continue" avec tiquette
boucle : while (...) { for () { continue boucle ; // Ce continue fait poursuivre } } // la boucle ici
77
78
Dmonstration
Nouvelle variable Classpath avec le chemin du dossier qui contient la classe Clavier et le point qui dsigne le rpertoire courant
79
80
Syntaxe
Dclaration: static void nom-mthode ( liste d'arguments ) { instructions ; } Appel: nom-mthode ( arg1, arg2, ) ;
82
Dclaration
Appel
}
bienvenue( ) ;
}
83
Mthode qui affiche "Tu as (n) ans" en ayant reu en argument une anne de naissance.
public class Exemple2 { static void afficheAge(int anaiss)
Dclaration
{ int age = 2009 - anaiss ; System.out.println("Tu as " + age + " ans") ; } public static void main (String args[]) {
Appel
} }
afficheAge(1983) ;
84
85
Syntaxe
Dclaration:
86
public class Exemple3 { static int somme ( int a, int b ) { int calcul = a + b ; return calcul ; } public static void main (String args[]) {
Appel
} }
Dclaration
87
2. Notion de classe
public class NomDeClasse { // Attributs et mthodes de la classe }
88
Exemple : soit une classe Point, destine manipuler les points d'un plan. - Un objet de type Point sera reprsent par 2 coordonnes entires : x et y (= attributs) ;
89
Il disposera aussi des 3 mthodes suivantes : - initialise : attribue les valeurs de dpart aux coordonnes du point ; - deplace : modifie les coordonnes du point; - affiche : affiche les coordonnes du point;
90
Point - x : integer - y : integer + void initialise (integer, integer) + void deplace (integer, integer)
Mthodes
+ void affiche ()
91
class Point { private int x ; // abscisse private int y ; // ordonne public void initialise (int abs, int ord) { x = abs ; y = ord ; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Mes coordonnees:" + x + " " + y) ; } } (*)
92
Cette classe Point sert instancier (= crer) des objets de type Point et leur appliquer volont les mthodes disponibles ;
Pour faire appel une mthode de la classe : objet.mthode()
Nous pouvons utiliser la classe Point depuis la mthode main d'une autre classe ;
93
public class TstPoint { public static void main (String args[]) { Point a ; a = new Point() ; a.initialise(3, 5) ; a.affiche() ; a.deplace(2, 1) ; a.affiche() ; Point b = new Point() ; b.initialise(6, 8) ; b.affiche() ; } }
94
95
3. Notion de constructeur
Dans la classe Point, il faut toujours commencer par la mthode 'initialise' ; Peu pratique ;
96
97
Constructeur qui remplace la mthode 'initialise' public Point (int abs, int ord) { x = abs ; y = ord ; }
98
99
Autre changement
Il n'est plus ncessaire maintenant de faire appel la mthode initialise On obtient donc :
100
public class TstPoint { public static void main (String args[]) { Point a = new Point(3, 5) ; // Cette commande fait appel au constructeur...
101
Un constructeur ne renvoie aucune valeur, aucun type ne doit figurer devant son nom, pas mme void ;
Lorsqu'une classe ne comporte pas de constructeur, Java considre un constructeur vide sans arguments ;
102
104
4. Accesseurs et modificateurs
Java permet plusieurs types d'accs pour les attributs, mthodes et constructeurs d'une classe :
private : accessible uniquement ds la classe courante ; public : accessible dans toutes les classes ; (nant) : accessible par les classes du mme package ;
105
Exemple
Soit une classe 'Anne' qui contient un attribut entier 'an' ; Prvoir un constructeur qui initialise 'an' ; Prvoir un modificateur pour permettre par la suite la modification de l'attribut avec un contrle de validit (valeur comprise entre 1950 et 2007) ; Prvoir un accesseur pour permettre la lecture de son contenu ;
107
public class Annee { private int an; public Annee (int newAn) { an = newAn; } public void setAn (int newAn) { if (newAn >= 1950 && newAn <= 2007) an = newAn; } public int getAn () { return an; }
108
public class TestAn { public static void main (String args[]) { Annee a ;
a = new Annee(1987) ; System.out.println (An : + a.an); // erreur car an est private System.out.println (An : + a.getAn()); // OK car getAn() est public
109
Comme vu prcdemment, les variables de type classe contiennent des rfrences sur des objets ; Lorsqu'une affectation porte sur une variable de type classe, c'est la rfrence qui change et non l'objet lui-mme !!!
110
if (a == b) // NON car on teste les adressesmmoires des objets ! If (a.getX()==b.getX() && a.getY()==b.getY()) // en supposant quon ait cr des mthodes accesseurs
112
Si on excute l'instruction :
a=b; c'est la rfrence de a qui devient la rfrence de b ;
a et b dsignent donc le mme objet et il n'y a plus aucune rfrence vers le premier objet !!!
113
Il n'existe pas d'instruction qui permet de librer l'espace inutilisable car Java dispose d'un mcanisme de gestion automatique de la mmoire :
le GARBAGE COLLECTOR
114
travaille en arrire-plan ; libre la place occupe par les instances non rfrences ; compacte la mmoire occupe ;
Il intervient :
quand le systme a besoin de mmoire; ou, de temps en temps avec une priorit faible ;
115
6. Surdfinition ou surcharge
Dans ce cas, c'est la signature de la mthode qui permet au compilateur de faire la diffrence (= nombre et type d'arguments) ;
116
// 2me constructeur
117
Lors de l'instanciation : Point a = new Point ( ) ; // Fait appel au 2me constructeur Point b = new Point (4, 6) ;
118
// deplace (int)
119
Lors de l'excution : Point a = new Point ( ) ; a.deplace(5) ; // Appelle deplace(int) a.deplace(2, 2) ; // Appelle deplace(int, int)
120
http://java.sun.com/
121
Les attributs existent dans chacune des instances de la classe. On les appelle des variables d'instance. Soit la classe : class A { private int n; private float y ; }
122
Avec :
A a1 = new A( ) ; A a2 = new A( ) ;
objet a2
123
Java permet de dfinir des variables de classe, elles n'existeront qu'en un seul exemplaire, quel que soit le nombre d'objets instances de la classe ;
Il suffit de les dclarer avec l'attribut 'static' ;
Exemple : classe avec un champs statique destin contenir le nombre d'objets dj crs ;
124
class Obj { private static int nb = 0 ; public Obj() { nb++ ; System.out.println ("Il y a " + nb + " objet(s)") ; } } public class TstObj { public static void main (String args[ ]) { Obj a = new Obj( ) ; Obj b = new Obj( ) ; Obj c = new Obj( ) ; } } Qu'affichera ce programme ?
125
b) De manire analogue, certaines mthodes peuvent avoir un rle indpendant d'un quelconque objet ; Une telle mthode est dite mthode de classe ; Elle ne pourra agir que sur des variables de classe, puisque par nature elle n'est lie aucun objet en particulier ;
126
public class TstObj2 { public static void main (String args[]) { Obj a = new Obj() ; Obj b = new Obj() ; Obj c = new Obj() ; System.out.print ("Nbre d'objets = " + Obj.getNb( ) ) ; /* Ici pour faire appel la mthode getNb, on ne mentionne pas un nom d'objet particulier car la mthode est statique... on l'appelle avec Obj.getNb() !!! */ } }
128
Pour faire appel une variable de classe ou une mthode de classe, il n'est pas ncessaire d'instancier un objet de la classe concerne, il suffit de mentionner : NomDeClasse.variableDeClasse ou NomDeClasse.mthodeDeClasse( ) ;
129
Mthodes
130
Vous avez dj, au cours des labos prcdents, manipul des variables et des mthodes statiques sans vous en rendre compte Avez-vous une ide desquelles ?
(*)
131
Exercices
1) Parmi les attributs suivants de la classe Renault Espace, la version avec toutes les options possibles, distinguez ceux que vous dclareriez comme statiques des autres :
132
2)
class Test { private int a ; public Test (int b) {a=b;} } public class PrincipalTest { public static void main (String args[]) { Test unTest = new Test ( ) ; } }
133
3)
Une erreur s'est glisse dans le code suivant, laquelle ? class Test { private int a ; private int c ; public Test (int b) {a=b;} public static int getC() { return c ; } } public class PrincipalTest { public static void main (String args[]) { Test unTest = new Test (5) ; } }
134
En Java, ce sont des objets ; Il faut donc utiliser des mthodes pour y accder ; Le 1er lment a pour indice 0 ;
135
1. Dclaration
Les lments d'un tableau peuvent tre de type primitif ou de type objet ;
136
137
int tab1[] = {1, 8, 5, 6} ; int tab2[] = {n, n+2} ; char tab3[] = {'a', 'b', 'c'} ;
La notation {} ne peut tre utilise que lors de la dclaration, par la suite il faut initialiser les lments un par un
138
System.out.print (tab[4]) ;
La variable 'length' retourne le nombre d'lments d'un tableau ; Exemple : Parcours d'un tableau
for (i = 0 ; i < tableau.length ; i++) { }
Remarque : on crit tableau.length sans parenthses car length est un champ public de l'objet tableau et non une mthode
140
5. Exercices
Que donne l'excution du code suivant ?
public class Affectation { public static void main (String args[]) { int i ; int t1[] = {1, 2, 3} ; int t2[] = new int[5] ; for (i=0 ; i<5 ; i++ ) t2[i] = 2*i ; t2 = t1 ; for (i=0 ; i<t2.length ; i++) System.out.println (t2[i]) ; } }
141
Laffichage donnera :
Avant la modif : 5 Aprs la modif : 10
(k est garnie avec la valeur reue en argument) (on a modifi le contenu de la variable locale k qui est dtruite en sortant de la procdure)
144
b)
Lorsqu'on transmet un tableau en argument, on envoie la rfrence du tableau (= son adresse), la mthode agit alors directement sur le tableau concern et non sur une copie (=passage par rfrence) public class TransmReference { public static void main(String[] args) { int t[] = {4,8} ; modifTab(t); // On envoie l'adresse du tableau... System.out.println(t[0]) ; } static void modifTab (int tab[]) { tab[0] = 3 ; System.out.println(tab[0]) ; } }
145
public class TabPoint { public static void main (String args[]) { Point t1[]; // dclaration du tableau t1 = new Point[3]; // cration du tableau t1[0] = new Point(2,7); // cration des 3 points t1[1] = new Point(4,21); t1[2] = new Point(11,3); for (i=0 ; i<t1.length ; i++) t1[i].affiche() ;// affichage des 3 points }
}
147
En Java, une chane de caractres est un objet ; Java propose plusieurs classes apparentes aux chanes de caractres :
la classe String = chanes de caractres non modifiables ; la classe StringBuffer = chanes de caractres modifiables volont ;
148
1. La classe String
149
Dclaration :
String prnom = new String ("Cline") ;
ou
String prnom = "Cline" ;
150
Comparaison :
String prnom = new String ("Hugo") ; String autrePrnom = new String ("Hugo") ; if (prnom == autrePrnom) System.out.println ("Vrai") ;
else
System.out.println ("Faux") ; Qu'affichera cette squence d'instructions ?
151
else
System.out.println ("Prnoms diffrents") ;
152
Remarque :
153
switch (prnom.compareTo(autrePrnom)) { case 0 : System.out.print("Identiques"); break ; case -1 : System.out.print(prnom + " infrieur " + autrePrnom) ; break; case 1 : System.out.println (prnom + " suprieur " + autrePrnom) ; break ; }
154
Concatnation :
String identit = prnom.concat(nom) ;
ou
String nom = " Julien " + " Decroix" ;
155
L'ancienne chane "Bonjour" ne sera plus rfrence et un nouvel objet String est cr ;
156
Extraction de sous-chane :
String msg = "Bienvenue ici" ; String extrait = msg.substring(4, 8) ;
Une surcharge de cette mthode permet galement d'extraire des caractres partir de jusqu'au bout de la chane :
String fin = msg.substring (4) ; envoie la chane "venue ici" dans fin ;
157
Mthodes de conversions :
toLowerCase() : convertit une chane en minuscules ;
Rappel :
Ces mthodes de conversion provoquent la cration d'une nouvelle chane puisque les objets de la classe String ne peuvent tre modifis
160
2. La classe StringBuffer
Un StringBuffer peut tre utilis partout o un String l'est ; Il est plus flexible puisqu'il peut tre modifi ;
161
2. La classe StringBuffer
Voici quelques-unes de ses mthodes :
append charAt insert replace setCharAt . capacity . delete . length . reverse . substring
162
Dclaration :
StringBuffer a = new StringBuffer () ;
chane vide d'une capacit initiale de 16 caractres
163
Utilisation :
StringBuffer strBuff = new StringBuffer () ;
strBuff.append ("Cours") ;
strBuff.append (" de Java") ; strBuff.insert (9, "HTML et ") ;
Un StringBuffer volue dynamiquement : si on augmente la longueur de son contenu, l'espace mmoire allou augmente automatiquement.
164
capacity() : retourne le nombre de caractres qu'un StringBuffer peut recevoir ; length() : retourne le nombre de caractres effectivement placs dans le StringBuffer ; setLength(int) : lui attribue une longueur ; si elle est plus courte que son contenu, la fin sera tronque ; si elle est plus longue, son contenu est complt par des caractres nuls ('\u000') ;
165
IX. L'hritage
166
L'hritage permet de dfinir une classe drive partir d'une classe existante ; La classe drive hrite des champs et mthodes de la classe de base ;
Pas d'hritage multiple en Java : une classe peut hriter d'une seule autre ;
167
1. Gnralisation - spcialisation
On dit quune classe-fille (ou sous-classe) spcialise sa classe-mre (ou super-classe) ; Tandis quune classe-mre gnralise sa classefille ;
168
Ajouter des mthodes, des variables et des constructeurs ; Surcharger des mthodes ; Redfinir des mthodes ;
169
private int x, y ;
public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }
170
private int x, y ;
public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }
Imaginons que nous ayons besoin d'une classe Pointcol, destine manipuler des points colors d'un plan ; Elle disposera des mmes fonctionnalits que Point et une mthode "colore" charge de dfinir la couleur ;
171
private int x, y ;
public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }
{ private byte couleur ; public void colore (byte couleur) { this.couleur = couleur ; } }
172
Nous pouvons maintenant dclarer des variables de type Pointcol : public class TestPointcol // Classe utilisant Pointcol { public static void main (String args[]) { Pointcol pc = new Pointcol() ; pc.initialise (3, 5) ; // Mthode de la classe de base pc.colore ((byte)3) ; // Mthode de la sous-classe pc.deplace (2, -1) ; pc.affiche() ; } }
173
Remarque
Si on veut ajouter Pointcol une mthode affichec fournissant la fois les coordonnes du point et sa couleur, ceci ne sera pas permis :
public void affichec () { System.out.println ("Je suis en " + x + " " + y) ; System.out.println ("Ma couleur est " + couleur) ;}
174
Remarque
Pour crire la mthode affichec, on peut s'appuyer sur la mthode affiche de Point :
public void affichec () { affiche() ; // Equivalent this.affiche() ; System.out.println ("Ma couleur est " + couleur) ; }
175
2. Hritage et constructeurs
Si un constructeur d'une classe drive n'appelle pas le constructeur de sa classe de base, c'est le constructeur sans argument de celle-ci qui sera d'abord excut, puis celui de la classe drive ;
176
Exemple 1
class Mere { public Mere() { System.out.println ("Constructeur mre") ; } } class Fille extends Mere { public Fille() // Pas d'appel explicite : appel par dfaut { System.out.println ("Constructeur fille") ; } } public class TestFille { public static void main (String args[]) { Fille a = new Fille() ; } }
Si un constructeur d'une classe drive appelle un constructeur de sa classe de base, il doit obligatoirement s'agir de la premire instruction du constructeur et ce dernier est dsign par le mot-cl super ;
178
Exemple 2
class Mere { private String prenom ; public Mere(String prenom) { this.prenom = prenom ; } } class Fille extends Mere { public Fille(String nom) { super (nom) ; // Appel explicite du constructeur System.out.println ("Constructeur fille") ; } } public class TestFille { public static void main (String args[]) { Fille a = new Fille("Cline") ; } }
179
3. Modificateurs de visibilit
Rappel
Une classe possde 2 degrs de visibilit : - public : - (nant) : accessible partout ; accessible par les classes du package ;
180
3. Modificateurs de visibilit
public : accessible partout ; (nant) : accessible par les classes du package ; protected : accessible par les classes du package et les classes drives ;
181
4. Redfinition et surcharge
Surcharge = plusieurs mthodes qui portent le mme nom mais qui ont une signature diffrente ; Elles peuvent se trouver dans la mme classe ou dans une classe et ses descendantes ;
182
Redfinition = possibilit de redfinir dans une sous-classe une mthode qui existe dj dans la super-classe (mme signature) ; L'interprteur cherche la mthode invoque partir de la classe concerne et remonte jusqu' la premire rencontre ;
184
Redfinition public class C extends A { public void methodeX(int k) { } } C possde 1 seule mthode
185
Exemple de redfinition
class Employe { }
186
class Employe { private String nom ; protected float salaire ; public Employe (String nom, float salaire) { this.nom = nom ; this.salaire = salaire ; } public float calculSalaire () // pour calculer le salaire { float sal = salaire * 0.85f ; // 15 % de prcompte... return sal ; } }
187
class Representant extends Employe // Classe qui hrite de Employe { private float chAff ; public Representant (String nom, float salaire, float chAff) { super (nom, salaire) ; this.chAff = chAff ; } public float calculSalaire () // Redfinition de la mthode // calculSalaire de la super-classe { float salRepr = super.calculSalaire() + (chAff * 0.1f) ; return salRepr ; } }
188
public class RepresentantEmploye { public static void main(String args[]) { Employe moi = new Employe ("Desmarets", 1000) ; Representant toi = new Representant ("Dubois", 1000, 3000) ; System.out.println ("Je gagne " + moi.calculSalaire() + " comme employe") ; System.out.println ("Tu gagnes " + toi.calculSalaire() + " comme representant") ; } }
189
5. Polymorphisme
Vient du grec et signifie : qui peut prendre plusieurs formes. En POO : aptitude d'un mme message dclencher des oprations diffrentes, selon l'objet auquel il est destin ;
190
Exemple :
int type ; float salaire ; Employe e ; System.out.print ("Type ? (1:Employe - 2:Representant) ") ; type = Clavier.lireInt() ; if (type == 1) { e = new Employe("Dupond", 1000) ; } else { e = new Representant("Dupond",1000, 3000) ; } System.out.println ("Salaire : " + e.calculSalaire() + " euros") ;
191
Exemple :
int type ; float salaire ; Employe e ;
/* Obligation de dclarer la rfrence la classe de base ici !!! */ System.out.print ("Type ? (1:Employe - 2:Representant) ") ; type = Clavier.lireInt() ; if (type == 1) { e = new Employe("Dupond", 1000) ; } else { e = new Representant("Dupond",1000, 3000) ; } System.out.println ("Salaire : " + e.calculSalaire() + " euros") ;
192
A l'excution du programme, le code de la mthode "calculSalaire" lancer est dtermin suivant la classe de l'objet !!! Pour utiliser le polymorphisme, il faut runir les conditions suivantes :
Avoir une arborescence d'hritage ; L'utiliser par une rfrence d'objet de la classe de base ; Avoir 2 mthodes de mme signature dfinies l'une dans la classe de base, l'autre dans la classe drive ;
193
Remarque
Et si, pour un reprsentant, on veut faire ensuite appel une mthode propre la sous-classe ?
e.methPropreRepr() ; // Erreur de compilation
194
Le mot-cl 'final', appliqu une variable, empche sa modification aprs une premire initialisation ; Une mthode dclare 'final' ne peut tre redfinie dans une classe drive ; Une classe dclare 'final' ne peut tre drive ;
195
196
Intrt ?
On peut placer dans une classe abstraite toutes les fonctionnalits dont on veut disposer dans ses descendantes :
197
Exemple
abstract class Employe { public void engager( ) { System.out.println("Pot daccueil"); } public abstract void licencier( ) ; // pas d'instruction, juste '; } class Ouvrier extends Employe { public void licencier() { System.out.println("Dehors !") ; } } class Patron extends Employe { public void licencier() { System.out.println("Vous comprendrez que dans la conjoncture actuelle ... ") ; } }
198
Autre exemple
199
8. Les interfaces
Nous venons de voir qu'une classe abstraite permet de dfinir dans une classe de base des fonctionnalits communes toutes ses descendantes, tout en leur imposant de redfinir certaines mthodes ;
Si l'on considre une classe abstraite n'implmentant aucune mthode et aucun champs, on aboutit la notion d'interface ;
200
8. Les interfaces
La notion d'interface est cependant plus riche qu'un cas particulier de classe abstraite :
une classe ne peut hriter que d'une seule autre ; une classe peut implmenter plusieurs interfaces ;
201
202
Remarque : on hrite (extends) d'une classe mais on implmente (implements) une interface !!!
203
204
9. La classe Object
elle ne contient aucune variable d'instance ni variable de classe ; elle fournit plusieurs mthodes qui sont donc disponibles pour toutes les classes ;
205
9. La classe Object
toString() : renvoie une description de l'objet sous forme de chane (type & adresse) ; clone() : cre et renvoie une copie de l'objet (mthode protected !) ; equals(objet) : indique si un autre objet est gal celui-ci ;
206
X. Les exceptions
Intrt ? Traiter un fonctionnement anormal d'une partie de code (erreur, cas exceptionnel) ;
207
Sans exception
// Insertion d'un livre la nime place d'une tagre int n ; n = Clavier.lireInt() ; if (n " est un nombre valable" ) { if (" tagre n'est pas remplie" ) { etage.add(livre,n) ; // Le traitement "normal" est noy } // dans les traitements d'erreurs else { System.out.println("Etagre pleine)" ; } else { System.out.println("Mauvais n de livre") ; }
// 2 traitements d'erreurs
208
Avec exception
int n ; try { }
n = Clavier.lireInt() ; etage.add(livre,n) ;
X. Les exceptions
Java fournit de nombreuses classes drives de la classe Exception : - les exceptions standard ou implicites qui ne doivent tre mentionnes dans une clause throw ; - les exceptions explicites qui doivent tre traites par une mthode ou tre mentionnes dans la clause throws ;
210
a) Exceptions standard
Exemple :
211
public class ExcStd1 { public static void main (String args[]) { int t[] ; System.out.print ("Taille ? ") ; int n = Clavier.lireInt() ; t = new int[n] ; System.out.print ("Indice : ") ; int i = Clavier.lireInt() ; t[i] = 12 ; for (i=0 ; i<n ; i++) { System.out.println (t[i] + " ") ; } }
212
public class ExcStd1 { public static void main (String args[]) { try { int t[] ; System.out.print ("Taille ? ") ; int n = Clavier.lireInt() ; t = new int[n] ; System.out.print ("Indice : ") ; int i = Clavier.lireInt() ; t[i] = 12 ; for (i=0 ; i<n ; i++) { System.out.println (t[i] + " ") ; } } catch (NegativeArraySizeException e) { System.out.println ("Exception taille tableau negative : " + e.getMessage() ) ; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Exception indice tableau : " + e.getMessage() ) ; } } }
213
IMPORTANT La mthode getMessage( ) de la classe Exception retourne le message associ l'instance de l'exception leve
214
Exercice :
public class ExcStd2 { public static void main (String args[]) { int somme=0, cpt=0, nb, moy ; nb = Clavier.lireInt() ; while (nb != 0) { somme+=nb ; cpt++ ; nb = Clavier.lireInt() ; } try { moy = somme / cpt ; System.out.println ("La moyenne vaut " + moy) ; } catch (ArithmeticException e) { System.out.println ("Erreur : " + e.getMessage() ) ; } } }
215
b) Exceptions explicites
Base de la gestion d'exception : - dclencher une exception ; - la traiter dans un gestionnaire ; Exemple : Dclenchement d'une exception non standard avec throw
216
class Point { public Point(int x, int y) throws ErrConstr /* Mthode susceptible de dclencher une exception de type ErrConst */ { if ( (x<0) || (y<0)) throw new ErrConstr() ; // Ici je lance l'exception... this.x = x ; this.y = y ; } public void affiche() { System.out.println ("coordonnees : " + x + " " + y) ; } private int x, y ; }
class ErrConstr extends Exception /* Java impose que cette classe {} hrite de la classe standard Exception !!! */
217
public class Except1 { public static void main (String args[]) { try { Point a = new Point (1, 4) ; a.affiche() ; a = new Point (-3, 5) ; // Instr qui va provoquer l'exception... a.affiche() ; } catch (ErrConstr e) { System.out.println ("Erreur construction ") ; System.exit (-1) ; } } }
218
Bloc finally
// Traitement de l'exception
219