Programmation Orientée Objet Introduction à Java

publicité
Programmation Orientée Objet
Introduction à Java
Frédéric Mallet
http://deptinfo.unice.fr/~fmallet/
2013-2014
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%
2 Notes de TP : 30%
2013-2014
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
2013-2014
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
2013-2014
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
2013-2014
F. Mallet - POO
5
Programmation Orientée Objet
Algorithme
Discret
Succession d’actions (impératif)
Déterministe
Les mêmes entrées produisent les mêmes sorties
≠ Stochastique
Finitude
Terminaison après un nombre fini de pas
Semi-algorithme: ne termine pas nécessairement
Universel
Données initiales dans un ensemble potentiellement infini
2013-2014
F. Mallet - POO
6
Programmation Orientée Objet
La programmation impérative
Programmation
concevoir un algorithme et réaliser un 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 }
2013-2014
F. Mallet - POO
7
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);
}
2013-2014
(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
8
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
2013-2014
F. Mallet - POO
9
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
2013-2014
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
10
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'.
2013-2014
F. Mallet - POO
11
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
2013-2014
F. Mallet - POO
12
Programmation Orientée Objet
Types de données (1/2)
Les objets Java représentent
Les objets du système modélisé
•
•
•
•
2013-2014
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
13
Programmation Orientée Objet
Types de données (2/2)
Réalise un Type Abstrait de données (algorithmique)
Le type encode les données
Domaine de valeurs (fini)
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
2013-2014
F. Mallet - POO
14
Programmation Orientée Objet
Variable
On distingue
Les variables informatiques
•
•
•
•
Nom: identifiant unique (dans l’espace de nommage)
Type: détermine le domaine des valeurs possibles
Valeur: peut varier à chaque pas de l’exécution du programme
Ex: x = 2
ou
x*x == 9
Des variables mathématiques
• Nom
• Type
• Remplace un ensemble (possiblement vide) de valeurs
– Aucun aspect itératif
• Ex: Trouver x dans ℤ tel que x2 = 9
2013-2014
F. Mallet - POO
15
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, …
2013-2014
F. Mallet - POO
16
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
boolean estVisible = true;
if (estVisible) …
2013-2014
F. Mallet - POO
17
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
2013-2014
char c = 'c';
// code ASCII 99
c = '\u00e9';
// code unicode 00e9 => é
F. Mallet - POO
18
Programmation Orientée Objet
Nombres entiers relatifs ℤ
Domaine de valeurs
byte
short
int
long
8 bits
16 bits
32 bits
64 bits
[-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
2013-2014
quotient de la division entière
reste de la division entière
et binaire (différent du et logique)
Erreur !
F. Mallet - POO
23/7 → 3
23%7 → 2
23&7 → 7
19
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 → +∞
2013-2014
F. Mallet - POO
20
Programmation Orientée Objet
Nombres approchés – IEEE 754
Codage sur 32 bits => 232 valeurs
[-231, 231-1]
[-2128, 2128]
Complément à 2 (int)
Virgule flottante (float)
2013-2014
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 !
21
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 !
2013-2014
F. Mallet - POO
22
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);
2013-2014
F. Mallet - POO
23
Programmation Orientée Objet
Affectations combinées +=
Incrémente une variable
<variable> += <expression>;
Attention
Surchargée pour tous les types numériques
• byte, short, int, long, float, double
Différent d’une addition
• byte b = 127;
• b = b + b;
+(int, int): int
b += b
byte.+(int)
Variantes
-=, *=, /=, <<=, >>=, &=, |=
b++, ++b
2013-2014
F. Mallet - POO
24
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
2013-2014
c = re + i.im
c = z.ei.θ
F. Mallet - POO
25
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;
}
2013-2014
F. Mallet - POO
26
Programmation Orientée Objet
Objet = instance d’une classe
Type
Classe
→
→
valeurs
objets
Complexe c1; // référence
c1 = new Complexe(1, -1);
c1
2013-2014
→
→
variables
références
Complexe c2; // référence
c2 = new Complexe(2, 0);
c2
F. Mallet - POO
27
Programmation Orientée Objet
Méthode = opération sur les objets
Norme d’un complexe
class ComplexeCartesien {
double re;
double im;
class ComplexePolaire {
double module;
double argument;
double norme () {
return re*re+im*im;
}
double norme() {
return module*module;
}
double argument () {
return Math.atan2(im, re);
}
double argument() {
return argument;
}
}
2013-2014
}
F. Mallet - POO
28
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
2013-2014
F. Mallet - POO
29
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 ;
}
2013-2014
F. Mallet - POO
30
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 ;
}
}
2013-2014
F. Mallet - POO
31
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 exemple!";
• 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
2013-2014
F. Mallet - POO
"Je place 20 euros."
"60 euros sont placés."
"Je place 2040"
32
Programmation Orientée Objet
Vocabulaire
12
1
2013-2014
F. Mallet - POO
33
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
2013-2014
F. Mallet - POO
34
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)
2013-2014
F. Mallet - POO
35
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
2013-2014
F. Mallet - POO
JRE 7.0
Windows, Mac, Linux
Intel, AMD, ARM
36
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 ;
}
}
2013-2014
F. Mallet - POO
37
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 ;
}
}
}
}
2013-2014
F. Mallet - POO
38
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);
}
}
2013-2014
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
39
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
2013-2014
F. Mallet - POO
40
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);
}
}
}
2013-2014
F. Mallet - POO
41
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);
}
}
2013-2014
F. Mallet - POO
42
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);
}
}
2013-2014
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
43
Téléchargement