Introduction au langage Java et OOP
Introduction au langage Java et OOP
Introduction à Java
La technologie JAVA
• 4 éléments
– Un langage de programmation orienté objet
– Une machine virtuelle (JVM) ou interpréteur
– Des bibliothèques de classes standards
= API Application Programming Interface
(plus de 2500 classes dans java 1.4)
– Ensemble d’outils (javac, javadoc, jar…)
1
Historique : Origines de Java
• 1990
– Internet très peu connu, World Wide Web inexistant
– boom des PC (puissance)
– Projet Oak de SUN Microsystems
• Langage pour la communication des appareils électroniques de poche
• 1993
– mars : le NCSA lance MOSAIC, le premier navigateur internet
(protocole http, langage html), le web décolle...
– été : Oak change d’orientation et s’adapte à la technologie internet
• 1995
– mai 1995 : annonce officielle de la naissance de la technologie Java
(issue de Oak)
Le langage JAVA
• Dans un des premiers papiers sur le langage SUN
décrit Java comme suit :
2
Le langage Java
un langage orienté-objet
Le langage Java
un langage orienté-objet
• Un objet possède :
3
Le langage Java
un langage orienté-objet
se (in
(int m)
tM t
in m)
ut
es
int jour;
Variables
(données
int
int
mois;
année;
Méthodes
internes) int heure; (opérations)
int minutes;
int secondes;
ge
in ur
tH
t e(
e
int
)
getMinutes()
Un objet montre
7
Le langage Java
un langage orienté-objet
• Intérêt de l’encapsulation
– Modification des structures de données n’affecte pas les programmes qui
utilisent l’objet.
setHeures
se (in
(int m)
tM t
in m)
ut
es
int jour;
Variables
(données
int
int
mois;
année;
Méthodes
internes) long
int milisecs;
heure; (opérations)
int minutes;
int secondes;
ge
in ur
tH
t e(
e
int
)
getMinutes()
4
Le langage Java
un langage orienté-objet
• Les objets interagissent et communiquent entre eux par l’envoi de
messages
• Les méthodes publiques d’un objet correspondent aux messages que l’on
peut lui envoyer
• Les messages sont caractérisés par
– objet cible (recpeteur) du message
– nom de la méthode à déclencher
– paramètres de cette méthode Envoi d’un message à l’objet
identifié par maMontre
[Link](14);
[Link](45);
Le langage Java
un langage orienté-objet
• Les objets s’envoient des messages entre eux
[Link](14)
setHeure(int h)
10
5
Le langage Java
un langage orienté-objet
• Les objets (instances) sont créés (instanciés) à partir des
classes
• Classe = schéma/modèle d’objets, elle décrit :
– partie privée
• structure de données interne (attributs) classe Montre code
• corps des méthodes (algorithmes)
– partie publique (interface)
• noms et paramètres des méthodes
• Classe = générateur d’objets
par instanciation, on peut fabriquer des objets
obéissant à ce schéma/modèle
instance de
mémoire
Le langage Java
un langage orienté-objet
6
Le langage Java
un langage orienté-objet
13
Le langage Java
un langage orienté-objet
14
7
Le langage Java
un langage orienté-objet
Le langage Java
un langage orienté-objet
8
Le langage Java
un langage orienté-objet
Le langage Java
un langage orienté-objet
• Une application orientée objet consiste en :
• création (instanciation) d’objets en mémoire
• lancer exécution par envoi de messages aux objets créés
• ces messages peuvent provoquer d’autres envois de messages et/ou la
création d’autres objets
Visages animés fenêtre
afficher visage2
dessiner
dessiner
dessiner
zoneDeDessin visage1
18
9
Le langage Java
un langage orienté-objet : Exemple de programme Java
class DemoVisagesAnimes
{
public static void main(String[] argv)
{
JFrame fenêtre = new JFrame("Titre de la fenêtre");
// Création d'un objet de type Dessin. Cet objet est destiné à
// contenir les objets graphiques gérés par l'application.
Création des objets Dessin dessin = new Dessin();
de l’application // Insertion de objet de type Dessin dans la fenêtre de l'appli.
fenê[Link](dessin);
// Affichage de la fenêtre
fenê[Link]();
// ajout, modification des objets visage
Visage v1 = new Visage();
Visage v2 = new Visage(200,100,200,200,5);
Envoi de messages [Link](v1);
aux objets [Link](v2);
[Link]();
[Link](10);
while (true) {
[Link]();
[Link]();
[Link](10);
}
}
}
19
Le langage Java
Java un langage simple (en apparence ?)
20
10
Le langage Java
Java un langage distribué
21
Le langage Java
Java un langage "multithreadé"
22
11
Le langage Java
Java un langage "multithreadé" : Exemple : l’application Visage
class DemoVisagesAnimes
{
public static void main(String[] argv)
{
Frame fenêtre = new Frame("Titre de la fenêtre");
// Création d'un objet de type Dessin. Cet objet est destiné à
// contenir les objets graphiques gérés par l'application.
Dessin dessin = new Dessin();
// Insertion de objet de type Dessin dans la fenêtre de l'appli.
fenê[Link](dessin);
// Affichage de la fenêtre
fenê[Link]();
// ajout, modification des objets visage
Visage v1 = new Visage();
Visage v2 = new Visage(200,100,200,200,5);
[Link](v1);
[Link](v2);
[Link]();
while (true) {
[Link](); // deux threads
[Link]();
[Link](); // d’exécution
[Link]();
[Link](10);
}
}
}
23
Le langage Java
Un langage compilé / interprété
0 iconst_0
// exemple pour désassambleur 1 istore_1
public class Test { 2 goto 30
5 getstatic #10 <Field [Link] out>
public static void main(String[] args) 8 new #5 <Class [Link]>
{ 11 dup
for (int i = 0; i < 10; i++) 12 ldc #1 <String "Hello ">
[Link]("Hello " + i); ….
27 iinc 1 1
} 30 iload_1
} 31 bipush 10
javac 33 if_icmplt 5
36 return
24
12
La machine virtuelle Java
Exécution d'un programme Java compilé
.java .class
source byte-code
Java PowerPc
VM MacOS X
25
• Chargement
– chargement sélectif et dynamique des classes
– vérification du code
• Protection lors de l'exécution
– Le "security manager" possède un droit de veto (accès "sauvages" au
système de fichiers, ...)
– Cette protection peut-être modulée
MV Java
Réseau
ou Classes Security Manager
Class Loader
Système locales
de fichiers
.class
Byte-Code verifier Interpreter
26
13
Types de programmes Java
• Les Applets
– Programmes exécutées dans l’environnement d’un
navigateur Web et chargés au travers de pages HTML
Demo
27
ex : java AppliVisage1
28
14
Types de programmes Java
Applet
29
30
15
Performances
• Exécution d'un programme Java
– le code Java est compact,
– le chargement des classes nécessaires est sélectif et dynamique,
– ... mais Java est interprété
31
32
16
Les API de Java
Packages de classes standards
33
17
Le JDK (SDK)
• JDK Java Developer’s Kit : environnement standard
(Windows ou Solaris) diffusé gratuitement par Sun
([Link]
– des outils de développement
• compilateur , « interpréteur » de Byte-Code
– les "librairies" de classes standards
– documentation
• différentes évolutions du JDK correspondant à
différentes évolutions de la plate-forme Java
• JDK1.02
• Java 1.1 : JDK 1.1.8 , ...
• Java JDK 13.0.2
35
18
Différentes éditions de Java
• 3 éditions de Java
36
19
Les différentes éditions de Java
J2EE Java 2 Entreprise Edition
• Les applications d’entreprise on besoin de délivrer des services
– correspondant à l’évolution actuelle du monde des affaires (globalisation)
– protégeant la vie privée des utilisateurs et l’intégrité des données de l’entreprise
– assurant un traitement rapide et sûr des transactions commerciales.
• Ces services sont généralement conçus comme des applications
distribuées constituées de plusieurs « parties » (tiers)
20
Les différentes éditions de Java
Java EE : principales technologies et API
• JavaMail
• Envoi et réception d’E-mail
• Java API for XML (JAXP)
• Genération, lecture, manipulation de documents XML
• Java Authentication and Authorization Service (JAAS)
• Gestion sécurisée de l’authentification et des autorisations pour des groupes d’utilisateurs
38
• Une spécification
– Java EE
• Une implémentation de référence (fournie gratuitement par sun)
• Des implémentations commerciales
– BEA WebLogics,
– IBM WebSphere,
– Sun ONE Application Server
– Oracle …
• Ou open-source
– JBoss
– WebOjbects
– Geronimo…
39
21
Environnements de développement
intégrés
• Nombreux IDE (Integrated Development Environment) commerciaux
JDeveloper
Oracle
40
22
CHAPITRE II :
Identificateurs
Nommer les classes, les variables, les méthodes, ...
Un identificateur Java
de soulignement "_"
peut ensuite contenir des lettres ou des chiffres ou le
caractère souligné « _ » ou le symbole « $ »
ne doit pas être un mot réservé du langage (mot clé)
(if, for, true, … )- sensible à la casse
1
Conventions
pour les identificateurs
Lesnoms de classes commencent par une majuscule (ce
sont les seuls avec les constantes) :
Visage, Object
age_du_capitaine
Mots-clés Java
2
Commentaires
Sur une ligne
// Comme en “C++”, après un slash-slash
int i; // commentaire jusqu’à la fin de la ligne
Commentaires
Commenter clairement
3
Types de données en Java
Types primitifs
Valeur logique
boolean (true/false)
Nombres entiers
char (2 octets) ;
4
Types primitifs et valeurs
Constantes nombres
Exemples
35
2589L // constante de type long
4.567e2 // de type double
.123587E-25F // de type float
10
5
Constantes de type caractère
Un caractère Unicode entouré par 2 simples quotes "'"
Exemples :
'A' 'a' 'ç' '1' '2'
\ caractère d’échappement pour introduire caractères spéciaux
'\t' tabulation
11
Autres constantes
Type booléen
false
true
12
6
Forcer un type en Java
Exemple
int i = 64;
char c = (char)i;
13
14
7
Casts entre types primitifs
15
Casts
entre entiers et caractères
La correspondance char → int, long s’obtient par cast
implicite
Les correspondances char → short, byte , et
long, int, short ou byte → char nécessitent un cast
explicite
int i = 80;
char c = 68; // caractère dont le code est 68
c = (char)i
i = c;
short s = (short)i;
char c2 = s; // provoque une erreur
16
8
Opérateurs
Lesplus utilisés
Arithmétiques
+ - * /
% (modulo)
Logiques
&& (et) || (ou) ! (négation)
Relationnels
== != < > <= >=
Affectations
= += -= *= …
17
9
Déclarations
Avant toute utilisation dans un programme une variable doit être déclarée
Exemples
byte age;
boolean jeune;
float poids;
double x, y ,z;
Une variable est accessible (visible) depuis l'endroit où elle est déclarée
jusqu'à la fin du bloc où sa déclaration a été effectuée
18
Affectation
Syntaxe : lvalue = expression
lvalue est une expression qui doit délivrer une variable (par exemple un
identificateur de variable, élément de tableau...., mais pas une constante)
Exemples
int age;
age = 10;
boolean jeune = true;
float poids = 71.5f;
float taille = 1.75f;
float poidsTaile = poids / taille;
19
10
Flot de contrôle
bloc d'instructions - instruction composée
permet de grouper un ensemble d'instructions en lui donnant la forme
syntaxique d'une seule instruction
syntaxe: {
séquence d‘énoncés
}
exemple int k;
{
int i = 1;
int j = 12;
j = i+1;
k = 2 * j - i;
}
20
Flot de contrôle
Instruction conditionnelle
exemple if (i==j)
{
j = j -1;
i = 2 * j;
}
else
i = 1;
21
11
Flot de contrôle
Exemple
int i = 0;
int somme = 0;
while (i <= 10){
somme += i;
i++;
}
[Link]("Somme des 10 premiers entiers" + somme);
22
Flot de contrôle
Syntaxe do
instruction
while ( expression booléenne ) ;
Exemple
int i = 0;
int somme = 0;
do
{
somme += i;
i++;
} while (i <= 10);
[Link]("Somme des 10 premiers entiers" + somme);
23
12
Flot de contrôle
Exemple non
Expression 2 == true
oui
instruction
Expression 3
int i = 0;
int somme = 0;
for (i = 0; i <= 10; i++)
somme += i;
24
Entrées/sorties
sur console
Affichage sur la console
[Link](chaîne de caractères à afficher)
[Link](chaîne de caractères à afficher)
25
13
Chapitre III :
Tableaux
en Java
Tableaux
1
Tableaux
Tableaux
unidimensionnels
unidimensionnels Déclaration
Déclaration
typeDesElements[] nomDuTableau;
ou bien
typeDesElements nomDuTableau[];
avec
typeDesElements un des types de base du langage JAVA
(char, int, float, double...) ou un nom de classe
nomDuTableau l’identificateur pour désigner le tableau
exemples
int vecteurEntiers[];
int[] vecteurEntiers; // identique
Compte[] listeDesComptes;
Tableaux
Tableaux
unidimensionnels
unidimensionnels Création
typeDesElements[] nomDuTableau;
définit (déclare) un identificateur nomDuTableau qui permettra de désigner
(référencer) un tableau du type déclaré ("tableau d'éléments de type
typeDesElements").
mais ne crée pas de tableau en mémoire. (nomDuTableau == null)
La taille donné à la création est fixe, elle ne peut être modifiée par la suite.
4
2
Tableaux
Tableaux
unidimensionnels
unidimensionnels Création
La création d’un tableau par new
alloue la mémoire nécessaire en fonction
du type du tableau
type simple : 0
type complexe (classe) : null
mémoire
int[] t1; t1 0
0
0
t1 = new int[7]; 1
2 0
int[] t2 = t1; t2 3 0
4 0
5 0
6 0
Tableaux
Tableaux Accès
Accès
unidimensionnels
unidimensionnels aux
aux éléments
éléments
accès à un élément d'un tableau s'effectue à l'aide d'une expression de la forme :
nomDuTableau[expression1]
expression1 est une expression entière qui définit l’index dans le tableau de
l’élément considéré
3
Tableaux
Tableaux Accès
Accès
unidimensionnels
unidimensionnels aux éléments
aux éléments
[Link] donne la taille du tableau nomDuTableau
int[] tabEntiers = new int[10]
[Link] 10 taille du tableau
[Link] -1 indice max de tabEntiers
Tableaux
Tableaux Accès
Accès
unidimensionnels
unidimensionnels aux
aux éléments
éléments
nomTab[expr entière] désigne la variable correspondant à l’élément
du tableau dont l’index est donné par expr entière
mémoire
int[] t1; t1 10
0
t1 = new int[7]; 1 20
2 30
t1[0] = 1; 3 40
for (int i=1; i<7; i++) 4 50
t1[i] = t1[i-1]+1; 5 60
6 70
4
Tableaux
Tableaux
unidimensionnels
unidimensionnels Création
Tableaux multidimensionnels
typeDesElements[][] nomduTableau;
exemples
double[][] matrice;
Voxel[][][] cubeVoxels;
10
5
Tableaux
Tableaux
multidimensionnels
multidimensionnels Création
dimensions du tableau
ne sont pas spécifiées à la déclaration (comme pour les tableaux à une
seule dimension).
indiquées que lors de la création
obligatoire que pour la première dimension.
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
Tableaux
Tableaux multidimensionnels
multidimensionnels
12
6
Tableaux
Tableaux Accès
Accès
multidimensionnels
multidimensionnels aux éléments
aux éléments
13
Tableaux
Tableaux
multidimensionnels
multidimensionnels Création
int[][] t1 = {
{ 1, 2, 3, 4, 5}, int[][] t1 = new int[2][5];
{ 6, 7, 8, 9, 10}, t1[0][0] = 1; t1[0][1] = 2; ...
}; t1[1][0] = 6; t1[1][1] = 7;...
14
7
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays
15
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays
Exemple : recherche dans un tableau
}
16
8
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays
17
Tableaux
àà propos
propos de
de [Link]
[Link]
ensembles
arbres
18
9
Chapitre IV:
Méthodes en Java
Méthodes
Méthodes fonctions / procédures
exemples
[Link]();
[Link]();
1
Méthodes
Méthodes statiques
statiques Déclaration
« Une déclaration de méthode définit du code exécutable qui peut être
invoqué, en passant éventuellement un nombre fixé de valeurs comme
arguments » The Java Langage Specification J. Gosling, B Joy, G. Steel, G. Bracha
Méthodes
Méthodes statiques
statiques Déclaration
<typeRetour>
Quand la méthode renvoie une valeur (fonction)indique le type de la valeur
renvoyée
static double min(double a, double b)
static int[] premiers(int n)
2
Méthodes
Méthodes statiques
statiques Déclaration
<liste de paramètres>
vide si la méthode n’a pas de paramètres
static int lireEntier()
static void afficher()
une suite de couples type identificateur séparés par des virgules
static double min(double a, double b)
static int min(int[] tab)
Méthodes
Méthodes statiques
statiques Déclaration
Déclaration d’une méthode statique
<corps de la méthode>
suite de déclarations de variables locales et d’instructions
si la méthode à un type de retour le corps de la méthode doit contenir au
moins une instruction return expression où expression délivre une
valeur compatible avec le type de retour déclaré.
static double min(double a, double b) {
double vMin; Variable locale
if (a < b)
vMin = a;
else
vMin = b;
return vMin; Instruction de retour
}
3
Méthodes
Méthodes statiques
statiques Déclaration
si la méthode à un type de retour le corps de la méthode doit contenir
au moins une instruction return expression ...
static boolean contient(int[] tab, int val b) {
boolean trouve = false;
int i = 0;
while ((i < [Link]) && (! trouve)) {
if (tab[i] == val)
trouve = true;
i++;
}
return trouve;
}
Possibilité d’avoir plusieurs
instructions return
for (int i = 0; i < [Link]; i++)
Lorsqu’une instruction return est
{ if (tab[i] == val)
exécutée retour au programme
return true;else
appelant
Les instructions suivant le return return false;}
dans le corps de la méthode ne
sont pas exécutées
7
Méthodes
Méthodes statiques
statiques Déclaration
return sert aussi à sortir d’une méthode sans renvoyer de valeur
(méthode ayant void comme type retour)
4
Méthodes
Méthodes statiques
statiques Déclaration
<corps de la méthode>
suite de déclarations de variables locales et d’instructions
Les variables locales sont des variables déclarées à l’intérieur d’une méthode
elles conservent les données qui sont manipulées par la méthode
elles ne sont accessibles que dans le bloc dans lequel elles ont été
déclarées, et leur valeur est perdue lorsque la méthode termine son
exécution
Méthodes
Méthodes statiques
statiques Invocation
Déclaration static <typeRetour> nomMethode( <liste de paramètres> ) {
<corps de la méthode>
}
int[] tab1 =
static boolean contient(int[] tab,int val){ contient(tab1,14) new int[10]
…
int[] tab2 =
} contient(tab2,i) new int[60]
int i
10
5
Méthodes
Méthodes statiques
statiques Invocation
Le passage de paramètres lors de l’appel d’une méthode est un passage par
valeur.
À l’exécution le paramètre formel défini dans la signature de la méthode
correspond à une variable locale au bloc de la méthode
Elle est initialisée avec la valeur de l’expression définie par le paramètre
effectif.
...
}
11 0 x : 20
------>
p 10 t1[0] : 25
t1[1] : 21
} x 20 25
15
t1
21
11
11
Méthodes
Méthodes statiques
statiques Invocation
Toute méthode statique d’une classe peuvent être invoquée depuis n’importe quelle
autre méthode statique de la classe
public class A {
ordre de déclaration méthodes n’a pas d’importance static void m1() {
...
}
12
6
Méthodes
Méthodes statiques
statiques Commentaires
Toute déclaration de méthode doit TOUJOURS être précédée de
son commentaire documentant (exploité par l’outil javadoc)
13
7
Chapitre V
Classes et Objets
(1ère partie)
! Classes
! Objets
! Références
! Création d’objets
! gestion mémoire
! Envoi de messages
! this : l’objet “courant”
! Objets et encapsulation
Classe
l Une classe est constituée de descriptions de :
l données : que l’on nomme attributs.
l procédures : que l’on nomme méthodes
1
Classe
Notation UML
x : double
y : double attributs
Classe
fichier [Link] Syntaxe JAVA
!!! Le nom doit être identique au nom de la classe
class Point {
nom de la classe
double x;
double y;
attributs
2
Classe
Syntaxe JAVA : visibilité des attributs
Les attributs sont des variables
« globales » au module que
class Point { constitue la classe :
double x; ils sont accessibles dans toutes
double y; les méthodes de la classe.
double distance() {
double dist;
dist = [Link](x*x+y*y);
return dist;
}
}
l De manière générale
l Variable visible à l'intérieur du bloc (ensembles des instructions
entre { … }) où elle est définie
class Visibilité {
int x;
void methodeA() {
float z,w; ...
i = …; x : int z : float w : float
}
void methodeB(float y) {
int z; x : int y : float z : int
do {
... float w; l Variable peut être définie n'importe
zz++; où dans un bloc
} x : int y : float z : int w: float
while (z < i);
w
x = z + ...; Symbole non défini
}
}
6
3
(Syntaxe JAVA : visibilité des variables...)
l Attention !!
l la rédéfinition d ’une variable masque la définition au niveau du
bloc englobant.
class Visibilité {
int x;
void methodeA() {
float z,w; ...
i = …; x : int z : float w : float
}
void methodeB(float y) {
int z; float x; x : int y : float z : int
do {
... float w; float
zz++;
} x : int y : float z : int w: float
while (z < i);
x = z + ...;
}
}
7
Objets
4
Objets
Notation UML
représentation
explicite de Point relation
la classe d'instanciation
«instance of»
nom de classe
point1 : Point
nom d'objet
x = 22
valeurs des
y = 14
attributs
Objets
Point
«instance of»
10
5
Objets
Structure des classes et objets en mémoire
l objet constitué d'une partie "Statique" et d'une partie "Dynamique”
l Partie statique :
l ne varie pas d'une instance de classe à une autre
l Partie dynamique :
l varie d'une instance de classe à une autre
l varie durant la vie d'un objet
l constituée d'un exemplaire de chaque attribut de la classe
double x,y
mémoire Partie statique void translater(…)
structure de la classe double distance()
y 14 y 6 y 14
Références
l Pour désigner des objets dans une classe (attributs ou variables dans le
corps d ’une méthode) on utilise des variables d’un type particulier : les
références
l Une référence contient l’adresse d’un objet
x 22
12
6
Références
déclaration en Java
l Déclarations de références
Point p1;
Point p2, p3;
Cercle monCercle;
mémoire p1
référence null
Références
en Java
Point p1;
…
Point p2;
p2 = p1;
14
7
Création d’Objets
15
Création d’Objets
Instanciation en Java
l new constructeur(liste de paramètres)
l les constructeurs ont le même nom que la classe
l il existe un constructeur par défaut
l sans paramètres
mémoire
isa
Point p1; x 0
p1
p1 = new Point(); y 0
p3 y 0
Janvier 2003 16
8
Création d’Objets
Gestion mémoire en Java
l L’instanciation provoque une allocation dynamique de la mémoire
l En Java le programmeur n’a pas à se soucier de la gestion mémoire
l Si un objet n’est plus référencé (plus accessible au travers d’une référence),
la mémoire qui lui était allouée est automatiquement “ libérée ” (le
« garbage collector » la récupérera en temps voulu).
l Attention : destruction asynchrone (car gérée par un thread)
Aucune garantie de la destruction (sauf en fin de programme! Ou appel
explicite au garbage collector)
mémoire
isa
Point p1; x 0
p1
p1 = new Point(); y 0
p3 y 0
p1 = p2;
Janvier 2003
[Link]
mémoire
isa
Point p1; x 10
0
p1
p1 = new Point(); y 0
p1.x = 10; p3 y 24
0
p2.x = 14;
p3.y = p1.x + p2.x;
Janvier 2003
9
Envoi de messages
l pour "demander" à un objet d'effectuer une opération (exécuter l'une de
ses méthodes) il faut lui envoyer un message
19
Envoi de messages
exemple en JAVA
l syntaxe :
l
[Link]()
mémoire
class Point { isa
double x;
double y; p1 x 10.0
0
void translater(double dx, double dy)
{
y 10.0
0
x += dx; y += dy;
}
double distance() { p2 isa
return [Link](x*x+y*y);
} x 10.0
0
} // Point
y 30.0
0
20
10
Envoi de messages
Paramètres des méthodes
l un paramètre d’une méthode peut être :
l Une variable de type simple
l Une référence typée par n’importe quelle classe (connue dans le contexte de
compilation)
l exemple : savoir si un Point est plus proche de l’origine qu’un autre Point.
Utilisation
Point p1 = new Point();
Point p2 = new Point();
...
if ( ([Link](p2))
????? )
[Link]("p1 est plus proche de l’origine que p2");
else
[Link]("p2
[Link]("p1 estest plus
plus proche
proche dede l’origine
l’origine que
que p1");
p2");
21
Envoi de messages
Passage des paramètres
x 20 25
15
p2
21
11
22
11
L’objet « courant »
Le mot clé this (en Java)
l dans un message l'accent est mis sur l'objet (et nom pas sur l'appel de fonction)
l en JAVA (et de manière plus générale en POO) on écrit :
d1= [Link](); d2=[Link]();
l en C on aurait probablement écrit :
d1=distance(p1); d2=distance(p2);
l l'objet qui reçoit un message est implicitement passé comme argument à la
méthode invoquée
l cet argument implicite défini par le mot clé this (self, current dans d’autres
langages)
l une référence particulière
23
L’objet « courant »
this et envoi de messages
class Point {
double x;
double y;
// constructeurs
Point(double dx, double dy){
...
}
// méthodes
boolean plusProcheDeOrigineQue(Point p){
double distance() {
return [Link](x*x+y*y);
}
}
24
12
L’objet « courant »
this et variables d’instance
Implicitement quand
dans le corps d’une class Point {
méthode un attribut double x;
est utilisé, c’est un double y;
void translater(int dx, int dy) {
attribut de l’objet
x += dx; y += dy;
courant } <==> this.x += dx; this.y += dy;
double distance() {
return [Link](x*x+y*y);
this essentiellement }
utilisé pour lever les x
void placerAuPoint(double x1,double y1){
ambiguités this.x
x x = x; ?????
= x1;
y = y1;
}
}
25
L’objet « courant »
autre utilisation de this
[Link]
26
13
Encapsulation
27
Encapsulation
Visibilité des membres d’une classe (en Java)
public private
28
14
Encapsulation
Visibilité des attributs (en Java)
l les attributs déclarés comme privées (private) sont totalement protégés
l ne sont plus directement accessibles depuis le code d’une autre classe
Point p1 = new Point(); public class Point {
p1.x = 10; [Link](10); private double x;
double x;
p1.y = 10; [Link](10); private double y;
double y;
Point p2 = new Point(); public void translater(int dx, int dy) {
p2.x = p1.x; x += dx; y += dy;
p2.y = p1.x + p1.y; }
public double distance() {
[Link]([Link]()); return [Link](x*x+y*y);
[Link]([Link]()+[Link]()); }
} public void setX(double x1){
l pour les modifier il faut x = x1;
passer par une méthode }
de type procédure … idem pour y
} public double getX(){
l pour accéder à leur valeur il
return x;
faut passer par une méthode }
de type fonction … idem pour y
}
29
Encapsulation
Méthodes privées
l Une classe peut définir des méthodes privées à usage interne
public class Point {
private double x;
private double y;
• une méthode
// constructeurs privée ne peut plus
public Point(double dx, double dy){ être invoquée en
... dehors du code de
} la classe où elle est
// méthodes définie
public double distance() {
private
return [Link](x*x+y*y);
} public class X {
15
Chapitre V
Classes et Objets
2ème partie
l Rappels
l Constructeurs
l Surcharge des méthodes
l Variables de classe
l Constantes
l Méthodes de classe
l Le main()
l Initialiseur statique
l Finalisation
Rappels
fichier [Link]
nom de la classe
public class Point {
private double x;
private double y;
attributs
1
Rappels
l les attributs déclarés comme privées (private) sont totalement protégés
(principe d’encapsulation)
l ne sont plus directement accessibles depuis le code d’une autre classe
}
}
Rappels
référence
mémoire
isa
Point p1; x 0
p1
p1 = new Point(); y 0
p3 y 0
égalité d ’objets
[Link](p2) --> true
il faut passer par une public boolean egale(Point p) {
méthode de la classe return (this.x == p.x) && (this.y == p.y);
Point }
4
2
Constructeurs
le retour
Constructeurs
public class Point { Définition explicite
private double x;
private double y;
public Point(double x, double y){
pas de constructeur
Déclaration explicite
public this.x = x;
Point(){ déclaré : constructeur
d ’un constructeur
} this.y = y; par défaut
} • Le constructeur par
défaut est masqué
public void translater(double dx, double dy) { • nom du constructeur identique
x += dx; y += dy; à celui de la classe
} • pas de type de retour ni mot
public double distance() { void dans la signature
• retourne implicitement
return [Link](x*x+y*y); instance de la classe (this)
} • pas d ’instruction return
public void setX(double x){ dans le constructeur
this.x = x;
} Création d ’objet
public double getX(){
return x; new Point()
}
… idem pour y new Point(15,14)
}
3
Constructeurs
Constructeurs multiples
l Possibilité de définir plusieurs constructeurs dans une même classe
l possibilité d'initialiser un objet de plusieurs manières différentes
l possible de définir des méthodes possédant le même nom mais dont les
arguments diffèrent
4
Surcharge des méthodes
exemple
public class Point {
// attributs
private double x;
private double y;
// constructeurs
public Point(double x, double y){ Point p1=new Point(10,10);
... Point p2=new Point(15,14);
} [Link]();
[Link](p2);
// méthodes
public double distance() {
return [Link](x*x+y*y);
}
public double distance(Point p){
return [Link]((x - p.x)*(x - p.x)
+ (y - p.y) * ( y - p.y));
}
...
}
Constructeurs
Appel d’un constructeur par un autre constructeur
10
5
Constructeurs
Appel d’un constructeur par un autre constructeur
// constructeurs
public Point(double x, double y)
private
{
this.x = x;
this.y = y;
}
Intérêt :
public Point(Point p) •Factorisation du code.
{ •Un constructeur général invoqué par
xthis(p.x,p.y);
= p.x; y = p.y; des constructeurs particuliers.
}
public Point()
{ Possibilité de définir des
xthis(0.0,0.0);
= 0.0; y= 0.0;
constructeurs privés
}
...
}
11
Variables de classe
y 14 y 6 y 14
l il peut être parfois utile de définir pour une classe des variables
indépendamment des instances
l exemple : on veut à tout moment pouvoir connaître le nombre de points
qui ont été créés, ceci depuis le code de n’importe quelle classe utilisant
la classe Point
12
6
Variables de classe
nbPtsCrées 3
mémoire Partie statique double x,y ??
structure de la classe void translater(…)
double distance() nbPtsCrées 3
y 14 y 6 y 14
13
Variables de classe
déclaration
public class Point {
private double x;
private double y;
public static int nbPtsCréés = 0;
// constructeurs
public Point(double x, double y) en JAVA pour définir une
{
variable de classe il faut
this.x = x;
précéder sa déclaration du
this.y = y; mot clé static
nbPtsCréés++;
}
public Point(Point p)
{
this(p.x,p.y);
} Dans le corps de la classe
les variables de classe sont
public Point() utilisées comme les autres
{ variables
this(0.0,0.0);
}
...
}
14
7
Variables de classe
Accès en dehors du code de la classe
lde la même manière que les variables d'instance sont accédées via
les noms (références) des instances de la classe, les variables de
classe sont accédées au travers du nom de la classe
l une variable de classe est désignée à l'aide de la syntaxe suivante :
[Link]
15
Variables de classe
Constantes
l Des constantes nommées peuvent être définies par des variables de classe
dont la valeur ne peut être modifiée
16
8
Méthodes de classe
Méthodes statiques
l [Link]éthode(liste de paramètres)
en dehors du code de la classe.
l n'est pas conditionnée par l'existence d'instances de la classe,
l [Link](x) [Link](90) ...
17
Méthodes de classe
exemple
public class Point {
private double x;
private double y;
public static int nbPtsCréés = 0;
private
18
9
[Link]
???
[Link]("COUCOU");
Classe System
du package
[Link]
Variable de classe
(référence un objet de
type PrintStream)
Méthode d ’instance de
la classe PrintStream
du package [Link]
19
Le main()
l Le point d ’entrée pour l’exécution d ’une application Java est la
méthode statique main de la classe spécifiée à la machine virtuelle
l profil de cette méthode
public static void main(String[] args)
l String[] args ???
l args : tableau d’objets String (chaînes de caractères) contenant
les arguments de la ligne de commande
public class TestArgs {
public static void main(String[] args) {
[Link]("nombre d ’arguments : " + [Link]);
for (int i =0; i < [Link]; i++)
[Link](" argument " + i + " = " + args[i]);
}
}
20
10
Le main()
l Les différentes classes d’une même application peuvent éventuellement
chacune contenir leur propre méthode main()
[Link]
[Link] java Class1
[Link]
_main(...)
java Class3
_main(...)
_main(...)
l Interêt
l possibilité de définir de manière indépendante une test unitaire pour
chacune des classes d’un système
21
22
11
Initialisation des variables
initialiseurs statiques
l si les initialisations nécessaires pour les variables de classe ne peuvent être faites
directement avec les initialiseurs (expression) JAVA permet d'écrire une méthode
(algorithme) d'initialisation pour celles-ci : l'initialiseur statique
xs un nombre tiré au hasard entre 0 et 10
ys somme de n nombres tirés au hasard, n étant la partie entière de xs
zs somme de xs et ys
l Invocation
l automatique et une seule fois lorsque la classe est chargée
23
24
12
Destruction des objets
finalisation
l "ramasse miettes" gère automatiquement ressources mémoire utilisées par les
objets
l un objet peut parfois détenir d'autres ressources (descripteurs de fichiers,
....) qu'il faut libérer lorsque l'objet est détruit.
l méthode dite de "finalisation" prévue à cet effet
l méthode d'instance
class Point {
private double x;
private double y;
Point[x:14.0, y:14.0]
Point[x:10.0, y:10.0]
null
Point[x:10.0, y:10.0]
finalisation de Point[x:24.0, y:24.0]
26
13