Académique Documents
Professionnel Documents
Culture Documents
Cours 2
Mohamed DIALLO
diallo.med@gmail.com
1
NFP121
Sommaire
• Classe syntaxe
• Création d'instances
– Ordre d'initialisation des champs
• Constructeur
• Surcharge
• Encapsulation
– Règles de visibilité
– Paquetage
• Classes imbriquées
• Classes incomplètes/abstraites
• Classe et exception
• Quelques instructions
2
NFP121
Bibliographie utilisée
• Data Structures and Problem Solving Using Java. Mark Allen Weiss. Addison
Wesley http://www.cs.fiu.edu/~weiss/#dsj
• http://java.sun.com/docs/books/jls/
• http://java.sun.com/docs/books/tutorial.html
3
NFP121
Classe : Syntaxe
• class NomDeClasse {
type variable1DInstance;
type variable2DInstance;
type variableNDInstance;
}
type nom2DeMethode( listeDeParametres) {
}
type nomNDeMethode( listeDeParametres) {
}
• }
4
NFP121
Classe : Syntaxe et visibilité
• visibilité class NomDeClasse {
visibilité type variable1DInstance;
visibilité type variable2DInstance;
visibilité type variableNDInstance;
}
visibilité type nom2DeMethode( listeDeParametres) {
}
visibilité type nomNDeMethode( listeDeParametres) {
}
• }
5
NFP121
Démonstration
6
NFP121
Exemple, bis: la classe des polygones réguliers
• Opérateur "."
– appels de méthodes ( si accessibles)
– accès aux champs ( si accessibles)
• en passage de paramètre
– par valeur (soit uniquement la référence de l'objet)
8
NFP121
Instances et mémoire
Données
pour q
q
p Données
pour p
9
NFP121
Utilisation de la classe
• p1.initialiser(4,100);
• System.out.println(" surface de p1 = " + p1.surface());
• p2.initialiser(5,10);
• System.out.println(" perimetre de p2 = " + p2.perimetre());
• } appels de méthodes
10
NFP121
Instances et appels de méthodes
p1.initialiser(4,100);
100
4
p1 Données
pour p1
Pile d ’exécution
avant l ’appel de la
méthode initialiser
11
NFP121
Initialisation des variables d'instance
12
NFP121
Constructeur
• ....
13
NFP121
Constructeur par défaut
• public class PolygoneRegulier{
• private int nombreDeCotes;
• private int longueurDuCote;
• int perimetre(){...}
• int surface(){....}
• }
appel du constructeur
par défaut
14
NFP121
Destructeurs et ramasse miettes
15
NFP121
La référence this
16
NFP121
this et l’appel d ’une méthode
this
p1 p1.perimetre();
Données
Pile d ’éxecution
pour p1 pendant l ’appel de la
p1.perimetre();
Pile d ’éxecution méthode perimetre
avant l ’appel de la
méthode perimetre
17
NFP121
Surcharge, polymorphisme ad'hoc
• Polymorphisme ad'hoc
– Surcharge( overloading),
– plusieurs implémentations d'une méthode en fonction des types
de paramètres souhaités, le choix de la méthode est résolu
statiquement dès la compilation
18
NFP121
Démonstration suite
19
NFP121
Surcharge, présence de plusieurs
constructeurs
• public class PolygoneRegulier{
• private int nombreDeCotes;
• private int longueurDuCote;
• PolygoneRegulier () {
• nombreDeCotes = 0;
• longueurDuCote = 0;
• }
• ......
• PolygoneRegulier () {.... }
21
NFP121
Un autre usage de this
– PolygoneRegulier () {
– this( 1, 1); // appel du constructeur d'arité 2
– }
– }
22
NFP121
Affectation
• affectation de références =
p1 p2
4 5
100 10
• p1 = p2
p1 p2
4 5
100 10
23
NFP121
Affectation : attention
24
NFP121
Objet et Partage[Liskov Sidebar2.2,page 22]
25
NFP121
La classe Object, racine de toute classe Java
• ...
• protected native Object clone() ...{...}
• protected void finalize() ...{...}
• ...
• }
26
NFP121
Surcharge(overloading) et Masquage(overriding)
avec héritage
• Masquage (Redefinition): même nom et signature
égale
– (overriding)
27
NFP121
La classe PolygoneRegulier re-visité
• ….
28
NFP121
Exemple: utilisation
• Object o = p1;
• System.out.println(" o: " + o );
• }
• }
29
NFP121
La classe PolygoneRegulier re-re-visité
30
NFP121
Exemple: utilisation
• p1 == p3 : true
– Correct mais ….
31
NFP121
Exemple: utilisation, les hypothèses
• Object o1 = p1;
• Object o3 = p3;
// hypothèses
• o1 doit se comporter comme p1, et o3 comme p3
• Il existe une méthode equals de la classe Object
– public boolean equals(Object o);
32
NFP121
Exemple: utilisation, le résultat
// nous avons
• Object o1 = p1;
• Object o3 = p3;
• }
33
NFP121
equals correction
34
NFP121
Démonstration
35
NFP121
La classe PolygoneRegulier re-re-visité
• @Override
• public boolean equals( Object obj ) { // redéfinition
• if( ! ( obj instanceof PolygoneRegulier ) ) return false; // discussion
• PolygoneRegulier poly = ( PolygoneRegulier ) obj;
• return poly.nombreDeCotes == nombreDeCotes &&
• poly.longueurDuCote == longueurDuCote;
• }
• @Override
• public String toString( ) {
• return "<" + nombreDeCotes + "," + longueurDuCote + ">";
• }
• .....
• }
36
NFP121
Démonstration-suite
37
NFP121
Champs d’instance
p1 = new polygoneRegulier(4,100);
Issus de
PolygoneRegulier
38
NFP121
Affectation polymorphe
– System.out.print( p.toString());
– o = p;
– System.out.print( o.toString());
– Object o1 = p1;
– boolean b = o1.equals(o); PolygoneRegulier
39
NFP121
Types et hiérarchie[Liskov Sidebar2.4,page 27]
40
NFP121
Sélection de la bonne méthode(1)
obj = p;
System.out.print( obj.toString()); // Table[obj.classe constatée][2]
Object 2
toString()
obj
PolygoneRegulier 2
p Issus d ’Object
toString()
Issus de
PolygoneRegulier
42
NFP121
Encapsulation
• Plusieurs classes
– Paquetage : le répertoire courant est le paquetage par défaut
– Paquetages utilisateurs
– Paquetages prédéfinis
– liés à la variable d'environnement CLASSPATH
43
NFP121
Règles de visibilité:
public, private et protected
• modifieurs d'accès
– private
– par défaut, sans modifieur
– protected
– public
44
NFP121
Règle d'accès
45
NFP121
Encapsulation classe imbriquée
• Encapsulation effective
• Structuration des données en profondeur
• Contraintes de visibilité
46
NFP121
La classe imbriquée: exemple
• public class PolygoneRegulier{
• private int nombreDeCotes;
• private int longueurDuCote;
• private Position pos;
47
NFP121
La classe imbriquée statique
48
NFP121
La classe anonyme
49
NFP121
Package
c:\
• Instructions
– package pkg1[.pkg2[.pkg3];
– import pkg1[.pkg2[.pkg3].(nomdeclasse|*); .
pkg1
• Ils peuvent être regroupés dans un .ZIP et .JAR
pkg2
pkg3
50
NFP121
Paquetage java.
51
NFP121
L'interface, première approche
• la clause interface
– visibilité interface NomDeLInterface{
– }
• la clause implements
– class NomDeLaClasse implements nomDeLInterface, Interface1{
– }
52
NFP121
Interface et référence
• une "variable Objet" peut utiliser une interface comme type
• une instance de classe implémentant cette interface peut lui être affectée
– interface I{
– void p();
– }
– class A implements I {
– public void p() { .... }
– }
– class B implements I {
– public void p(){ ....}
– }
– class Exemple {
– I i;
– i = new A(); i.p(); // i référence le contenu d ’une instance de type A
53
NFP121
Exemple prédéfini : Interface Enumeration
– avec
– public class java.util.Vector{
– ....
– public final Enumeration elements(){ }
54
NFP121
Enumeration++ Interface Iterator
55
NFP121
Classe incomplète
– abstract class A{
– abstract void p();
– int i; // éventuellement données d'instance
– static int j; // ou variables de classe
– void q(){
– // implémentation de q
– }
– }
56
NFP121
Classe incomplète: java.lang.Number
57
NFP121
Exceptions
• Caractéristiques
– Condition anormale d'exécution
– instance de la classe "Throwable" ou une sous-classe
– A l'occurrence de la condition, une instance est créée et levée par
une méthode
• Hiérarchie de la classe "Throwable"
Object
|___Throwable
|____Error
| .....
|____Exception
|___AWTException
|___ClassNotFoundException
|....
|___IOException
|___RunTimeException
|___Définie par l'utilisateur 58
NFP121
Le bloc exception
• try {
• instructions;
• instructions;
• instructions;
• } catch( ExceptionType1 e){
• traitement de ce cas anormal de type ExceptionType1;
• } catch( ExceptionType2 e){
• traitement de ce cas anormal de type ExceptionType2;
• throw e; // l'exception est propagée
• //( vers le bloc try/catch) englobant
• } finally (
• traitement de fin de bloc try ;
• }
59
NFP121
Le mot clé throws
• type NomDeMethode (Arguments) throws liste d'exceptions {
– corps de la méthode
• }
• RunTime Exceptions
– Levée par la machine java
– Elles n'ont pas besoin d'être filtrée par l'utilisateur, un gestionnaire
est installé par défaut par la machine
61
NFP121
Java quelques éléments de syntaxe
• types primitifs
• variables de type primitif
• types structurés
• Opérateurs
• Instructions
62
NFP121
Types primitifs
• entier
– signés seulement
– type byte ( 8 bits), short ( 16 bits), int ( 32 bits), long ( 64 bits)
• flottant
– standard IEEE
– type float( 32 bits), double (64bits)
• booléen
– type boolean (true,false)
• caractère
– unicode,
– type char (16 bits) http://www.unicode.org
63
NFP121
Variables de type primitif
• type nom_de_la_variable;
• type nom1,nom2,nom3;
• type nom_de_la_variable = valeur;
• exemples :
– int i;
– int j = 0x55AA0000;
– boolean succes = true;
64
NFP121
Passage de paramètres par valeur
uniquement
– static int plusGrand(int x, int y, int z){
– ...
– }
z 4
y 3
Appel de plusGrand(a,b,4); x 2
c 4 c 4
b 3 b 3
a 2 a 2
65
NFP121
Type entier et Changement de type
• Automatique
– si la taille du type destinataire est supérieure
– byte a,b,c;
– int d = a+b/c;
• Explicite
– byte b = (byte)500;
– b = (byte)( b * 2); // b * 2 promue en int
66
NFP121
Conversions implicites
• Automatique
– si la taille du type destinataire est supérieure ….
67
NFP121
Application Java, un exemple
i = i * 2;
68
NFP121
La classe Conversions : Conversions.java
public class Conversions{
b=(byte) 0; s = b; i = b; l = b; f = b; d = b;
i = s; l = s; f = s; d = s;
i = c; l = c; f = c; d = c;
l = i; f = i; d = i;
f = l; d = l;
d = f;
}
}
69
NFP121
Type caractère
• http://www.unicode.org
70
NFP121
Opérateurs
• Arithmétiques
– +, -, *, /, %, ++ +=, -=, /=, %=, --, Syntaxe C
• Binaires
– ~, &, |, ^, &=, |=, ^=
– >>, >>>, <<, >>=, >>>=, <<=
• Relationnels
– ==, !=, >, <, >=, <= Syntaxe C
• Booléens
– &, |, ^, &=, |=, ^=, ==, !=, !, ?:
– ||, &&
71
NFP121
Opérateurs booléens et court-circuits, exemple
• 1 public class Div0{
• 2 public static void main( String args[]){
• 3 int den = 0, num = 1;
• 4 boolean b;
• 5
• 6 System.out.println("den == " + den);
• 7
• 8 b = (den != 0 && num / den > 10);
• 9
• 10 b = (den != 0 & num / den > 10);
• 11 }
• 12}
72
NFP121
Précédence des opérateurs
+ () [] .
++ -- ~ !
* / %
+ -
>> >>> <<
> >= < <=
== !=
&
^
|
&&
||
- ?:
=
73
NFP121
Type structuré : tableau
• Déclarations de tableaux
– int[] mois; // mois est affecté à null ....
– ou int[] mois = new int[12];
– ou int[] mois={31,28,31,30,31,30,31,31,30,31,30,31};
74
NFP121
Passage de paramètres par valeur
uniquement
– static void trier(int[] tab){
– tab[0] = 8; // --> t[0] == 8;
–
– int[] t = {2,4,3,1,5};
– trier(t);
Appel de trier(t);
Un extrait
de la pile tab
d’exécutio
n
t t[4] 5 t
t[3] 1
t[2] 3
t[1] 4
t[0] 2
75
NFP121
Instructions de contrôle
• branchement
– if else, break, switch, return // syntaxe C
• Itération
– while, do-while, for, ',' , continue // syntaxe C
• Exceptions
– try catch finally, throw
76
NFP121
Instruction de branchement, if else
77
NFP121
if (false) : compilation conditionnelle
78
NFP121
Instructions de branchement, swicth case
• switch ( expression) {
• case value1 :
• break;
• case value2 :
• .....
• case value3 :
• break;
• case valueN :
• break;
• default :
• }
79
NFP121
swicth case, exemple
public class SwitchSaison{
public static void main( String[] args){
int mois = 4; String saison;
switch (mois){
case 12: case 1: case 2:
saison = "hiver";
break;
case 3: case 4: case 5:
saison = "printemps";
break;
case 6: case 7: case 8:
saison = "ete"; break;
case 9: case 10: case 11:
saison = "automne"; break;
default:
saison = "";
}
System.out.println("Avril est au " + saison + ".");
}}
80
NFP121
Itérations
• while ( expression) {
• instructions
• }
81
NFP121
Itération, for( ; ; ,), exemple
String[] mois={"janvier","fevrier","mars","avril","mai","juin",
"juillet","aout","septembre","octobre","novembre","decembre"};
int[] jours={31,28,31,30,31,30,31,32,30,31,30,31};
String printemps = "printemps";
String ete = "ete";
String automne = "automne";
String hiver = "hiver";
String[] saisons={ hiver,hiver,printemps,printemps,printemps,ete,ete,ete,
automne,automne,automne,hiver};
82
NFP121
break, continue
• for ( ...................){
• ......
• continue;
• .....
• etiquette : for(...............){
• for ( ...................){
• ......
• continue etiquette;
• .....
• }
• }
83
NFP121
Les exceptions: présentation
try {
instructions;
instructions;
instructions;
} catch( ExceptionType1 e){
traitement de ce cas anormal de type ExceptionType1;
} catch( ExceptionType2 e){
traitement de ce cas anormal de type ExceptionType2;
throw e; // l'exception est propagée
// ( vers le bloc try/catch) englobant
} finally (
traitement de fin de bloc try ;
}
84
NFP121
Les exceptions : exemple
m = Integer.parseInt(args[0]);
85
NFP121
Les exceptions : exemple
public class MoisException{
public static void main( String[] args){
String[] mois={"janvier","fevrier","mars","avril","mai","juin",
"juillet","aout","septembre","octobre","novembre","decembre"};
int[] jours={31,28,31,30,31,30,31,32,30,31,30,31};
String printemps = "printemps"; String ete = "ete";
String automne = "automne"; String hiver = "hiver";
String[] saisons={hiver,hiver,printemps,printemps,printemps,ete,ete,ete,
automne,automne,automne,hiver};
int m;
try{
m = Integer.parseInt(args[0]) -1;
System.out.println(mois[m] + " est au/en " +saisons[m] + " avec " + jours[m] + " j.");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("usage : DOS>java MoisException unEntier[1..12]");
}catch(NumberFormatException e){
System.out.println("exception " + e + " levee");
}finally{
System.out.println("fin du bloc try ");
}}}
86
NFP121
L ’exemple initial avec une division par zéro
1 public class Div0{
2 public static void main( String args[]){
3 int den = 0, num = 1;
4 boolean b;
5
6 System.out.println("den == " + den);
7
8 b = (den != 0 && num / den > 10);
9
10 b = (den != 0 & num / den > 10);
11 }
12}
+--java.lang.RuntimeException
ArithmeticException, ArrayStoreException, CannotRedoException,
CannotUndoException, ClassCastException, CMMException,
ConcurrentModificationException, EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException,
NegativeArraySizeException, NoSuchElementException, NullPointerException,
ProfileDataException, ProviderException, RasterFormatException, SecurityException,
SystemException, UnsupportedOperationException
88
NFP121
if(DEBUG) + throw new RuntimeException
if (DEBUG) assert(mois==4);
else mois++;
}
89
NFP121
nullPointerException
– static void trier(int[] tab){
– // levée d’une exception instance de la classe
– // nullPointerException,
– }
–
– int[] t; /** t == null; **/
– trier(t); // filtrée par la machine
– ___________________________________________________
____
– ou bien
– int[] t;
– try{
– trier(t);
–
}catch(nullPointerException e){}
90
NFP121
Classe : Syntaxe, champs et méthodes
"statiques"
• public class NomDeClasse{
– static type variable1DeClasse;
– static type variable2DeClasse;
– public static type variableNDeClasse;
– }
– static type nom2DeMethodeDeClasse( listeDeParametres) {
– }
– static type nomNDeMethodeDeClasse( listeDeParametres) {
– }
– public static void main(String args []){ } // ....
• }
Notion Variables et méthodes globales
91
NFP121
Accès aux champs de classe
• Le mot clé static
• accès en préfixant par le nom de la classe
– exemple la classe prédéfinie "Integer"
– package java.lang;
– public class Integer ... {
– public static final int MAX_VALUE= ...;
– ...
– public static int parseInt(String s){ ...}
– ...
– }
– // accès :
– int m = Integer.parseInt("33");
• Opérateur "."
– appels de méthodes de classe ( si elles sont accessibles)
– accès aux champs de classe ( si accessibles)
92
NFP121
Variables et méthodes de classe
automne,automne,automne,hiver};
public static void main( String[] args){
for(int m = 0; m < 12; m++){
System.out.println(mois[m] + " est au/en " +saisons[m] + "
avec " + jours[m] + " jours.");
}}} 93
NFP121
Définition d'une Classe
94
NFP121
Le bloc static
exécuté une seule fois au chargement de la classe
– public class MoisTer{
– static String[] mois ={"janvier","fevrier","mars","avril","mai","juin",
–
"juillet","aout","septembre","octobre","novembre","decembre"};
– static int[] jours ={31,28,31,30,31,30,31,32,30,31,30,31};
– static String printemps,ete,automne,hiver;
– static String[] saisons ={ hiver,hiver,printemps,printemps,printemps,ete,ete,ete,
– automne,automne,automne,hiver};
– static{
– printemps = "printemps"; ete = "ete";
– automne = "automne"; hiver = "hiver";
– }}
95
NFP121
Application Java
• Caractéristiques
– autonome, sans navigateur
– une ou plusieurs classes
– les classes sont chargées dynamiquement
• Le point d'entrée main
– l'application doit comporter une classe avec la méthode main
– sa signature est public static void main(String[] args)
– appelée par la commande DOS> java suivie du nom de la
classe ayant implémentée la méthode main
• Passage d'argument(s)
– sur la ligne de commande
– DOS> java NomDeClasse Octobre 30
• Gestion des paramètres dans l'application
– tous ces paramètres sont de "type" String
– conversion en entier par exemple
– int x = Integer.parseInt(args[0]); // classe Integer
96
NFP121
Application Java : style d’écriture(1)
97
NFP121
Application Java : style d’écriture(2)
98
NFP121
Package
• Fonction
– Unité logique par famille de classes
c:\
– découpage hiérarchique des paquetages
– (ils doivent être importés explicitement sauf
java.lang)
• Buts rep1 rep2
– espace de noms
– restriction visibilité
• Instructions pkg1 pkg4
– package pkg1[.pkg2[.pkg3];
– les noms sont en minuscules
– c ’est la première instruction du source java
pkg2
– import pkg1[.pkg2[.pkg3].(nomdeclasse|*);
100
NFP121
Résumé
101
NFP121
Annexe
102
NFP121
Exemple d ’une structure de données : une liste
103
NFP121
Une liste: interface UnboundedBuffer
104
NFP121
Une liste: Queue.java (1)
• public class Queue implements UnboundedBuffer {
• class Node {
• Object obj;
• Node next;
• Node(Object obj, Node next){
• this.obj = obj;
• this.next = next;
• }
• }
• Queue(){
• size = 0;
• head = tail = null;
• }
105
NFP121
Une liste: Queue.java(2)
• public int count(){ return size; }
106
NFP121
Une liste: Queue.java(3)
107
NFP121
Une liste: Queue.java(4)
• public java.util.Enumeration elements(){
108
NFP121
Une liste: BufferEmptyException
109
NFP121
Une liste: TstQueue
• for(int i=3;i<8;i++){
• q.put(new PolygoneRegulier(i,i*10));
• }
• System.out.println(q.toString());
• }
• }
110
NFP121
La classe PolygoneRegulier
111
NFP121