Programmation Orientée Objet
Introduction à Java
Frédéric Mallet
http://deptinfo.unice.fr/~fmallet/
F. Mallet ‐ POO 12012‐2013
Programmation Orientée Objet
Organisation du coursVolume Horaire 12*1h30 de cours 12*1h30 de TD machine
Evaluation Contrôle 1 (mi‐parcours) : 35% Contrôle 2 (fin du semestre) : 35% Note de TD : 30%
F. Mallet ‐ POO 22012‐2013
Programmation Orientée Objet
Bibliographie et webographie« Programmer en Java », C. Delannoy, Eyrolles 2012« Pensez en java », B. Eckel, http://pensezenjava.free.fr/Tutoriel Oracle, http://docs.oracle.com/javase/tutorial/
API Java Standard Edition 7, http://docs.oracle.com/javase/7/docs/api/
« Informatique Industrielle et Java », F. Mallet et F. Boéri, Dunod 2003
F. Mallet ‐ POO 32012‐2013
Programmation Orientée Objet
Plan du coursLes basesPolymorphisme: héritage et interfacesExceptionsCollectionsGénéricitéInterface graphique (Swing)Entrées‐sortiesCompléments sur le langage
F. Mallet ‐ POO 42012‐2013
Programmation Orientée Objet
Les basesObjectifs Définir la programmation orientée objet
• Historique• Avantages
Notions essentielles Environnement de développement
F. Mallet ‐ POO 52012‐2013
Programmation Orientée Objet
La programmation impérativeProgrammation concevoir (algorithme) et réaliser (programme) pour une exécution automatique
Algorithme
Impératif: succession d’ordres• Pour calculer le maximum, je parcours les éléments un à un et je les compare à l’élément supposé maximum
Déclaratif• max(T) = { m | t T, t m }
2012-2013 F. Mallet - POO 6
Programmation Orientée Objet
2012-2013 F. Mallet - POO 7
Exemple de la factorielle Impératif
Itératiflong factorielle(int n) {long res = 1;for(int i = 2; i<n; i++) {res = res * i;
}return res;
}
Récursiflong factorielle(int n) {if(n==0) return 1;return n*factorielle(n-1);
}
Déclaratif Fonctionnel / Applicatif
(factorielle (n) (fac n 1))(fac (n acc)((zero? n) acc)(fac (- n 1) (* n acc))
Logiquefactoriel(0,1):-!.
factoriel(N,T):-N1 is N-1,factoriel(N1,T1),T is T1*N.
Programmation Orientée Objet
2012-2013 F. Mallet - POO 8
La Programmation Orientée‐Objet
La POO guide la conception par Un ensemble de concepts
• abstraction, modularité, encapsulation, polymorphisme
Des langages et des outils qui supportent ces concepts• Classification vs. prototype• Héritage (multiple)• Typage : fort/faible, explicite/inféré
Ses forces (supposées) Reflète plus finement les objets du monde réel
• Du code (plus) facile à maintenir• Plus stable : un changement s’applique à un sous‐système facile à identifié et isolé du reste du système
Programmation Orientée Objet
Système de gestion d’un lycée
Objets Personne
Etudiant, enseignant, principal, secrétaire
Diplôme Année, matière, parcours
Bulletin Notes Coefficients
Fonctions Calculer la moyenne Calculer les taux
d’encadrement Calculer le nombre de
redoublants Calculer le taux de réussite
au baccalauréat
2012-2013 F. Mallet - POO 9
Programmation Orientée Objet
2012-2013 F. Mallet - POO 10
Historique Simula 61‐67 : Dahl et Nygaard http://www.simula.no
Smalltalk 72 : A. Kay http://www.smalltalk.org
C++ 81‐86 : Stroustrup Eiffel 85 : B. Meyer http://www.eiffel.com
Java 94‐95 : J. Gosling/Sun http://java.sun.com
Ruby 95 : Y. "Matz" Matsumoto http://www.ruby‐lang.org
C# 2000 : Microsoft http://www.learn‐c‐sharp.com
Turing Award 2001 à Dahl et Nygaard 'for their role in the invention of OOP, the most widely used
programming model today'.
Programmation Orientée Objet
Les basesObjectifs Définir la programmation orientée objet Notions essentielles
• Type, Classe/Objet, instanciation• Variable, Référence• Champ/attribut, méthode
Environnement de développement
F. Mallet ‐ POO 112012‐2013
Programmation Orientée Objet
2012-2013 F. Mallet - POO 12
Types de données (1/2)Les objets Java représentent Les objets du système modélisé
• Une personne (nom, prénom, date de naissance…)• Des formes géométriques (triangle, cercle, …)• Des portes logiques (et, ou, inverseur, mux, …)• Des bases de données et fichiers (images, texte, son, vidéo…)
Programmation Orientée Objet
2012-2013 F. Mallet - POO 13
Types de données (2/2)Le type encode les données Domaine de valeurs Opérations autorisées (arithmétiques, booléennes…)
On distingue Types primitifs (caractères, entiers, réels, booléens) Types composés
• Image = ensemble de pixels de couleur• Couleur = Rouge + Vert + Bleu
Programmation Orientée Objet
2012-2013 F. Mallet - POO 14
Valeurs numériquesChiffres numériques : BInary digiT = BIT Signaux électriques encodés = valeurs logiques Binaire: 2 valeurs logiques (0 et 1)
Ensembles finis: encodés sur plusieurs BITs 1 octet = 8 bits (28 = 256 valeurs logiques) 1 mot = 32 bits (232 valeurs logiques)
Ensembles infinis ? Entiers naturels, nombres réels, …
Programmation Orientée Objet
2012-2013 F. Mallet - POO 15
Type primitif booleanDomaine de valeurs: vrai ou faux {true, false}
Opérations autorisées Affectation =
Comparaison ==, != Opérations booléennes &&, ||, !
Exemples boolean estVisible = true;
if (estVisible) …
Programmation Orientée Objet
2012-2013 F. Mallet - POO 16
Type primitif charDomaine de valeurs: Unicode 16 bits Code ASCII (7 bits: 128 caractères) Code ANSI (8 bits, ISO‐latin‐1, ISO‐8859‐1)
Opérations autorisées Affectation =
Comparaison ==, !=
Exemples char c = 'c'; // code ASCII 99
c = '\u00e9'; // code unicode 00e9 => é
Programmation Orientée Objet
2012-2013 F. Mallet - POO 17
Nombres entiers relatifs Domaine de valeurs
8 bits byte [‐128,127] 16 bits short [‐32768, 32767] 32 bits int [‐231, 231‐1] 64 bits long [‐263, 263‐1] 0l
Opérations autorisées Affectation =
Comparaison ==, != Opérations arithmétiques +, -, *, /, % (int, long) Opérations binaires &, |, ~, <<, >> (int, long)
Division entière: 23 = 3 * 7 + 2 / quotient de la division entière 23/7 → 3 % reste de la division entière 23%7 → 2 23 / 0 Erreur !
Programmation Orientée Objet
2012-2013 F. Mallet - POO 18
Nombres approchés Domaine de valeurs
32 bits float ?? 12.5f
64 bits double ?? -12.5, 1e-23
Opérations autorisées Affectation =
Comparaison ==, != Opérations arithmétiques +, -, *, / Opérations binaires &, |, ~, <<, >>
Particularités Division approchée: 23.0 / 0 → +∞
Programmation Orientée Objet
2012-2013 F. Mallet - POO 19
Nombres approchés – IEEE 754Codage sur 32 bits => 232 valeurs Complément à 2 (int) [‐231, 231‐1] Virgule flottante (float) [‐2128, 2128]
Signe Exposant Mantisse Nombre représentéS E=]0,255[ M
S 0 >00 0 0 +01 0 0 -0- 255 >0 NaN0 255 01 255 0
(-1)Sx2E-127x(1,M)2
(-1)Sx2-126x(0,M)2
+Not a Number !
Programmation Orientée Objet
2012-2013 F. Mallet - POO 20
VariableCase de la mémoire Nom (identifiant): cercle, nom2, _1, … Type : primitif ou composé Valeur : dans le domaine défini par le type
• Change au cours du programme (#constante)
Déclaration int premiere;
Initialisation premiere = 12;
Utilisation premiere = premiere + 1;
Obligatoire: initialisation avant utilisation !
Programmation Orientée Objet
2012-2013 F. Mallet - POO 21
Affectation =Pour donner/forcer une valeur à une variable <variable> = <expression>;
Asymétrique L’expression est évaluée puis la variable est affectée à (prend comme valeur) la valeur calculée
Exemples premiere = 12 + 6 / 5 * 5;
premiere = premiere * 2 + 1;
premiere = Math.max(12, premiere);
Programmation Orientée Objet
2012-2013 F. Mallet - POO 22
Affectations combinées +=Incrémente une variable <variable> += <expression>;
Attention Surchargé pour tous les types numériques
• byte, short, int, long, float, double Différent d’une addition
• byte b = 127;• b = b + b; b += b
Variantes -=, *=, /=, <<=, >>=, &=, |= b++, ++b
Programmation Orientée Objet
2012-2013 F. Mallet - POO 23
Classe = Type composé Types primitifs normalisés par le langage
boolean, char, byte, short, int, long, float, double
Composition => champs/propriétés (nom + type) Couleur : rouge (8 bits) + vert (8 bits) + bleu (8 bits) Image : ensemble de points de couleur Nom : séquence/chaîne de caractères Date : ?
Compromis espace mémoire/temps de calcul Couleur : RGB vs. YUV Nombre complexe: c = re + i.im
ou c = z.ei.θ
Programmation Orientée Objet
2012-2013 F. Mallet - POO 24
Classe: encodage Couleurclass CouleurRGB {
byte rouge;byte vert;byte bleu;
}
class CouleurYUV {byte luminance;byte chrominanceRouge;byte chrominanceBleue;
}
Complexeclass ComplexeCartesien {
double reelle;double imaginaire;
}
class ComplexePolaire {double module;double argument;
}
Programmation Orientée Objet
2012-2013 F. Mallet - POO 25
c2
Objet = instance d’une classeType → valeurs → variables Classe → objets → références
Complexe c1; // référencec1 = new Complexe(1, -1);
Complexe c2; // référencec2 = new Complexe(2, 0);
c1
Programmation Orientée Objet
2012-2013 F. Mallet - POO 26
Méthode = opération sur les objetsNorme d’un complexeclass ComplexeCartesien {double re;double im;
double norme () {return re*re+im*im;
}
double argument () {return Math.atan2(im, re);
}}
class ComplexePolaire {double module;double argument;
double norme() {return module*module;
}
double argument() {return argument;
}}
Programmation Orientée Objet
2012-2013 F. Mallet - POO 27
Notation pointéePour accéder aux membres d’un objet Membre = champs + méthodes
Exemple Complexe c1 = new Complexe();
c1.reelle désigne le champ reelle de c1 c1.norme() désigne la méthode norme de c1
Programmation Orientée Objet
2012-2013 F. Mallet - POO 28
Méthodes et paramètresDonnées supplémentaires Le calcul de la norme nécessite seulement la valeur de ‘reelle’ et de ‘imaginaire’
Certaines méthodes nécessitent des paramètres• Signature
int addition(int x, int y);
• Corpsint addition(int x, int y) {return x + y ;
}
Programmation Orientée Objet
2012-2013 F. Mallet - POO 29
Classe Moyenneclass Moyenne { // bloc de déclaration de classe/** Somme des notes obtenues */int notes = 0 ; /** Nombre de notes obtenues */int nombreDeNotes = 0 ;
/** Ajoute une note à la moyenne* @param note nouvelle note obtenue */void ajouteNote (int note) {
notes += note;nombreDeNotes += 1;
}
/** @return moyenne des notes */double calculMoyenne() {return ((double)notes) / nombreDeNotes ;
}}
Programmation Orientée Objet
Classe StringClasse qui représente une séquence de caractères Classe spéciale (utilisation très fréquente)
• Pas besoin d’utiliser new pour créer des instancesString str = "Un example!";
• Les objets sont immutables (on ne peut pas les modifier)L’expression "rou"+"ge" fait intervenir 3 objets différents
Concaténationint x = 20, y = 40;
"Je place " + x + " euros." "Je place 20 euros."x + y + " euros sont placés." "60 euros sont placés.""Je place " + x + y "Je place 2040"
2012‐2013 F. Mallet ‐ POO 30
Programmation Orientée Objet
Vocabulaire
2012-2013 F. Mallet - POO 31
121
Programmation Orientée Objet
Les basesObjectifs Définir la programmation orientée objet Notions essentielles Environnement de développement
• Java Development Kit (JDK)• Compilation, interprétation, machine virtuelle• Méthode main
F. Mallet ‐ POO 322012‐2013
Programmation Orientée Objet
CompilateurL’ordinateur (son processeur) ne comprend pas le code Java (code source)
Un interpréteur interprète directement le code source (langage interprété)
Le compilateur traduit (compile) le code source Vers du code binaire natif (langage compilé)
• Spécifique à un processeur donné• Spécifique au système d’exploitation utilisé
Vers un langage neutre (ex: bytecode)• Ce langage neutre est alors interprété par la machine virtuelle java(Java Virtual Machine ‐ JVM)
2012‐2013 F. Mallet ‐ POO 33
Programmation Orientée Objet
Processeur
OS
JREAPI
Processus de compilation en Java
2012‐2013 F. Mallet ‐ POO 34
Test.javaFichier source
javac Test.javaCompilation(JDK)
Test.classbytecode java Test
interprétation
JRE 7.0
Windows, Mac, Linux
Intel, AMD, ARM
Write once, Run everywhere
Programmation Orientée Objet
Méthode main – java TestTest.java:
Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
Moyenne.java:
class Moyenne {int notes = 0 ; int nombreDeNotes = 0 ;
void ajouteNote (int note) {notes += note;nombreDeNotes += 1;
}
double calculMoyenne() {return ((double)notes) /
nombreDeNotes ;}
}
2012‐2013 F. Mallet ‐ POO 35
Programmation Orientée Objet
Méthode main – java TestTest.java:
class Test {
static public void main(String[] args) {Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
System.out.println("Moyenne="+m);}
}
Moyenne.java:
class Moyenne {int notes = 0 ; int nombreDeNotes = 0 ;
void ajouteNote (int note) {notes += note;nombreDeNotes += 1;
}
double calculMoyenne() {return ((double)notes) /
nombreDeNotes ;}
}
2012‐2013 F. Mallet ‐ POO 36
Programmation Orientée Objet
Méthode main – java TestTest.java:
class Test {
static public void main(String[] args) {Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
System.out.println("Moyenne="+m);}
}
> dir214 Moyenne.java229 Test.java> javac Test.java> dir411 Moyenne.class214 Moyenne.java744 Test.class229 Test.java> java TestMoyenne=12.666666666666666
2012‐2013 F. Mallet ‐ POO 37
Programmation Orientée Objet
Processeur
OS
Navigateur
JREAPI
Processus de compilation en Java
2012‐2013 F. Mallet ‐ POO 38
Test.javaFichier source
javac Test.javaCompilation(JDK)
Test.classbytecode appletviewer Test
interprétation
JRE 7.0
Mozilla, IE, OperaWrite once, Run everywhere
Programmation Orientée Objet
appletviewer Test.htmlTest.java:
public class Test extends Applet {
public void paint(Graphics g) {Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
g.drawString("Moyenne="+m, 10, 10);}
}
Moyenne.java:
class Moyenne {int notes = 0 ; int nombreDeNotes = 0 ;
void ajouteNote (int note) {notes += note;nombreDeNotes += 1;
}
double calculMoyenne() {return ((double)notes) /
nombreDeNotes ;}
}
2012‐2013 F. Mallet ‐ POO 39
Programmation Orientée Objet
appletviewer Test.htmlTest.java:
public class Test extends Applet {
public void paint(Graphics g) {Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
g.drawString("Moyenne="+m, 10, 10);}
}
Test.html:
<object width="200" height="100"><param name="code"
value="Test.class"></object>
2012‐2013 F. Mallet ‐ POO 40
Programmation Orientée Objet
appletviewer Test.htmlTest.java:
public class Test extends Applet {
public void paint(Graphics g) {Moyenne e = new Moyenne();
e.ajouterNote(8);e.ajouterNote(18);e.ajouterNote(12);
double m = e.calculMoyenne();
g.drawString("Moyenne="+m, 10, 10);}
}
Test.html:
<object width="200" height="100"><param name="code"
value="Test.class"></object>
2012‐2013 F. Mallet ‐ POO 41
> javac Test.java> dir411 Moyenne.class214 Moyenne.java702 Test.class92 Test.html271 Test.java> appletviewer Test.html