Title: LIP6 cours L3 : POBJ Programmation par Objets en Java
1LIP6 cours L3 POBJ Programmation par Objets
(en Java)
- Olivier Sigaud
- LIP6/AnimatLab
- olivier.sigaud_at_lip6.fr
- 01.44.27.88.53
2Plan du cours 1
- De la programmation impérative et procédurale à
la programmation orientée objets - Structures de contrôle
- Décomposition
- Variables
- Java historique, types de base, tableaux
- Les classes
- Types, instances, objets,
- Attributs
- Méthodes
- Construction d'un objet
3De la programmation impérative et procédurale à
la programmation orientée objets
4Prog. impérative et procédurale
- Objectif écrire une séquence d'instructions de
telle façon qu'un ordinateur produise une sortie
appropriée pour une certaine entrée - Ingrédients
- variables
- tests
- boucles
- structures
- décomposition en fonctions
- passages de paramètres
5Tests
- Permettent d'exécuter une séquence d'instructions
uniquement si une certaine condition est vérifiée -
if (alt0) bloc1 else if
(bgt1) bloc2 else bloc 3
6Boucles While
- Permettent d'exprimer la répétition, de réaliser
plusieurs fois le même bloc d'instructions
int i10 do System.out.println(i)
i-- while (igt0)
int i10 while (igt0) System.out.println(i
) i--
7Boucles for (1)
- Equivalentes aux boucles while()
- for (int i0ilt10i)
-
- System.out.println(i)
-
- int i9
- for (igt0i--)
-
- System.out.println(i)
-
8Boucles for (2)
- int j3
- for (int i0(ij)lt20ii4)
-
- System.out.println(i)
-
- int i
- for (i0ilt10)
-
- System.out.println(i)
- ii2
-
9Décomposition fonctionnelle
- Le programme est une fonction principale
- int main(argc, argv)
- Cette fonction appelle des sous-fonctions
- Qui en appellent d'autres
main()
init()
calcule()
trie()
affiche()
compare()
permute()
factorise()
10Savoir décomposer
- Une bonne décomposition en fonctions fait
apparaître des sous-fonctions ltlt naturelles gtgt,
i.e. qui ont un sens autonome - Plus un algorithme est complexe, plus il faut le
décomposer en nombreuses fonctions plus simples - On doit comprendre immédiatement ce que fait
toute fonction - Erreur tout mettre dans une grosse fonction
11Les blocs
- Tout ensemble d'instruction entre "" est un
bloc - Une fonction est un bloc particulier
- Dans une fonction, il peut y avoir plusieurs
blocs - Eviter plus de 3 niveaux de blocs imbriqués
12Effets de bord
- On appelle effet de bord le fait quun
traitement local (réalisé dans un bloc) produise
sur les données un effet qui persiste une fois
que le pointeur dinstruction est sorti de ce
bloc - Exemple type variables globales
13Variables
- Une variable correspond à un emplacement mémoire
- C'est un emplacement alloué pour faire des
calculs - Le nom de la variable permet au compilateur de
retrouver l'emplacement.
14Déclaration et allocation
variable
emplacement mémoire
double epsilon
epsilon
- epsilon est une variable.
- A cette variable est associé un type.
- En pratique, la machine virtuelle associe à la
variable ladresse en mémoire dun emplacement
dont la taille dépend du type et où sera stockée
la valeur depsilon - La déclaration induit lallocation de
lemplacement
15Initialisation
double epsilon 0.005
epsilon
0.005
- En Java, une variable non initialisée vaut
null, false, 0 - Une variable peut être initialisée lors de la
déclaration type nomVariable valeur - Initialisation déclaration affectation
- Souvent, on peut aussi déclarer dabord, puis
affecter plus tard, mais gare aux variables
déclarées mais non affectées
16Blocs et variables locales
- On appelle portée d'une variable l'espace au
sein du programme où cette variable est connue - La portée d'une variable locale est le bloc dans
lequel elle est définie - De lespace mémoire est alloué temporairement
pour les variables locales du bloc, le temps
pendant lequel le pointeur d'instruction parcourt
le bloc. - En pratique, les variables locales sont stockées
sur une pile et dépilée quand on sort du bloc
17Portée dune variable locale
- int methode()
-
- double longueur 1.5
-
-
longueur
1. 5
longueur
1. 5
18Variables globales
- Variables globales visibles dans tout le
programme, allouées pour toute la durée du
programme - NB l'usage des variables globales est plus
facile à première vue, mais inefficace et
déstructurant - Inefficace ne sont pas stockées dans la pile,
mais dans la mémoire globale gt accès plus long - Déstructurant éparpillement des données et des
fonctions - Programmation par effet de bord
- Elles tendent à disparaître en POO
- Mais on verra des effets de bord locaux aux
objets
19Passage de paramètres
- A l'appel de chaque fonction, de l'espace mémoire
local est alloué pour chaque paramètre d'entrée
(comme pour une variable locale) - Les valeurs des paramètres d'entrée sont copiées
avant l'appel de la fonction - Le calcul s'effectue sur ces copies
- La valeur retournée est copiée dans une variable
de la fonction appelante
20Exemple
- main()
-
- float a 23.3
- float b 12.6
- float resultat division(a,b)
-
- float division(float dividende, float diviseur)
-
- return dividende/diviseur
main()
division()
23.3
a
dividende
12.6
b
diviseur
resultat
23.3/ 12.6
retour
21En C les structures
- Types complexes constituées de types plus simples
- struct Camion
-
- int nbRoues
- int nbRemorques
- float longueur
-
- Déclaration Camion moncamion
- Camion est un nouveau type
- Usage moncamion.nbRoues 18
- Transition vers la programmation orientée objets
22Programmation orientée objets
- Tous les ingrédients de la programmation
impérative et procédurale sont présents - Mais la décomposition en arbre de fonctions n'est
pas assez structurante pour des programmes très
complexes - Structurer le programme autour des objets
manipulés - Les traitements sont associés aux objets
- Permet de raisonner dans le langage du problème
- Séparation plus claire entre données et
traitements - Confinement des effets de bord aux objets
23Décomposition classique en fonctions
main()
Données
init()
calcule()
Données
factorise()
trie()
compare()
permute()
24Décomposition orientée objets
Données
Données
trie()
init()
calcule()
compare()
permute()
factorise()
25Présentation de Java
26Doù vient java ?
- Apparition en 1995
- La syntaxe dérive de C (80s), qui dérive de
celle de C (1985) - Simplification vis-à-vis de C
- Présence du garbage collector (gain de 30 à 40
en temps de développement, perte en temps
dexécution) (DARPA) - Langage incontournable dans lindustrie HighTech
27Historique
C (1972)
Internet (1966)
Hypertexte (1986)
POO (1980s)
WWW (1992)
C (1980)
Applet
Application
Java (1995)
28Types de base et opérateurs
- Booléens boolean gt true, false
- Entiers short, int, long (entiers signés)
- Flottants float, double (IEEE 754)
- Caractères char (Unicode)
- and
- or
- ! gt lt
29Tableaux
- int montableau // ne réserve pas la place
mémoire !!! - int montableau // ne réserve pas la place
mémoire !!! - int5 montableau // ne compile pas !!!
- int montableau5 // ne compile plus !!!
- Indices de 0 à n-1
30Déclaration de tableaux
double valeurs valeurs new double5
valeurs1 0.005
valeurs0
valeurs0
0.005
valeurs1
valeurs2
valeurs4
valeurs4
Les cases du tableau sont allouées au new
ou n4 valeurs new doublen1
31Dimensions multiples
valeurs00
double valeurs valeurs new double 55
valeurs0
valeurs02
valeurs2
valeurs04
valeurs4
valeurs10
valeurs12
valeurs14
32Déclaration et allocation simultanée
- double valeurs 0.2,6.3,7.456,80.0,10.10
- System.out.println(valeurs.length) gt 5
- Vérification de non débordement
IndexArrayOutOfBounds
33Classes, Types, Objets, Instances, Attributs,
Méthodes
34Les classes
- Les programmes manipulent des objets
- Chaque objet est une instance d'une classe
- Une classe désigne un type dont les objets sont
des instances - Par exemple, le mot bonjour est un
représentant de la classe des mots, une instance
du type mot. - Un programme est structuré sous forme d'un
ensemble de classes qui se partagent les
traitements à effectuer
35Objets, Classes et Instances
- Une classe définit
- Un type
- Une description commune pour un ensemble
dobjets, via un ensemble dattributs - Les traitements associés à ces objets, via un
ensemble de méthodes - Chaque objet indidivuel est défini par lensemble
des valeurs que prennent ses attributs - Cest le rôle des constructeurs de créer des
objets individuels
36Les attributs
- Les attributs d'une classe décrivent les éléments
qui composent les objets de cette classe - Tous les attributs sont dotés d'un type défini au
niveau de la classe (type de base, interface ou
autre classe) - Les attributs sont vus comme des variables
globales internes à un objet - La portée d'un attribut est l'objet dans lequel
il est défini l'attribut garde sa valeur d'une
méthode à l'autre tant qu'aucune méthode ne le
modifie - On programme donc par effet de bord à lintérieur
dun objet
37Usage des attributs
- Les attributs servent à représenter diverses
relations - caractéristiques ou qualités d'un objet
- composants d'un objet complexe
- objets en relation avec l'objet
- Lorsqu'on utilise un attribut dans une méthode,
il ne faut pas re-déclarer son type (sinon, on
déclare en fait une variable locale de même nom) - Eviter d'avoir une variable locale dans une
méthode qui porte le même nom qu'un attribut
(risque de confusion, source classique de bugs)
38Exemple (1)
- class Voiture
-
- double longueur 1.5
-
- public void demarrer()
-
- double longueur 3.1
- if (longueurlt2)
-
-
39Exemple (2)
- class Voiture
-
- double longueur 1.5
-
- public Voiture(double longueur)
-
- this.longueur longueur
-
-
- Ou bien
- public Voiture(double lon)
-
- longueur lon
-
40Les méthodes
- A chaque classe sont associées des méthodes, qui
correspondent aux traitements que le programme
peut effectuer sur les objets de cette classe - Par exemple, on peut épeler un mot, l'imprimer,
le réécrire à l'envers, etc. - Il faut s'efforcer d'associer à une classe des
méthodes qui lui sont naturelles (difficile !)
41Exemple
- class Voiture
-
- double longueur
- public Voiture(double lg)
-
- longueur lg
-
- public double getLongueur()
-
- return longueur
-
- public static void main(String args)
-
- Voiture mavoiture new Voiture(2.8)
-
-
- La méthode "getLongueur()" est une méthode de la
classe Voiture
42Surcharge
- Une même classe peut avoir plusieurs méthodes de
même nom, mais avec des paramètres de types
différents - A ne par confondre avec la surdéfinition
(paramètres de mêmes types, dans le cas de
lhéritage)
43Méthodes et fonctions
JAVA
C
- struct Voiture
-
- Embrayage embrayage
- Moteur moteur
- BoiteVitesse boite
-
- void demarrer(Voiture v)
-
- enfoncer(v.embrayage)
- faireTourner(v.moteur)
- passerVitesse(v.boite, 1)
- relacher(v.embrayage)
class Voiture Embrayage embrayage Moteur
moteur BoiteVitesse boite public void
demarrer() embrayage.enfoncer()
moteur.faireTourner(.) boite.passerVitesse(1)
embrayage.relacher()
44Lobjet comme contexte
- class Nombre
-
- //attribut
- int valeur
- //constructeur
- Nombre(int val)
- valeurval
-
- //methode
- int ajoute(int val)
- return (valeur val)
-
-
class NombreMain public static void main(String
args) Nombre n new Nombre(8) int
resultat n.ajoute(5) System.out.println(result
at)
45Construction
46Les constructeurs
- Pour utiliser un objet, il faut dabord le
construire - Construire
- allouer un emplacement en mémoire
- initialiser les attributs (en général)
- C'est le rôle des constructeurs
- Un constructeur se présente syntaxiquement comme
une méthode qui porte le même nom que la classe
et ne renvoie rien - L'appel du constructeur se fait via lallocateur
new - Lallocateur new renvoie lidentité de
lobjet (en Java, l'adresse de lemplacement
mémoire alloué)
47Etat dun objet
- Létat dun objet est défini par lensemble des
valeurs que prennent chacun de ses attributs - Chaque changement de valeur dun attribut
implique un changement détat - En général, quand on crée un objet on initialise
son état - Instanciation allocation initialisation
48Exemple de construction
- class Voiture
-
- private double longueur
- public Voiture(double lg)
-
- longueur lg
-
- public static void main(String args)
-
- Voiture mavoiture new Voiture(2.80)
-
49Construction d'un objet
Objet valeurs
Variable référence
Voiture objet créé avec new
mavoiture
Voiture mavoiture new Voiture()
La variable est une sorte de télécommande sur
l'objet
50Oubli de l'allocation mémoire
Voiture mavoiture mavoiture.demarre()
null
mavoiture
- La déclaration de variable alloue la référence,
mais pas lobjet - La référence vaut null
- Oubli de lallocation de lobjet gt
NullPointerException - Erreur archi-fréquente !!!
51Constructeurs multiples
- Il peut y avoir plusieurs constructeurs pour une
même classe, avec des paramètres de types
différents - Cela signifie que l'on peut surcharger les
constructeurs comme toutes les méthodes - Tant qu'aucun constructeur n'est créé, il existe
un constructeur par défaut, qui ne prend pas de
paramètres et ne fait rien, sauf allouer la
mémoire (les attributs sont initialisés aux
valeurs par défaut) - Du coup, quand on rajoute un constructeur avec
des paramètres, le constructeur par défaut
disparaît ? - On verra les conséquences avec lhéritage ?
52Exemple de classe personnelle
- class Voiture
-
- private double length
- private String name
- public double getLength()
-
- return length
-
- public String getName()
-
- return name
-
-
53Exemple (suite)
- class Voiture
-
-
- public Voiture()
- public Voiture(string nom, double len)
- name nom
- length len
-
- public static void main(String args)
-
- Voiture v new Voiture ( coccinelle , 3.5)
-
54Mon premier programme Java
- Ouvrir un fichier MaClasse.java
- Taper
- class MaClasse
-
- public static void main(String args)
-
- System.out.println( Hello, Java world
! ) -
-
- javac MaClasse.java
- java MaClasse
55Lancer Java
- Mettre la classe MaClasse dans un fichier
MaClasse.java (une seule classe par fichier) - Taper javac MaClasse.java permet de générer du
bytecode exécutable par la machine virtuelle
(JVM) - Taper java MaClasse permet d'exécuter la méthode
public static void main(String args) de la
classe MaClasse si elle en a une.
56Environnement JAVA
- Fichier MaClasse.java gt fichier source dans
lequel on décrit le code de la classe - Compilateur javac MaClasse.java
- Génère du byteCode gt MaClasse.class
- Machine virtuelle java MaClasse
- Exécute le byteCode gt fait tourner le programme
- On verra la compilation de plusieurs fichiers
plus tard
57La méthode main() passage darguments
- class Main
-
- public static void main(String args)
- for (int i0iltargs.lengthi)
- System.out.println(argsi)
-
-
-
- bashgt javac Main.java
- bashgt java Main bonjour monde
- bashgt bonjour
- bashgt monde
58LAPI de Java
- (Très grand) ensemble de classes toutes faites
que lon peut utiliser dans ses programmes - Cf. java.sun.com/j2se/1.5.0/docs/api