Programmation Orientée Objet Introduction à Java
Transcription
Programmation Orientée Objet Introduction à Java
Programmation Orientée Objet Introduction à Java Frédéric Mallet http://deptinfo.unice.fr/~fmallet/ 2012‐2013 F. Mallet ‐ POO 1 Programmation Orientée Objet Organisation du cours Volume 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% 2012‐2013 F. Mallet ‐ POO 2 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 2012‐2013 F. Mallet ‐ POO 3 Programmation Orientée Objet Plan du cours Les bases Polymorphisme: héritage et interfaces Exceptions Collections Généricité Interface graphique (Swing) Entrées‐sorties Compléments sur le langage 2012‐2013 F. Mallet ‐ POO 4 Programmation Orientée Objet Les bases Objectifs Définir la programmation orientée objet • Historique • Avantages Notions essentielles Environnement de développement 2012‐2013 F. Mallet ‐ POO 5 Programmation Orientée Objet La programmation impérative Programmation 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 Exemple de la factorielle Impératif Déclaratif Itératif Fonctionnel / Applicatif long factorielle(int n) { long res = 1; for(int i = 2; i<n; i++) { res = res * i; } return res; } Récursif long factorielle(int n) { if(n==0) return 1; return n*factorielle(n-1); } 2012-2013 (factorielle (n) (fac n 1)) (fac (n acc) ((zero? n) acc) (fac (- n 1) (* n acc)) Logique factoriel(0,1):!. factoriel(N,T):N1 is N-1, factoriel(N1,T1), T is T1*N. F. Mallet - POO 7 Programmation Orientée Objet 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 2012-2013 F. Mallet - POO 8 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 2012-2013 Fonctions Calculer la moyenne Calculer les taux d’encadrement Calculer le nombre de redoublants Calculer le taux de réussite au baccalauréat F. Mallet - POO 9 Programmation Orientée Objet Historique Simula 61‐67 : Dahl et Nygaard Smalltalk 72 : A. Kay C++ 81‐86 : Stroustrup Eiffel 85 : B. Meyer Java 94‐95 : J. Gosling/Sun Ruby 95 : Y. "Matz" Matsumoto C# 2000 : Microsoft http://www.simula.no http://www.smalltalk.org http://www.eiffel.com http://java.sun.com http://www.ruby‐lang.org 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'. 2012-2013 F. Mallet - POO 10 Programmation Orientée Objet Les bases Objectifs 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 2012‐2013 F. Mallet ‐ POO 11 Programmation Orientée Objet Types de données (1/2) Les objets Java représentent Les objets du système modélisé • • • • 2012-2013 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…) F. Mallet - POO 12 Programmation Orientée Objet 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 2012-2013 F. Mallet - POO 13 Programmation Orientée Objet Valeurs numériques Chiffres 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, … 2012-2013 F. Mallet - POO 14 Programmation Orientée Objet Type primitif boolean Domaine de valeurs: vrai ou faux {true, false} Opérations autorisées Affectation Comparaison Opérations booléennes = ==, != &&, ||, ! Exemples 2012-2013 boolean estVisible = true; if (estVisible) … F. Mallet - POO 15 Programmation Orientée Objet Type primitif char Domaine 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 2012-2013 char c = 'c'; // code ASCII 99 c = '\u00e9'; // code unicode 00e9 => é F. Mallet - POO 16 Programmation Orientée Objet Nombres entiers relatifs Domaine de valeurs 8 bits 16 bits 32 bits 64 bits byte short int long [‐128,127] [‐32768, 32767] [‐231, 231‐1] [‐263, 263‐1] 0l Opérations autorisées Affectation Comparaison Opérations arithmétiques Opérations binaires = ==, != +, -, *, /, % (int, long) &, |, ~, <<, >> (int, long) Division entière: 23 = 3 * 7 + 2 / % 23 / 0 2012-2013 quotient de la division entière reste de la division entière Erreur ! F. Mallet - POO 23/7 → 3 23%7 → 2 17 Programmation Orientée Objet Nombres approchés Domaine de valeurs 32 bits 64 bits float double ?? ?? 12.5f -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 → +∞ 2012-2013 F. Mallet - POO 18 Programmation Orientée Objet Nombres approchés – IEEE 754 Codage sur 32 bits => 232 valeurs Complément à 2 (int) Virgule flottante (float) 2012-2013 [‐231, 231‐1] [‐2128, 2128] Signe Exposant Mantisse S E=]0,255[ M S 0 1 0 1 0 0 0 255 255 255 >0 0 0 >0 0 0 F. Mallet - POO Nombre représenté (-1)Sx2E-127x(1,M)2 (-1)Sx2-126x(0,M)2 +0 -0 NaN + Not a Number ! 19 Programmation Orientée Objet Variable Case 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 Initialisation Utilisation int premiere; premiere = 12; premiere = premiere + 1; Obligatoire: initialisation avant utilisation ! 2012-2013 F. Mallet - POO 20 Programmation Orientée Objet 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); 2012-2013 F. Mallet - POO 21 Programmation Orientée Objet 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 2012-2013 F. Mallet - POO 22 Programmation Orientée Objet 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: ou 2012-2013 c = re + i.im c = z.ei.θ F. Mallet - POO 23 Programmation Orientée Objet Classe: encodage Couleur Complexe class CouleurRGB { byte rouge; byte vert; byte bleu; } class ComplexeCartesien { double reelle; double imaginaire; } class CouleurYUV { byte luminance; byte chrominanceRouge; byte chrominanceBleue; } class ComplexePolaire { double module; double argument; } 2012-2013 F. Mallet - POO 24 Programmation Orientée Objet Objet = instance d’une classe Type Classe → → valeurs objets Complexe c1; // référence c1 = new Complexe(1, -1); c1 2012-2013 → → variables références Complexe c2; // référence c2 = new Complexe(2, 0); c2 F. Mallet - POO 25 Programmation Orientée Objet Méthode = opération sur les objets Norme d’un complexe class ComplexePolaire { double module; double argument; class ComplexeCartesien { double re; double im; double norme () { return re*re+im*im; } double norme() { return module*module; } double argument () { return Math.atan2(im, re); } double argument() { return argument; } } 2012-2013 } F. Mallet - POO 26 Programmation Orientée Objet Notation pointée Pour 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 2012-2013 F. Mallet - POO 27 Programmation Orientée Objet Méthodes et paramètres Donné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); • Corps int addition(int x, int y) { return x + y ; } 2012-2013 F. Mallet - POO 28 Programmation Orientée Objet Classe Moyenne class /** int /** int Moyenne { // bloc de déclaration de classe Somme des notes obtenues */ notes = 0 ; Nombre de notes obtenues */ 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 ; } } 2012-2013 F. Mallet - POO 29 Programmation Orientée Objet Classe String Classe 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 instances String str = "Un example!"; • Les objets sont immutables (on ne peut pas les modifier) L’expression "rou"+"ge" fait intervenir 3 objets différents Concaténation int x = 20, y = 40; "Je place " + x + " euros." x + y + " euros sont placés." "Je place " + x + y 2012‐2013 F. Mallet ‐ POO "Je place 20 euros." "60 euros sont placés." "Je place 2040" 30 Programmation Orientée Objet Vocabulaire 12 1 2012-2013 F. Mallet - POO 31 Programmation Orientée Objet Les bases Objectifs 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 2012‐2013 F. Mallet ‐ POO 32 Programmation Orientée Objet Compilateur L’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 Processus de compilation en Java Fichier source Test.java Compilation (JDK) javac Test.java interprétation bytecode java Test Test.class API JRE Write once, Run everywhere OS Processeur 2012‐2013 F. Mallet ‐ POO JRE 7.0 Windows, Mac, Linux Intel, AMD, ARM 34 Programmation Orientée Objet Méthode main – java Test Test.java: Moyenne.java: class Moyenne { int notes = 0 ; int nombreDeNotes = 0 ; Moyenne e = new Moyenne(); void ajouteNote (int note) { notes += note; nombreDeNotes += 1; } e.ajouterNote(8); e.ajouterNote(18); e.ajouterNote(12); double m = e.calculMoyenne(); double calculMoyenne() { return ((double)notes) / nombreDeNotes ; } } 2012‐2013 F. Mallet ‐ POO 35 Programmation Orientée Objet Méthode main – java Test Test.java: Moyenne.java: class Test { class Moyenne { int notes = 0 ; static public void main(String[] args) int {nombreDeNotes = 0 ; Moyenne e = new Moyenne(); void ajouteNote (int note) { e.ajouterNote(8); notes += note; e.ajouterNote(18); nombreDeNotes += 1; e.ajouterNote(12); } double m = e.calculMoyenne(); double calculMoyenne() { return ((double)notes) / System.out.println("Moyenne="+m); nombreDeNotes ; } } } } 2012‐2013 F. Mallet ‐ POO 36 Programmation Orientée Objet Méthode main – java Test Test.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); } } 2012‐2013 F. Mallet ‐ POO > dir 214 Moyenne.java 229 Test.java > javac Test.java > dir 411 Moyenne.class 214 Moyenne.java 744 Test.class 229 Test.java > java Test Moyenne=12.666666666666666 37 Programmation Orientée Objet Processus de compilation en Java Fichier source Test.java Compilation (JDK) javac Test.java interprétation bytecode appletviewer Test Test.class API JRE JRE 7.0 Write once, Run everywhere Navigateur Mozilla, IE, Opera OS Processeur 2012‐2013 F. Mallet ‐ POO 38 Programmation Orientée Objet appletviewer Test.html Test.java: Moyenne.java: public class Test extends Applet { class Moyenne { int notes = 0 ; int nombreDeNotes = 0 ; public void paint(Graphics g) { Moyenne e = new Moyenne(); void ajouteNote (int note) { notes += note; nombreDeNotes += 1; } e.ajouterNote(8); e.ajouterNote(18); e.ajouterNote(12); double m = e.calculMoyenne(); double calculMoyenne() { return ((double)notes) / nombreDeNotes ; } g.drawString("Moyenne="+m, 10, 10); } } } 2012‐2013 F. Mallet ‐ POO 39 Programmation Orientée Objet appletviewer Test.html Test.java: Test.html: public class Test extends Applet { <object width="200" height="100"> <param name="code" value="Test.class"> </object> 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); } } 2012‐2013 F. Mallet ‐ POO 40 Programmation Orientée Objet appletviewer Test.html Test.java: Test.html: public class Test extends Applet { <object width="200" height="100"> <param name="code" value="Test.class"> </object> 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); } } 2012‐2013 F. Mallet ‐ POO > javac Test.java > dir 411 Moyenne.class 214 Moyenne.java 702 Test.class 92 Test.html 271 Test.java > appletviewer Test.html 41