[Go to site: main page, start]

0% ont trouvé ce document utile (0 vote)
8 vues79 pages

Introduction au langage Java et OOP

Transféré par

Haythem Khiari
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
8 vues79 pages

Introduction au langage Java et OOP

Transféré par

Haythem Khiari
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre I :

Introduction à Java

La technologie JAVA

• Java c’est quoi ?


– Un environnement de programmation orienté objets développé par
SUN et adapté à la distribution d’applications sur Internet et
s’intégrant au Web. « The network is the computer »

• 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 :

« Java : a simple, object-oriented, robust, secure, portable

, high-performance, multithreaded ,...»

2
Le langage Java
un langage orienté-objet

• Qu’est-ce qu’un objet ?

– Modélise toute entité identifiable ou concrète, manipulée


par l’application logicielle
• une chose tangible
ex: ville, véhicule, étudiant, un bouton sur l’écran
• une chose conceptuelle
ex: date, réunion, planning de réservation
– Réagit à certains messages qu’on lui envoie de l’extérieur; la façon
dont il réagit détermine le comportement de l’objet.
– Ne réagit pas toujours de la même façon à un même message; sa
réaction dépend de l’état dans lequel il se trouve.

Le langage Java
un langage orienté-objet

• Un objet possède :

– Une identité unique (permet de distinguer un objet d’un autre)

– Un état interne donné par des valeurs de variables (ou attributs)


• Attributs décrivent l’état de l’objet à un instant donné
– ex: patient mesure 1,82 m et pèse 75 Kg
• Attributs sont typés et nommés
– ex: float hauteur; float poids;

– Un comportement (capacités d’action de l’objet) donné par des fonctions


ou sous-programmes, appelés méthodes (ou opérations).
• Méthodes définissent le comportement de l’objet (ce qu’il peut faire,
comment il peut le faire…) et ses réactions aux stimulations externes
– ex: un étudiant passe un examen, etc…
• Méthodes implémentent les algorithmes invocables sur cet objet

3
Le langage Java
un langage orienté-objet

• Un objet = données + algorithmes


– Un objet est le regroupement de données (variables ou attributs) et des traitements
(méthodes) associées

• Principe d’encapsulation Comportement


– L’accès aux données (état) de l’objet ne peut
être fait qu’au travers des méthodes. Etat
– Les données sont privées (cachées) (caché)
– Les méthodes publiques définissent l’interface de
de l’objet Un objet
(public)
setHeures

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);

Objet récepteur Méthode Paramètre du


du message invoquée message

objet maMontre [Link]();

Le langage Java
un langage orienté-objet
• Les objets s’envoient des messages entre eux

[Link](14)
setHeure(int h)

objet Pierre objet maMontre

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

objet montre1 objet montre2


11

Le langage Java
un langage orienté-objet

• Classe = raffinement/spécialisation d’une classe existante


• Elles forment une hiérarchie de classes, où chaque classe :
– hérite des attributs et méthodes de ses ancêtres/super-classes
– ajoute de nouveaux attributs
et/ou de nouvelles méthodes
code Montre
– peut modifier ou redéfinir
les méthodes héritées
MontreAiguilles MontreDigitale

• Intérêt héritage : hérite de


– Réutilisation du code
– Pas besoin de réinventer
la roue à chaque fois
instance de instance de
mémoire

montre3 montre1 montre2


12

6
Le langage Java
un langage orienté-objet

• Approche procédurale (C) • Approche Objet


– Définir les structures de données – Identifier les classes
– Définir les traitements – Pour chaque classe
• Analyse descendante • Définir son interface publique
– Le programme principal enchaîne (signature des méthodes)
les traitements. • Définir son implémentation
(attributs, corps des méthodes)
– Le programme principal :
• création (instanciation) d’objets en
mémoire
• lance 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

13

Le langage Java
un langage orienté-objet

• Exemple : les visages animés Demo

– Quels sont les concepts/les objets composant le jeu ?


– Que doivent savoir faire ces objets ?
– Quelles sont leurs propriétés ?
Visages animés

14

7
Le langage Java
un langage orienté-objet

• Exemple : les visages animés


• Objets ?
• Capacité d’action des objets : que font-ils ?
• Attributs des objets : quelles sont leurs propriétés ?
Visages animés
Fenêtre
• capacités d’action
• se fermer
• s’iconifier
• passer au premier plan
• ...
• attributs
• position
• largeur, hauteur
• ...

Utilisation d’une classe existante dans Java


(JFrame)
15

Le langage Java
un langage orienté-objet

• Exemple : les visages animés


• Objets ?
• Capacité d’action des objets : que font-ils ?
• Attributs des objets : quelles sont leurs propriétés ?
Visages animés Visages
• capacités d’action
• sourire
• faire la tête
• avancer
• changer de direction
• s’afficher
• attributs
• couleur
• position
• largeur, hauteur
• ...

Ecriture d’une nouvelle classe (Visage)


16

8
Le langage Java
un langage orienté-objet

• Exemple : les visages animés


• Objets ?
• Capacité d’action des objets : que font-ils ?
• Attributs des objets : quelles sont leurs propriétés ?
Visages animés
Zone de dessin
• capacités d’action
• s’effacer
• afficher les objets qu’elle contient
• ...
• attributs
• fenêtre où elle se trouve
• couleur du fond
• ...

Ecriture d’une nouvelle classe (ZoneDessin) en


Réutilisant (héritage) une classe existante dans
Java (JPanel) 17

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 ?)

• offre toutes la fonctionnalité d'un langage de programmation puissant


• syntaxe familière (proche du C ou du C++)
• mais débarrassé des caractéristiques prêtant à confusion
– pas de structures ni de macros (struct, typedef et #define)
• gestion automatique de la mémoire
– malloc() et free() n'existent plus

• Simple à prendre en main mais pas limité,


• Mais comme pour tous les langages objets, il faut une certaine expérience
avant de tirer parti au mieux de ses possibilités et surtout de son API très
riche

20

10
Le langage Java
Java un langage distribué

• au travers des classes du JDK :


– fournit un ensemble de classes intégrant une gestion plus ou moins
transparente du réseau
– il suffit de quelques lignes de code pour programmer :
• récupération d'un fichier au travers du protocole HTTP
• depuis version 1.1 :
– possibilité d'envoyer des messages de manière transparente à un objet
JAVA situé sur une machine distante

21

Le langage Java
Java un langage "multithreadé"

• "thread" (processus léger)


– partie de code, un "flot d'instructions" s'exécutant en concurence avec d'autres threads dans un
même processus
– cela permet à un seul programme d'effectuer plusieurs activités simultanément (programmes
multitâches)
• threads font partie intégrante du langage JAVA (jusque dans certains des
mots clés)
– simplicité de mise en oeuvre
– portabilité (plus directement d’appels système)

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é

• Compilation d'un programme JAVA : génération de byte-code


• Le byte-code est :
– proche d'un langage machine
– indépendant de l'environnement d'exécution (matériel + OS)

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

code source : [Link] byte-code : [Link]

24

12
La machine virtuelle Java
Exécution d'un programme Java compilé

• byte-code assure la portabilité des programmes Java


– langage d'une Machine Virtuelle
– à l'exécution un interpréteur simule cette machine virtuelle

javac java Java PC


VM Windows

.java .class
source byte-code
Java PowerPc
VM MacOS X

Java Sun Sparc


VM Solaris
Linux

25

La machine virtuelle java


Principes de fonctionnement

• 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 Applications indépendantes


– Programmes autonomes (stand-alone)

• Les Applets
– Programmes exécutées dans l’environnement d’un
navigateur Web et chargés au travers de pages HTML
Demo

Seuls diffèrent les contextes d'invocation et d’exécution


– Les droits des applets et des applications ne sont pas les mêmes

27

Types de programmes Java


Application indépendante

• Application doit posséder une classe principale


– classe possédant une méthode de signature

public static void main(String[] args)

• Cette méthode sert de point d’entrée pour l’exécution


– l ’exécution de l ’application démarre par l’interprétation de cette
méthode

ex : java AppliVisage1

28

14
Types de programmes Java
Applet

• Classe ne possédant pas de méthode main()


• Son bytecode réside sur un serveur http
• Elle est véhiculée vers un client http (navigateur Web)
via une page html qui contient son url
• Lorsqu’un navigateur compatible Java (avec sa propre
machine virtuelle java (JVM)) reçoit cette page HTML, il
télécharge le code de la classe et l’exécute sur le poste
client
– l’applet doit posséder un certain nombre de méthodes pour
permettre cette exécution
• init(), start(), stop(), paint(), destroy()

29

Types de programmes Java


Applet : Principe de fonctionnement
<HTML>
<HEAD>
<TITLE>A Clock (1.1)</TITLE> [Link]
</HEAD>
<BODY> 1. Demande de chargement d ’une
<h1>A Clock (1.1)</h1>
<hr> page web contenant une applet
<applet code="[Link]"
width=170 height=150> HTML
<param bgcolor="C0C0C0"> HTML
2. Chargement de la page html HTML
</applet>
.... HTML
</BODY>
[Link] HTML
HTML
Serveur HTML
http
Client
http .class
3. Demande de chargement .class
Navigateur de l’applet référencée dans la page .class
intégrant une .class
machine
virtuelle Java

5. Exécution de 4. Chargement du bytecode des


l’applet dans classes de l’applet
la JVM du client [Link]

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é

• Palier aux lenteurs de l'interprétation


– utilisation d ’un JIT (compilateur « Just-in-Time »)
• compilation à la volée du byte-code
• réutilisation du code déjà compilé
• intégration du JIT HotSpot dans JVM depuis version 1.3

31

Les API de Java


Les packages (paquetages)

• Package : regroupement de classes ayant un lien logique entre-


elles
– pour les utiliser dans d'autres classes
– pour les « spécialiser »

• En plus d’un langage de programmation, l’environnement Java


définit une API (Application Programmer’s Interface) extrêmement
riche au travers de nombreux packages standards.

• Programmer en Java nécessite une bonne connaissance de ces


packages

32

16
Les API de Java
Packages de classes standards

• [Link] : classes essentielles


• objet, types de base, processus,...
• [Link] : structures de données (collections)
• listes, ensembles, hashtables, arbres, itérateurs ….
• [Link] : interface graphique (Abstract Window Toolkit)
• fenêtres, boutons, événements...
• [Link] : entrées / sorties
• flot de données provenant : d'un fichier,... »
• [Link] : réseau
• URL,...

33

Les API de Java


Packages de classes standards (suite)

• [Link] : JDBC (Java Data Base Connectivity)


• connexion à une base de données relationnelle
• envoi de requêtes SQL, récupération des résultats
• [Link] : composants logiciels
• Pièces logicielles autonomes pouvant être contrôlées dynamiquement
et assemblées pour former des applications

• environnement d'exécution des JavaBeans est intégré dans la plate-


forme Java
• [Link] : interface graphique
• composants d ’interface de plus haut niveau que ceux de awt
• look and feel indépendant de l ’OS
• exploitation du modèle MVC (Model View Controler)
• …..
34

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

Standard Edition Fourni les compilateurs, outils, runtimes, et APIs pour


JDK
J2SE écrire, déployer, et exécuter des applets et applications
dans la langage de programmation Java

Entreprise Edition Destinée au développement d’applications « d’entreprise »


J2EE («business applications») robustes et interopérables.
Simplifier le développement et le déploiement
d’applications distribuées et articulées autours du web.

Mobile Edition Environnement d’exécution optimisé pour les dispositifs


J2ME « légers » :
• Carte à puce (smart cards)
• Téléphones mobiles

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)

• La plateforme Java 2, Enterprise Edition (J2EE) a pour objectifs de


réduire le coût et la complexité du développement de ces applications
multi-tiers.
37

20
Les différentes éditions de Java
Java EE : principales technologies et API

• Servlets Java ([Link] : java server development kit)


• Servlets : extension d’un serveur Web à l’aide de classes Java, génération dynamique de
contenu Web
• JavaServer Pages (JSP) Technology
• Combinaison de documents statiques (HTML, XML) et de scripts java pour génération
dynamique de contenu.
• Enterprise JavaBeans Technology
• Modèles de composants pour objets métiers. Par exemple pas besoin d’écrire de code JDBC pour
accéder aux base de données, géré automatiquement par le containeur d’EJB.

• 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

Quelques différentes éditions de Java


J2EE

• 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

Sun ONE Studio WebSphere Studio JBuilder IntelliJ Visual J++


(Forte for Java) Application Developper Borland JetBrains Microsoft
...
Sunsoft (VisualAge)
IBM C# .net
• Des environnements open-source ou freeware

NetBeans Eclipse BlueJ Emacs + JDE


[Link] [Link] [Link] [Link]

40

22
CHAPITRE II :

Types et instructions de base Java

Identificateurs
 Nommer les classes, les variables, les méthodes, ...
 Un identificateur Java

 est de longueur quelconque

 commence par une lettre, le symbole "$" , et le caractère

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

 Lesmots contenus dans un identificateur commencent par


une majuscule :
 UneClasse, uneMethode, uneVariable

 On préférera ageDuCapitaine à ageducapitaine ou

age_du_capitaine

 Lesconstantes sont en majuscules et les mots sont


séparés par le caractère souligné « _ » :
 UNE_CONSTANTE

Mots-clés Java

abstract, boolean, break,


byte,case,catch, char,class,
continue,default, do, double, else,
extends,final, finally, float, for,
if, implements, import, instanceof,
int, interface, long, native, new,
null,package, private, protected,
public, return, short, static,
super, switch, synchronized, this,
throw, throws, transient, try,
void, volatile, while
4

2
Commentaires
 Sur une ligne
// Comme en “C++”, après un slash-slash
int i; // commentaire jusqu’à la fin de la ligne

 Sur plusieurs lignes


/* Comme en “C”, entre un slash-étoile et
un étoile-slash, sur plusieurs lignes */

Commentaires

Commenter le plus possible et judicieusement

Chaque déclaration (variable, mais aussi méthode,


classe)

Commenter clairement

3
Types de données en Java

 2 grands groupes de types de données :


 types primitifs
 objets (instances de classe)

 Java manipule différemment les valeurs des types


primitifs et les objets : les variables contiennent
 des valeurs de types primitifs
 ou des références aux objets

Types primitifs

 Valeur logique
 boolean (true/false)

 Nombres entiers

 byte (1 octet), short (2octets), int (4 octets), long (8 octets)

 Nombres non entiers (à virgule flottante)

 float (4 octets), double (8 octets).

 Caractère (un seul)

 char (2 octets) ;

4
Types primitifs et valeurs

Type Taille Valeurs


boolean 1 true, false
byte 8 -27 à + 27-1
char 16 0 à 65535
short 16 -215 à + 215-1
int 32 -231 à + 231-1
long 64 -263 à + 263-1
float 32 1.40239846e-45 à 3.40282347e38
double 64 4.94065645841246544e-324
à 1.79769313486231570e308

Constantes nombres

 Une constante «entière» est de type long si elle est


suffixée par «L» et de type int sinon
 Une constante «flottante» est de type float si elle est
suffixée par «F» et de type double sinon

 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

'\n' nouvelle ligne

'\r' retour arrière

'\f' saut de page

11

Autres constantes

 Type booléen
 false
 true

 Référence inexistante (indique qu’une variable de


type non primitif ne référence rien)
 null

12

6
Forcer un type en Java

 Java langage fortement typé


 Dans certains cas, nécessaire de forcer le programme à
considérer une expression comme étant d’un type qui
n’est pas son type réel ou déclaré
 On utilise le cast : (type-forcé) expression

 Exemple
 int i = 64;
 char c = (char)i;

13

Casts entre types primitifs

 Un cast entre types primitifs peut occasionner une perte de


données
 Par exemple, la conversion d'un int vers un short peut
donner un nombre complètement différent du nombre de
départ

 Un cast peut provoquer une simple perte de précision


 Par exemple, la conversion d'un long vers un float peut
faire perdre des chiffres significatifs mais pas l'ordre de
grandeur

14

7
Casts entre types primitifs

 Lesaffectations entre types primitifs peuvent utiliser un cast


implicite si elles ne peuvent provoquer qu'une perte de
précision (ou, encore mieux, aucune perte)
int i = 130;
double x = 20 * i;

 Sinon, elles doivent comporter un cast explicite


int i = 130;
byte b = (byte)(i + 2);

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)

 ++ -- (pré ou post décrementation)

 Logiques
 && (et) || (ou) ! (négation)
 Relationnels
 == != < > <= >=
 Affectations
 = += -= *= …

17

9
Déclarations
 Avant toute utilisation dans un programme une variable doit être déclarée

 syntaxe: type identificateur


 type : un type primitif ou un nom de classe

 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;

 Attention en JAVA comme en C, l'affectation est un opérateur. L'affectation peut


donc être utilisée comme une expression dont la valeur est la valeur affectée à la
variable
i = j = 10;

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

 Syntaxe if ( expression booléenne ) instruction1


ou bien
if ( expression booléenne )
instruction1
else
instruction2

 exemple if (i==j)
{
j = j -1;
i = 2 * j;
}
else
i = 1;

21

11
Flot de contrôle

boucle tantque ... faire - instruction while ()

 Syntaxe while ( expression booléenne )


instruction

 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

boucle répeter ... jusqu’à – instruction do while ()

 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

boucle pour – instruction for


 Syntaxe for (expression1 ; expression2; expression3)
instruction
Expression 1

 Exemple non
Expression 2 == true
oui

instruction

Expression 3
int i = 0;
int somme = 0;
for (i = 0; i <= 10; i++)
somme += i;

[Link]("Somme des 10 premiers entiers" + somme);

24

Entrées/sorties
sur console
Affichage sur la console
[Link](chaîne de caractères à afficher)
[Link](chaîne de caractères à afficher)

 chaîne de caractères peut être :


 une constante chaîne de caractères (String)
[Link]("coucou");
 une expression de type String
[Link](age);
 une combinaison (concaténation) de constantes et d'expressions
de type String. La concaténation est exprimée à l'aide de
l'opérateur +
[Link]("L'age de la personne est " +
age + " son poids " + poids);

25

13
Chapitre III :
Tableaux
en Java

Tableaux

 Fournissent des collections ordonnées d'éléments


 Composants d'un tableau peuvent être :

 des variables des types de base (int, byte, short, long,


boolean, double, float, char)
 des références sur des objets (tableaux d’objets)

Les tableaux = objets en java (et pas seulement une


suite d'emplacements mémoire comme en C/C++)

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)

 Pour utiliser un tableau, après la déclaration d’un identificateur permettant de le


désigner, il faut ensuite explicitement "créer" ce tableau en mémoire.
 la "création" s’effectue à l’aide de l’opérateur new (utilisé pour créer des
objets, or on le verra plus tard les tableaux sont des objets).
 nomDuTableau = new typeDesElements[taille]

 exemples int[] vecteurEntiers;


vecteurEntiers = new int[50];

Compte[] listeDesComptes = new Compte[1000];

 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

de la taille spécifiée

 initialise le contenu 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é

 comme en C/C++ les éléments d’un tableau sont indexés de 0 à taille-1

 Java vérifie automatiquement l'indice lors de l'accès (comparaison avec la


borne)
 Si hors limites : ArrayIndexOutOfBoundsException

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

 L’argument String[] args du main est un tableau de chaînes de


caractères (String) correspondant aux 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]);
}
}

 Affiche sur la console les arguments

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

en partie gauche d’une dans une expression délivre le


affectation désigne un contenu (la valeur de cet élément
élément du tableau

4
Tableaux
Tableaux
unidimensionnels
unidimensionnels Création

 Une autre manière de créer des tableaux :


 en donnant explicitement la liste de ses éléments à la déclaration (liste de
valeurs entre accolades)
 exemples :

int[] t1 = { 1, 2 ,3, 4, 5};

char[] codes = { 'A', 'a', 'B', 'z' };

 l ’allocation mémoire (équivalent de l ’utilisation de new) est prise en


charge par le compilateur

Tableaux multidimensionnels

 tableau dont les éléments sont eux mêmes des tableaux

 un tableau à deux dimensions se déclarera ainsi de la


manière suivante :

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.

 autres dimensions peuvent n'être spécifiées que lors de la création


effective des tableaux correspondants.
Création d ’une matrice
double [][] matrice = new double[4][4];
4x4 de réels

double [][] matrice = new double[4][];


for (int i=0; i < 4; i++)
matrice[i] = new double[4]; Les 3 écritures sont
équivalentes
double [][] matrice;
matrice = new double[4][];
for (int i=0; i < 4; i++)
matrice[i] = new double[4];
11

Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
Tableaux
Tableaux multidimensionnels
multidimensionnels

 chaque tableau imbriqué peut avoir une taille différente.


isa
0

char [][] txt; isa ...


...
null
txt = new char[6][]; txt 0
79
1
txt[0] = new char[80]; 2 isa
3 0
txt[1] = new char[40]; 4 …
txt[2] = new char[70]; 5 39
...

12

6
Tableaux
Tableaux Accès
Accès
multidimensionnels
multidimensionnels aux éléments
aux éléments

 accès aux éléments d’un tableau multidimensionnel (exemple 2d)


 accès à un élément d'un tableau s'effectue à l'aide d'une
expression de la forme :
nomDuTableau[expression1][expression2]

– expression1 délivre une valeur entière entre les bornes 0 et
[Link] - 1
– expression2 délivre une valeur entière entre les bornes 0 et
nomDuTableau[expression1].length - 1
isa
0
char[][] txt = new char[5][]; …
txt[0] = new char[80]; isa ...

txt[1] = new char[40]; ...


null
txt 0
79
txt[0][1] = ‘S’; 1
2 isa
txt[1][0] = ‘H’; 3 0
4 …
5 39

13

Tableaux
Tableaux
multidimensionnels
multidimensionnels Création

 Comme pour tableaux unidimensionnels possible de créer un tableau


multidimensionnel en donnant explicitement la liste de ses éléments à
la déclaration (liste de valeurs entre accolades)
 exemples :

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;...

Cette virgule finale n’est


pas une faute de frappe
,elle est optionnelle et est
juste là pour permettre
une maintenance plus
facile de longues listes
(et faciliter les couper/
coller des programmeurs
pressés…

14

7
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays

 package [Link] définit une classe, Arrays, qui propose des


méthodes statiques (de classe) pour le tri et la recherche dans des
tableaux.

Exemple : tri d’un tableau


// tableau de 1000 réels tirés au hasard
// dans l ’intervalle [0..1000[
double[] vec = new double[1000];
for (int i = 0; i < [Link]; i++)
vec[i] = [Link]()*1000;
Le tri.
// tri du tableau
[Link](vec);

// affiche le tableau trié


for (int i = 0; i < [Link]; i++)
[Link](vec[i] + " " );

15

Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays
Exemple : recherche dans un tableau

// tableau de 1000 entiers tirés au hasard


// dans l ’intervalle [0..1000[
int[] vec = new int[1000];
for (int i = 0; i < [Link]; i++)
vec[i] = (int) ([Link]()*1000);
// tri du tableau Il faut que le tableau soit
trié avant toute recherche
[Link](vec);
// recherche de la valeur 500 La recherche
int pos = [Link](vec,500);
// utilisation des résultats de la recherche
if (pos >= 0)
[Link]("position de 500 : " + pos);
else {
[Link]("500 n ’est pas dans le tableau");

}
16

8
Tableaux
Tableaux
multidimensionnels
multidimensionnels Tableaux
àà propos
propos de
de la
la classe
classe Arrays
Arrays

 pour chaque type de tableau


 Des méthodes de recherche

int binarySearch(char[ ] a, char key ) , int binarySearch(int[ ] a, int key),etc)

 Des méthodes de tris


 sort(char[ ] a) , sort(int[ ] a) ….. sort(Object[ ] a)

 Des méthodes de test d’égalité


 boolean equals(char[ ] a1, char[ ] a2), boolean equals(int[ ] a1,
int[ ] a2), …..

17

Tableaux
àà propos
propos de
de [Link]
[Link]

 Les tableaux sont des structures de données élémentaires


 Le package [Link] contient plein de classes « sympa » pour la
gestion de structures de données plus évoluées (collections) :
 listes

 ensembles
 arbres

 mais pour apprécier il faudra être un peu patients…


parlons d ’abord d’objet,
d’héritage,
de classes abstraites
et d ’interfaces ;-) !

18

9
Chapitre IV:
Méthodes en Java

Méthodes
 Méthodes  fonctions / procédures

 Pour factoriser du code


 Pour structurer le code
 Pour servir de « sous programmes utilitaires » aux autres méthodes
de la classe
…

 En java plusieurs types de méthodes


 Opérations sur les objets (cf. envois de messages)

 Opérations statiques (méthodes de classe)

 exemples
[Link]();
[Link]();

 Pour le moment nous ne nous intéresserons qu’au second type


2

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

 Déclaration d’une méthode statique

static <typeRetour> nomMethode( <liste de paramètres> ) {


<corps de la méthode>
}
Signature de la méthode
 exemple

static double min(double a, double b) {


if (a < b)
return a;
else
return b;
}

Méthodes
Méthodes statiques
statiques Déclaration

 Déclaration d’une méthode statique

static <typeRetour> nomMethode( <liste de paramètres> ) {


<corps de la méthode>
}

 <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)

 void si la méthode ne renvoie pas de valeur (procédure)


static void afficher(double[][] m)

2
Méthodes
Méthodes statiques
statiques Déclaration

 Déclaration d’une méthode statique

static <typeRetour> nomMethode( <liste de paramètres> ) {


<corps de la méthode>
}

 <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

static <typeRetour> nomMethode( <liste de paramètres> ) {


<corps de la méthode>
}

 <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)

static void afficherPosition(int[] tab, int val) {

for (int i = 0; i < [Link]; i++)


{ if (tab[i] == val){
[Link]("La position de " + val + " est " + i);
return;
}else

[Link](val + " n’est pas présente dans le tableau");}

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

static void method1(...) {


int i;
double y;
int[] tab;
...
static double method2(...) {
}
double x;
double y;
Possibilité d’utiliser le même identificateur double[] tab;
dans deux méthodes distinctes
...
pas de conflit, c’est la déclaration locale qui
est utilisé dans le corps de la méthode
}

Méthodes
Méthodes statiques
statiques Invocation
 Déclaration static <typeRetour> nomMethode( <liste de paramètres> ) {
<corps de la méthode>
}

 Appel nomMethode(<liste de paramètres effectifs>)

 <liste de paramètres effectifs>


 Vide si liste de paramètres vide
static void afficher(){ afficher()

}
 Liste d’expressions dont le nombre et le type correspond au nombre et au
type des paramètres de la méthode

static double min(double a, double b){ min(10.5,x) double x



double x,y
} min(x + y * 3,i)
int i

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.

class Bidon { int[] t1 = new int[2];


t1[0] = 15;
... t1[1] = 11;
static void foo(int x, int[] p) { int x = 20;
... foo(x,t1);
for (int i = 0; i < [Link]; i++) [Link]("x " + x);
p[i] += 10; [Link]("t1[0] " + t1[0]);
x = x + 10; [Link]("t1[1] " + t1[1]);

...
}
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() {
...
}

static void m2() {


m1();
m3();
}

static void m3() {


...
}
 Pour invoquer méthode d’une autre classe il faut }
la préfixer par NomClasse.
[Link](); [Link](); [Link](monTableau);

Ne pas oublier import pour


 Possibilité d’avoir des méthodes avec les classes d’un autre
package que [Link]
des signatures identiques dans des import [Link]
classes différentes

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)

Ce que fait la méthode


/**
* Recherche un valeur dans un tableau d’entier
*
* @param tab le tableau dans lequel la recherche
Description des
directives
* est effectuée
paramètres
pour * @param val la valeur à rechercher
l’outil *
javadoc
* @return true si tab contient val, false sinon Explication
*/ de la valeur
static boolean contient(int[] tab, int val) { retournée
...
}

13

7
Chapitre V
Classes et Objets
(1ère partie)
! Classes
! Objets
! Références

! Création d’objets

! constructeur par défaut

! gestion mémoire

! Accès aux attributs d’un objet

! 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

l Une classe est un modèle de définition pour des objets


l ayant même structure (même ensemble d'attributs),
l ayant même comportement (mêmes opérations, méthodes),

l Les objets sont des représentations dynamiques (instanciation),


« vivantes » du modèle défini pour eux au travers de la classe.
l Une classe permet d’instancier (créer)plusieurs objets
l Chaque objet est instance d’une (seule) classe

1
Classe
Notation UML

Point nom de la classe

x : double
y : double attributs

translater(x : double ,y : double)


distance()
... méthodes

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

void translater(double dx,double dy){


x += dx;
y += dy;
}
méthodes
double distance() {
double dist;
dist = [Link](x*x+y*y);
return dist;
}
}

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.

void translater(double dx,double dy){


x += dx;
y += dy;
}

double distance() {
double dist;
dist = [Link](x*x+y*y);
return dist;
}
}

(Syntaxe JAVA : visibilité des variables)

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

l Un objet est instance d'une (seule) classe :


l il se conforme à la description que celle-ci fournit,
l il admet une valeur (qui lui est propre) pour chaque
attribut déclaré dans la classe,
l ces valeurs caractérisent l’état de l ’objet
l il est possible de lui appliquer toute opération (méthode)
définie dans la classe

l Tout objet admet une identité qui le distingue pleinement des


autres objets :
l il peut être nommé et être référencé par un nom

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

Notation d'un objet point1, instance de la classe Point


9

Objets

l Chaque objet point instance de la classe Point possédera son


propre x et son propre y

Point

«instance of»

point1 : Point point2 : Point point3 : Point


x = 22 x = 57 x = 56
y = 14 y=6 y = 14

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 un seul exemplaire pour l'ensemble des instances d'une classe

l permet d'activer l'objet

l constituée des méthodes de la classe

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()

isa isa isa


Partie dynamique
structure des instances x 22 x 57 x 56

y 14 y 6 y 14

© Philippe GENOUD UJF Janvier 2003 11

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

l pointeur vers la structure de données correspondant aux attributs


(variables d’instance) propres à l’objet.
mémoire
isa

x 22

référence y 14 référence null

l Une référence peut posséder la valeur null


l aucun objet n’est accessible par cette référence
l Déclarer une référence ne crée pas d’objet
l une référence n’est pas un objet, c’est un nom pour accéder à un objet

12

6
Références
déclaration en Java

l Déclarations de références

identificateur de classe identificateur

Point p1;
Point p2, p3;
Cercle monCercle;

l Par défaut à la déclaration une référence vaut null


l elle ne « pointe » sur aucun objet

Point p1; Point p1 = null;

mémoire p1
référence null

© Philippe GENOUD UJF 13

Références
en Java

l Les références java : des pointeurs «Canada Dry»


l Comme un pointeur une référence contient l ’adresse d ’une
structure
l Mais à la différence des pointeurs la seule opération autorisée sur
les références est l’affectation d ’une référence de même type

Point p1;

Point p2;
p2 = p1;

p1++; Segmentation fault



Core dump
p2 += *p1 +3;

14

7
Création d’Objets

l La création d ’un objet à partir d’une classe est appelée instanciation.


L’objet créé est une instance de la classe.
l Instanciation se décompose en trois phases :

l 1 : obtention de l ’espace mémoire nécessaire à la partie


dynamique de l’objet et initialisation des attributs en mémoire (à
l’image d’une structure)

l 2 : appel de méthodes particulières, les constructeurs, définies


dans la classe. On en reparlera plus tard .

l 3 : renvoi d’une référence sur l’objet (son identité) maintenant créé


et initialisé.

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

l inexistant si un autre constructeur existe

mémoire
isa
Point p1; x 0
p1
p1 = new Point(); y 0

Point p2 = new Point();


p2 isa
Point p3 = p2; x 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

Point p2 = new Point(); p2 isa


Point p3 = p2; x 0

p3 y 0
p1 = p2;

Janvier 2003

Accès aux attributs d’un objet


(en Java)
l pour accéder aux attributs d'un objet on utilise une notation pointée :

[Link]

mémoire
isa
Point p1; x 10
0
p1
p1 = new Point(); y 0

Point p2 = new Point(); p2 isa


Point p3 = p2; x 14
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

l un message est composé de trois parties

l une référence permettant de désigner l'objet à qui le message est


envoyé
l le nom de la méthode à exécuter (cette méthode doit bien entendu
être définie dans la classe de l'objet)
l les éventuels paramètres de la méthode

l envoi de message similaire à un appel de fonction


l les instructions définies dans la méthode sont exécutées (elles
s’appliquent sur les attributs de l’objet récepteur du message)
l puis le contrôle est retourné au programme appelant

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

Point p1 = new Point();


Point p2 = new Point();
[Link](10.0,10.0); si la méthode ne possède
[Link](p1.x,3.0 * p1.y); pas de paramètres, la liste
est vide.
[Link]("distance de p1 à origine "
+ [Link]());

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.

Ajout d’une méthode à la classe Point


/**
* Test si le Point (qui reçoit le message) est plus proche de l’origine qu’un autre Point.
* @param p le Point avec lequel le Point recevant le message doit être comparé
* @return true si le point recevant le message est plus proche de l’origine que p, false
* sinon.
*/
boolean plusProcheOrigineQue(Point p) {
...
}

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

l Le passage de paramètres lors de l’envoi de message est un passage par


valeur.
l À 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
l Elle est initialisée avec la valeur de l’expression définie par le paramètre
effectif.

public static void main(String[] args) {


public class Point { int x;
double x; Point p1 = new Point();
double y; Point p2 = new Point();
p2.x = 15; p2.y = 11;
void translater(double dx,double dy) x = 20;
{ x 20
[Link](x,p2); p2.x 25.0
this.x += dx; [Link]("x " + x); p2.y 21.0
this.y += dy;
}
[Link]("p2.x " + p2.x); ------> ???
p1.x 30.0
[Link]("p2.y " + p2.y);
void foo(int x, Point p) { [Link]("p1.x " + p1.x); p1.y 0.0
[Link]("p1.y " + p1.y);
[Link](10,10); }
this.x = x + 10;
} x 30
20 10
}
p 10

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

l désigne l’objet courant (objet récepteur du message, auquel s’appliquent les


instructions du corps de la méthode où this est utilisé)
l peut être utilisé pour rendre explicite l'accès aux propres attributs et méthodes
définies dans la classe

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){

return [Link]() > [Link]() ;


}

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

Quand l’objet récepteur du message doit se passer en paramètre d’une


méthode ou sa référence retournée par la méthode

class VisageRond { class Dessin {


Dessin d;
int x, int y; ...
Dessin d; ...
VisageRond v1; boolean bordAtteint(){ void ajouter(VisageRond v){
if ( x > [Link]() ... ) ...
...
return false; [Link](this);
else ...
[Link](v1) ... }
} ...
... }
[Link] void setDessin(Dessin d) {
this.d = d;
}
[Link]
}

[Link]

26

13
Encapsulation

l accès direct aux variables d'un objet possible en JAVA

l mais ... n'est pas recommandé car contraire au principe d'encapsulation


l les données d'un objet doivent être privées (c'est à dire protégées et
accessibles (et surtout modifiables) qu'au travers de méthodes prévues
à cet effet).

l en JAVA, possible lors de leur définition d'agir sur la visibilité (accessibilité)


des membres (attributs et méthodes) d’une classe vis à vis des autres
classes

l plusieurs niveaux de visibilité peuvent être définis en précédant d'un


modificateur (private, public, protected) la déclaration de
chaque attribut, méthode ou constructeur

27

Encapsulation
Visibilité des membres d’une classe (en Java)

public private

La classe peut être utilisée


classe dans n’importe quelle classe

Attribut accessible directement Attribut accessible uniquement


attribut depuis code de n’importe quelle dans le code de la classe qui
classe le définit

méthode Méthode pouvant être invoquée Méthode utilisable uniquement


depuis code de n’importe quelle dans le code de la classe qui
classe la définit

l on reverra les autres niveaux de visibilité ( protected) en détail lorsque


les notions d'héritage et de packages auront été abordées

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 {

Point p=new Point(…);


public boolean plusProcheDeOrigineQue(Point p){
… [Link]() …

return [Link]() < [Link]();


}
...
}
30

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

public void translater(double dx,double dy){


x += dx;
y += dy;
}
méthodes
public double distance() {
double dist;
dist = [Link](x*x+y*y);
return dist;
}
}

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

[Link] Une autre clase


public class Point { ...
private double x; Point p1 = new Point();
private double y; p1.x = 10;
p1.y = 10;
Point p2 = new Point();
public void translater(double dx,double dy){ p2.x = p1.x;
x += dx; p2.y = p1.x + p1.y;
y += dy; ...
}

... Cela n'empêche pas de


s'en servir dans le code
de la classe où ils sont
public boolean egaleA(Point p) { définis

}
}

Rappels
référence
mémoire
isa
Point p1; x 0
p1
p1 = new Point(); y 0

Point p2 = new Point();


p2 isa
Point p3 = p2; x 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

l Constructeurs d’une classe :


l méthodes particulières pour la création d'objets de cette classe

l méthodes dont le nom est identique au nom de la classe

l rôle d'un constructeur


l effectuer certaines initialisations nécessaires pour le nouvel
objet créé

l toute classe JAVA possède au moins un constructeur


l si une classe ne définit pas explicitement de constructeur, un
constructeur par défaut sans arguments et qui n'effectue
aucune initialisation particulière est invoqué

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

public class Point {


private double x;
private double y;
public Point(double x, double y){ • une classe peut définir nombre quelconque
this.x = x; de constructeurs
Point p1 =new Point(10,10);
this.y = y;
•chaque constructeur possède le même nom
} (le nom de la classe)
public Point(){ • le compilateur distingue les constructeurs
this.x = this.y = 0; Point p2 =new Point();
en fonction :
} • du nombre
• du type
public Point(Point p){ • de la position des arguments
this.x = p.x; •Point p3 les
on dit que =new Point(p1);
constructeurs peuvent
this.y = p.y;
} être surchargés (overloaded)

}

Surchage des méthodes


l surcharge (overloading) pas limitée aux constructeurs, elle est possible
pour n'importe quelle méthode

l possible de définir des méthodes possédant le même nom mais dont les
arguments diffèrent

l lorsque qu'une méthode surchargée est invoquée


l le compilateur sélectionne automatiquement la méthode dont le
nombre et le type des arguments correspondent au nombre et au type
des paramètres passés dans l'appel de la méthode

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

l dans les classes définissant plusieurs constructeurs, un


constructeur peut invoquer un autre constructeur de cette classe
l l'appel this(...)

l fait référence au constructeur de la classe dont les arguments


correspondent
l ne peut être utilisé que comme première instruction dans le
corps d’un constructeur, il ne peut être invoqué après d'autres
instructions
l (on comprendra mieux cela lorsque l'on parlera de l'héritage
et de l'invocation automatique des constructeurs de la super-
classe)

10

5
Constructeurs
Appel d’un constructeur par un autre constructeur

public class Point {


private double x;
private double y;

// 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

l chaque objet (instance) possède sa propre copie des attributs (variables


d'instance) définies dans la classe

mémoire Partie statique double x,y ??


structure de la classe void translater(…)
double distance() nbPtsCrées 3

isa isa isa


Partie dynamique
structure des instances x 22 x 57 x 56

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

l en JAVA pas de possibilité de définir de variables globales


l toute variable doit être définie dans une classe

nbPtsCrées 3
mémoire Partie statique double x,y ??
structure de la classe void translater(…)
double distance() nbPtsCrées 3

isa isa isa


Partie dynamique
structure des instances x 22 x 57 x 56

y 14 y 6 y 14

l mais possibilité de définir des variables de classe


l variables dont il n'existe qu'un seul exemplaire associé à la classe où
elles sont définies
l cette "copie unique" de la variable existe indépendamment du nombre
d‘objets instances de la classe qui ont été créés
l peut être utilisée même si aucune instance de la classe n'a été créée

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]

// création d’un nombre quelconque d’objets Point


do {
new Point();
} while ( [Link]() < 0.5 );

// affichage du nombre d’objets créés


[Link]([Link]éés);

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

public class Pixel { Déclarations de


variables de
public static final int MAX_X = 1024;
classe
public static final int MAX_Y = 768;
// variables d'instance
private int x;
private int y; Le modifieur final est
... utilisé pour indiquer que la
// constructeurs valeur d'une variable (ici
de classe) ne peut jamais
// crée un Pixel de coordonnées x,y
être changée
public Pixel()
{
...
}
...
}

16

8
Méthodes de classe
Méthodes statiques

l variables de classe : définies et existent indépendamment des instances


l méthodes de classe : dont l’invocation peut être effectuée sans passer par
l’envoi d’un message à l’une des instances de la classe.

l définition d’une méthode de classe


l définie en précédant sa déclaration du modifieur static (on désigne aussi
ces méthodes sous le terme de méthodes statiques).

l invocation d’une méthode de classe


l directement par son nom dans le code de la classe où elle est définie,

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

// constructeurs Déclaration d ’une variable


public Point(double x, double y) de classe privée
{
this.x = x;
this.y = y;
nbPtsCréés++; Déclaration d’une méthode
} de classe pour accéder à la
valeur de la variable de
public Point(Point p) classe
{
this(p.x,p.y);
}
public static int getNbPtsCréées() { Attention : on ne peut pas
return nbPtsCréés; utiliser de variables

} d'instance dans une


méthode de classe
...
}

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]);
}
}

java TestArgs arg1 20 35.0 nombre d ’arguments : 3


argument 0 : arg1
argument 1 : 20
argument 2 : 35.0

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

Initialisation des variables


à la déclaration
l les variables d'instance et de classe peuvent avoir des "initialiseurs" associés à
leur déclaration
modifieurs type nomDeVariable = expression;
private double x = 10;
private double y = x + 2;
private double z = [Link]([Link] / 2);
private static int nbPoints = 0;

l variables de classe initialisées la première fois que la classe est chargée.


l variables d'instance initialisées lorsqu'un objet est créé.
l les initialisations ont lieu dans l’ordre des déclarations.

public class TestInit {


[Link] [4:1] illegal forward
private double y = x + 1; reference
private double x = 14.0; private double y = x + 1;
^
... 1 error
} Errors compiling TestInit.

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

private static double xs = 10 * [Link]();


private static double ys =; ???? l Déclaration d’un initialiseur statique
private static double zs = xs + ys; l static { bloc de code }
static {
int n = (int) xs; l méthode
ys = 0; l sans paramètres
for (int i = 0; i < n; i++)
l sans valeur de retour
ys = ys + [Link]();
} l sans nom

l Invocation
l automatique et une seule fois lorsque la classe est chargée

l dans l’ordre d’apparition dans le code de la classe

23

Destruction des objets


rappels

l libération de la mémoire alloué aux objets est automatique


l lorsqu'un objet n'est plus référencé le "ramasse miettes" ("garbage
collector") récupère l'espace mémoire qui lui était réservé.
l le "ramasse miettes" est un processus (thread) qui s'exécute en tâche
de fond avec un priorité faible
l s'exécute :

l lorsqu'il n'y a pas d'autre activité (attente d'une entrée clavier ou


d'un événement souris)
l lorsque l'interpréteur JAVA n'a plus de mémoire disponible
– seul moment où il s'exécute alors que d'autres activités avec une
priorité plus forte sont en cours (et ralentit donc réellement le
système)
l peut être moins efficace que gestion explicite de la mémoire , mais
programmation beaucoup plus simple et sure.

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 permet de fermer les fichiers ouverts, terminer les connexions réseau...


avant la destruction des objets
l la méthode de "finalisation" :

l méthode d'instance

l doit être appelée finalize()

ne possède pas de paramètres , n'a pas de type de retour (retourne void)


l

l est invoquée juste avant que le "ramasse miette" ne récupère l'espace


mémoire associé à l'objet
l JAVA ne donne aucune garantie sur quand et dans quel ordre la récupération
de la mémoire sera effectuée,
l impossible de faire des suppositions sur l'ordre dans lequel les méthodes
de finalisation seront invoquées.
25

Destruction des objets


finalisation exemple

class Point {
private double x;
private double y;

public Point(double x, double y) {


this.x = x;
this.y = y;
Point p1 = new Point(14,14);
} Point p2 = new Point(10,10);
[Link](p1);
public void translater(double dx, double dy) {
x += dx; [Link](p2);
y += dy; [Link](10,10);
}
p1 = null;
Appel explicite au
[Link]();
public String toString() { garbage collector
return "Point(x:" + x + ", y:" + y + ")"; [Link](p1);
}
[Link](p2);
public void finalize() {
[Link]("finalisation de " + this);
}
}

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

Vous aimerez peut-être aussi