Vous êtes sur la page 1sur 46

Introduction POO Java Syntaxe Classes et objets

Cours Java

Jean-Baptiste Mouret
mouret@isir.fr

ISIR - Université Paris 6


http://www.isir.fr

Cours 1 - ROB4

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Programmation orientée objet :


introduction

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Déroulement

10 cours/TD (2h), 10 TP (4h) : 60h


6 cours de Java
Interro (1h) au dernier cours de Java : 25%
4 cours de c++
Interro (1h) au dernier cours de c++ : 25%
TP notés (A,B,C,D,E) : 10%
Un micro-projet en Java (simulateur de Roomba) : 20%
Un micro-projet en C++ (simulateur dynamique) : 20%

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Programmation orientée objet

Programmation orientée objet = POO

« Manière de programmer »pour des logiciels :


complexes
extensibles
Concept large :
manière de penser, d’exprimer des concepts
manière d’organiser le code source
penser un logiciel « pour l’avenir »en plus du présent
Ô toute une philosophie avec un sens esthétique

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Langages objets
Langages orientés objets Langages non orientés
Modula 3 (le précurseur) objets
SmallTalk (pur objet) C
Java Assembleur
C++ LISP & Scheme (fonct.)
Python (scripts) Haskell (fonct.)
Ruby (scripts) Shell Unix
Eiffel (applications fiables) Pascal
C# (Microsoft .NET) Langages permettant la POO
Objective C (NEXT/Apple, Php, Ada, Objective Caml,
dérivé du C) Perl, Delphi

Ô Connaître les concepts de la POO est requis pour


programmer dans la plupart des langages modernes
Jean-Baptiste Mouret Cours Java
Introduction POO Java Syntaxe Classes et objets

Programmation structurée (1)

Imaginons que l’on programme sur un logiciel de dessin de


schémas (i.e. Adobe Illustrator, Microsoft Visio, ...)
Plusieurs types de formes :
rectangles
cercles
flèches
lignes
courbes
annotation textuelle
Chaque forme à des caractéristiques :
Cercle : centre, rayon, couleur
Rectangle : centre, coté1, coté2
Flèche : point de départ, point d’arrivée
...

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Programmation structurée (2)

Regrouper les informations qui vont ensemble (exemple EN C) :


typedef s t r u c t {
int x ;
int y ;
} point_t ;

typedef s t r u c t {
point_t center ;
int radius ;
} circle_t ;

typedef s t r u c t {
point_t center ;
i n t c1 , c2 ;
} rect_t ;

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Programmation structurée (2)


Exemple de fonction : déplacer une forme (en C) :
void m o v e _ c i r c l e ( c i r c l e _ t ∗ c , i n t x , i n t y )
{
c−>p o i n t . x += x ;
c−>p o i n t . y += y ;
}
void move_rect ( r e c t _ t ∗ r , i n t x , i n t y )
{
r −>p o i n t . x += x ;
r −>p o i n t . y += y ;
}

Ô Ne diffère que par le type de forme


Ô Obligé à chaque ligne de préciser “c->” ou “r->” etc..
Ô On doit tout réécrire si on ajoute une forme

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Conclusion

Ce code va vite devenir difficile à écrire et à maintenir


Ce problème se pose pour la plupart des logiciels
complexes
La programmation objet essaye de remédier à ce type
problèmes
Ô Modéliser des concepts abstraits sous formes de familles
de classes d’objets

Forme = une classe « abstraite »


Cercle = une classe « plus concrête », dérivée de forme
Rectangle = une classe « plus concrête », dérivée de forme

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Java

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Historique

Proposé par Sun Microsystem en 1995


Maintenant « Open Source » (2006)

Objectifs initiaux :
simple, orienté objet et familier
robuste et sécurisé
neutre au niveau de l’architecture et portable
performant
interpété, multi-thread et dynamique
Langage généraliste (vs JavaScript, html, ...)
Ô « n’importe quel programme »

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Concept : la JVM

Java repose sur :


une machine virtuelle (Java Virtual Machine)
un compilateur vers le bytecode de la machine virtuelle

Développeur :

int a; 0010010
Sys te m. ou t. pr int ln
... aea 2100
for (int i = 0 ; . ..) 21321 a210
....
00131213131
0312aa e21312
12312332423
031231oo eu

Code
source.java Compilateur Bytecode
(javac) (.class)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Concept : la JVM

Utilisateur / client :
0010010
aea 2100
21321 a210
00131213131
0312aa e21312
12312332423
031231oo eu

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Particulartés principales

Machine virtuelle
Langage compilé (vs Python, Ruby, Perl, etc...)
Typage statique (vs Python, Ruby, Perl, etc...)
Langage orienté objet (cf 2ème partie du cours)
Ramasse miette Ô libération automatique de la mémoire
Exceptions Ô gestion des erreurs
Bibliothèque standard couvrant de nombreux domaines (vs
C)
Depuis Java 1.5 : generics (conteneurs capables de
contenir des objets de n’importe quel type « proprement »)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Pourquoi utiliser Java ?

Portabilité très bonne (vs C#)


Plus moderne que le C (et le C++)
Code de plus haut niveau que le C/C++
ramasse-miette (garbage collector)
programmation objet
...
Bons outils (éditeurs, refactoring, ...)
Bonne bibliothèque standard
réseau
threads
conteneurs (listes, tables de hachage, ...)
Adapté au web :
coté serveur : JSP
coté client : applets java

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Pourquoi ne pas utiliser Java ?

Peu adapté à la programmation bas niveau & système


pas de timing précis (OS temps réel)
pas d’interaction fine avec le système (noyaux, drivers, etc.)

Plus lent que du C (mais plus beaucoup)


peu de contrôle fin de la performance
peu adapté au calcul de très haute performance
ex. simulation météo, mécanique des fluides, ...

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Applications codées en en java : exemple

Opéra Mini (tel. portable)


http ://meteofrance.com (jsp)
Des milliers (millions ?) de programmes pour PC & tel.
portable

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Syntaxe de base

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Hello world

public class H e l l o W o r l d
{
public s t a t i c void main ( S t r i n g [ ] args )
{
System . o u t . p r i n t l n ( ‘ ‘ H e l l o w o r l d ’’ ) ;
}
}

Fichier
HelloWorld.java (nom de la classe)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Compilation & execution

Compilation
javac HelloWorld.java

création HelloWorld.class

Execution
java HelloWorld

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Types de base

boolean (true ou false)


byte (8 bits)
short (16 bits),
int (32 bits)
long (64 bits)
float
double
char (16 bits, unicode)
cast (transtypage) : int b = (int) a ;

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Tableaux simples

déclaration : int[] mon_tableau ;


allocation : mon_tableau = new int[6] ;
affectation : int mon_tableau[] = {1, 2, 3, 4, 5, 6 }
taille du tableau : mon_tableau.length ;
les index commencent à 0 (comme en C)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Syntaxe de base

Très proche du C :
Affectation : =
Arithmétique : +, -, *,/ ,%, ++, –, +=, -=, *=, /=,%=
Logique : ||, &&
Comparaison : <, >,<=, >=, ==, !=
Commentaires :
//
/* .... */

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Structure de contrôle

Comme en C.
i f ( condition1 ) switch ( e x p r e s s i o n )
{ {
instruction1 ; case const1 :
instruction2 ; instruction1 ;
// ... instruction2 ;
} break ;
else case const2 :
{ instruction1 ;
instruction3 ; break ;
instruction4 ; default :
// ... instruction1 ;
} }

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Boucles

Comme en c++ et en C99.


f o r ( i n t i = 0 ; i < 1 0 ; ++ i )
{
instruction1 ;
/ / . . . (10 i t e r a t i o n s )
}

while ( c o n d i t i o n ) do
{ {
instruction1 ; instruction1 ;
// ... // ...
} } while ( c o n d i t i o n ) ;

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Affichage

System.out.println(“hello world”) ;
System.out.println(42) ;
Syntaxe compliquée que nous decrypterons plus tard...

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

TD : implémenter

tab ← [1,5,3, 19, 9, 12, 13]


permut ← faux
Faire :
permut ← faux
pour i ← 0 à i = tab.length - 1 :
si tableau[i] > tableau[i + 1] :
echanger(tab[i], tab[i + 1])
permut ← vrai
tant que (permut = vrai)
afficher(tab)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

public s t a t i c void main ( S t r i n g args [ ] )


{
i n t t a b [ ] = { 1 , 5 , 3 , 19 , 9 , 12 , 1 3 } ;
boolean permut ;
do
{
permut = f a l s e ;
f o r ( i n t i = 0 ; i < t a b . l e n g t h − 1 ; ++ i )
i f ( tab [ i ] > tab [ i + 1 ] )
{
i n t tmp = t a b [ i ] ;
tab [ i ] = tab [ i + 1 ] ;
t a b [ i + 1 ] = tmp ;
permut = t r u e ;
}
}
while ( permut ) ;
f o r ( i n t i = 0 ; i < t a b . l e n g t h ; ++ i )
System . o u t . p r i n t l n ( t a b [ i ] ) ;
}
Jean-Baptiste Mouret Cours Java
Introduction POO Java Syntaxe Classes et objets

Classes et objets

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Pourquoi des objets ?

Les objets permettent de représenter « naturellement »la


réalité
on est entourés d’objets : autres humains, ordinateur, etc.
les humains réfléchissent facilement par objet

Les classes d’objet permettent de « ranger »la réalité


les « chaises »appartiennent à la classe « meuble »
classification en biologie (animaux, mammifères, insectes,
félins, ...)

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

En programmation

Beaucoup de programmes simulent la réalité :


jeu de voiture : on voudrait avoir des « objets »voiture,
arbre, circuit, etc.
banque : chaque client est un objet, avec l’état de ses
comptes, etc.
...

Plus la structure de notre programme ressemble à notre


réalité, mieux on arrive à réfléchir

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

En programmation

Les 20 dernières années ont montré que cette idée


permettaient de créer des logiciels
complexes
extensibles
divisés de manière assez naturelle
élégants

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Objet

Du point de vue d’un humain, un objet est :


une « chose »tangible ou visible : cette chaise, la voiture
devant la porte, votre enseignant, ...
quelque chose qui peut être compris intellectuellement
(concept) : le théorème de Pythagore, le langage Java,
mon ordinateur...
Ô un modèle d’une partie de la réalité
Jean-Baptiste Mouret Cours Java
Introduction POO Java Syntaxe Classes et objets

Classe

Classe = le « type »des objets


Exemples :
toutes les objets « chaise »appartiennent à la même classe
(chaise)
toutes les « voitures »appartiennent à la classe « voiture »
tous les objets « robots »appartiennent à la classe
« chaise »

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Notation UML et vocabulaire

UML : Unified Modeling Language


On ne verra ici que les « diagramme de classes »

Rectangle Circle

side1 : int center : Point


side2 : int radius : int
Rectangle, Circle, Point = center : Point

classes (« types »)
1
Losange plein = 1
1 1
composition Point
« variables » : attributs x : int
y : int

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Objet

Classe = plan de construction


objet = une instance de classe
Création avec l’opérateur new :
C i r c l e c = new C i r c l e ( ) ;

Un objet possède son propre espace mémoire


Ô Ex. il existe un espace mémoire pour “radius” pour chaque
instance de Cercle
Accès aux attributs : .
System . o u t . p r i n t l n ( c . r a d i u s ) ;

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

En Java
/ / f i c h i e r P o i n t . j a v a ( une c l a s s e par f i c h i e r ! )
public class P o i n t
{
int x , y ;
}
/ / f i c h i e r Rectangle . j a v a
public class Rectangle
{
Point center ;
i n t side1 , s i d e 2 ;
};
/ / f i c h i e r C i r c l e . java
public class C i r c l e
{
Point center ;
int radius ;
};

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Méthodes et attributs
Données (side1, side2, center, ...) : attributs = états de
l’objet
« fonctions » : méthodes Ô manipuler les états
Chaque méthode peut accéder librement aux attributs de
l’objet

Rectangle Circle

side1 : int center : Point


side2 : int radius : int
center : Point
move(x : int,y : int)
move(x : int,y : int)
1
1 1
Point

x : int
y : int

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Constructeur
Méthode particulière pour la création des objets
Porte le même nom que la classe
Peut avoir des arguments
Utilisation typique : créer les attributs avec new
public class C i r c l e
{
/ / constructeur
Circle ()
{
/ / appel du c o n s t r u c t e u r de P o i n t
t h i s . c e n t e r = new P o i n t ( ) ; / / n o t e r l e t h i s
}
Point center ;
int radius ;
}

Circle c1 = new Circle() Ô appel du constructeur de Circle


Jean-Baptiste Mouret Cours Java
Introduction POO Java Syntaxe Classes et objets

This

this = le nom de l’objet courant


this est optionnel (sous-entendu)

/ / constructeur
Circle ()
{
/ / appel du c o n s t r u c t e u r de P o i n t
t h i s . c e n t e r = new P o i n t ( ) ; / / n o t e r l e t h i s
/ / eq . a :
c e n t e r = new P o i n t ( ) ; / / pas de t h i s
}

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Autres méthodes

public class C i r c l e
{
/ / constructeur
public C i r c l e ( )
{
c e n t e r = new P o i n t ( ) ;
Circle
}
-radius : int
/ / methode ( s ) -area : int
public void t r a n s l a t e ( i n t x , -center : Point
int y) +Circle(r : int,c : Point)
{ +Circle()
+move(x : int,y : Point)
t h i s . c e n t e r . x += x ; -compute_area()
t h i s . c e n t e r . y += y ;
}
// attributs
Point center ;
int radius ;
}
Jean-Baptiste Mouret Cours Java
Introduction POO Java Syntaxe Classes et objets

Création et utilisation d’une classe

public class Exemple


{
public s t a t i c void main ( S t r i n g [ ] args )
{
C i r c l e c1 = new C i r c l e ( ) ; / / n o u v e l l e i n s t a n c e
C i r c l e c2 = new C i r c l e ( ) ; / / n o u v e l l e i n s t a n c e
Rectangle r = new Rectangle ( ) ;
c1 . t r a n s l a t e ( 2 , 3 ) ; / / appel de methode
}
}

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Références

Circle c1 = new Circle();


Ô new renvoie une référence vers un nouveau cercle
Ô un nouvel espace mémoire
Référence nulle : c1 = null ;
Ressemble aux pointeurs en C, différences :
pas d’arithmétique
soit null, soit un objet valide

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Références : exercice

C i r c l e c1 = new C i r c l e ( ) ;
c1 . r a d i u s = 1 ;
C i r c l e c2 = new C i r c l e ( ) ;
c2 . r a d i u s = 2 ;
System . o u t . p r i n t l n ( c1 . r a d i u s ) ; / / a f f i c h e ?
System . o u t . p r i n t l n ( c2 . r a d i u s ) ; / / a f f i c h e ?

c1 . t r a n s l a t e ( 2 , 2 ) ;

c1 = c2 ;
System . o u t . p r i n t l n ( c1 . r a d i u s ) ; / / a f f i c h e ?

c1 . r a d i u s = 4 2 ;
System . o u t . p r i n t l n ( c1 . r a d i u s ) ; / / a f f i c h e ?
System . o u t . p r i n t l n ( c2 . r a d i u s ) ; / / a f f i c h e ?

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Ramasse-miettes (garbage collector)

La JVM note toute les utilisations des références


Quand un objet n’est plus référencé (dans tout le
programme)
Ô destruction par le ramasse-miette
Conséquence : pas besoin de gérer la mémoire

void t e s t ( )
{
C i r c l e c1 = new C i r c l e ( ) ;
c1 . t r a n s l a t e ( 2 , 2 ) ;
} / / c1 n ’ e s t p l u s u t i l i s e
/ / −> d e s t r u c t i o n

Jean-Baptiste Mouret Cours Java


Introduction POO Java Syntaxe Classes et objets

Exercice (TD)

Jean-Baptiste Mouret Cours Java