1. Les bases de la programmation en Java
Christophe Vaudry
mél : thegeekintheshell@gmail.com
blog : thegeekintheshell.blogspot.com
site Web : cvaudry.developpez.com
2. Historique de ce document
– Cecours de Java a été conçu sur la base de transparents
que m'avait fourni à l'époque une collègue
■ Il a été utilisé à partir de 1999/2000 jusqu'en 2005/2006 et enrichi au
fur et à mesure depuis.
■ Il m'a servi de support de cours à l'Ecole des Mines d'Alès, à l'IUT de
Nîmes et à l'ISAIP.
■ Il ne tient pas compte des caractéristiques de Java au-delà de la
version 1.5.
2
4. Les origines de Java
Algol Simula
SmallTalk
Pascal C
C ++ Objective C
Modula Ada Pascal Object
Eiffel
Ada 95 Java C#
Adapté d'après Java – La Maîtrise de J. Bougeault
4
5. Historique de Java (1)
– Un projet :
■ ‘ The Green Project ’ en 1991 chez Sun
■ Préparation de la convergence de l’électronique grand public et de
l’informatique
– Des acteurs :
■ Patrick Naughton
■ Mike Sheridan
■ James Gosling
– Des besoins :
■ Initialement prévu d’utiliser le C++ ...
■ … mais problèmes avec le C++, d’où création d’un nouvel
environnement de programmation
5
6. Historique de Java (2)
1991 : Oak
■ James Gosling développe un nouveau langage, Oak (chêne)
■ Raison : pallier aux faiblesses constatées de C++
– 1992 : Une première cible
■ La télévision digitale …
■ … création du *7 (StarSeven) et de Duke …
■ … mais un secteur encore trop jeune.
6
7. Historique de Java (3)
– 1993 : Deux constats pour un nouveau débouché
■ Essor de l’Internet
■ La technologie développée avec Oak est adaptée à ce type de réseau
– 1994 : De Oak à Java
■ Ecriture d'un navigateur Web en Oak, WebRunner qui deviendra
bientôt HotJava
– 1995 : Premières versions de Java rendues publiques
7
8. Les différentes versions de Java (1)
– Trois versions de Java depuis 1995
■ Java 1.0 en 1995
■ Java 1.1 en 1996 – 1997
□ Apparition des Java Beans (composants)
■ Java 1.2 en 1999 (« Java 2 », version 1.2)
□ Apparition de Swing, J2SE, J2ME et J2EE
■ Java 1.3 (Java 2, version 1.3) en 2001 - 2002
■ Java 1.4 à partir de 2002, Java 1.4.2 en 2003-2004
■ ... Java 1.5 ...
■ Java 1.6 actuellement, Java 1.7 dans les cartons...
□ L’édition standard est disponible sur le site de Sun,
http://java.sun.com/ , le J2SE (Java 2 platform, Standard
Edition)
8
9. Les différentes versions de Java (2)
– Evolution très rapide et succès du langage
■ Un langage vivant
□ Qui ne cesse d’évoluer
□ Qui est soutenu par une communauté de développeurs.
□ Un succès certain dans le « monde universitaire », dans la
recherche et l'enseignement
– Une certaine maturité atteinte avec Java 2
– Des problèmes de compatibilité existent (ont existé!)
■ entre les versions 1.1 et 1.2/1.3/1.4/1.5
■ avec certains « vieux » navigateurs non équipés de JVM correct
■ depuis la version 1.2 il y a une bonne compatibilité « ascendante »
mais il peut exister encore quelques problèmes.
9
10. Que penser de Java? (1)
– Les plus :
■ Il a su bénéficier de l’essor d’Internet mais aussi s’imposer dans de
nombreux domaines
■ Un environnement gratuit (mais pas OpenSource!)
■ De nombreux outils disponibles dus notamment à une large
communauté très active qui en fait un langage vivant.
■ Des API (Application Programming Interface) nombreuses et variées
en standard, des API spécifiques disponibles gratuitement en option
(3D, Multimédia, etc.)
■ Un langage généraliste qui a démontré sa souplesse et son élégance
□ Utilisation dans l’industrie et dans le secteur académique
□ Très utilisé comme langage d’apprentissage
■ La multitude des plateformes matérielles le supportant (portabilité)
10
11. Que penser de Java? (2)
– Les moins :
■ Trop ‘médiatisé’?
■ Problèmes de compatibilité
□ Avec les premières versions
□ Avec certains navigateurs (les navigateurs ne sont pas écrits par
Sun)
■ Problèmes de vitesse
□ Existence de solutions pour y pallier (compilateur natif,
compilation du bytecode à la volée)
□ Grande amélioration de la vitesse avec la plateforme actuelle.
▪ Reste un point faible même si de moins en moins rédhibitoire.
■ Un langage pérenne : une concurrence redoutable (C# et la plateforme
.NET)
11
12. Que penser de Java? (3)
– Un bon langage
■ Un langage adapté aux besoins de développements actuels …
■ … qui a su se baser sur les acquis du passé.
– Audelà de l’effet de mode, un succès mérité qui ne
devrait pas se démentir dans le futur
■ Support de Sun
■ Importante communauté de développeurs
■ La portabilité du langage, les plateformes logicielles et matérielles
supportées
■ Le nombre et la qualité des projets utilisant Java
■ Le développement des technologies autour de Java
■ Accord Sun-Microsoft : « convergence » de leur palteforme ?
12
14. Caractéristiques du langage Java (1)
– Simple
■ Apprentissage facile
□ faible nombre de mots-clés
□ simplifications aux fonctionnalités essentielles
■ Développeurs opérationnels rapidement
□ Proche syntaxe C/C++ ...
□ ...sans les dangers du C/C++
▪ Plus d'arithmétiques sur les pointeurs, pas d'héritage multiple
contrairement au C++, pas de surcharge des types primitifs et
des opérateurs.
14
15. Caractéristiques du langage Java (2)
– Orienté objet
■ Java ne permet d'utiliser que des objets (hors les types de base)
■ Java est un langage objet de la famille des langages de classe comme
C++ ou SmallTalk
■ Les grandes idées reprises sont : encapsulation, dualité classe
/instance, attribut, méthode / message, visibilité, dualité
interface/implémentation, héritage simple, redéfinition de méthodes,
polymorphisme
– Familier
■ Syntaxe proche de celle de C/C++
15
16. Caractéristiques du langage Java (3)
– Sûr
■ Indispensable sur les réseaux (protection contre les virus,
modification des fichiers, lecture de données confidentielles, etc.)
Pour plus d’informations sur le thème de la sécurité sur les réseaux
voir http://www.cs.princeton.edu/sip/
▪ Une preuve : il n’existe pour l’instant aucun virus fait en Java
(une grande peur lors des débuts de ce langage) alors que c'est
assez courant dans des technologies concurrentes
□ Notion de « bac à sable », police de sécurité, API destinés au
cryptage, à la gestion de l'authentification, des certificats, ...
16
17. Caractéristiques du langage Java (4)
– Fiable
■ Gestion automatique de la mémoire (ramasse-miette ou quot;garbage
collectorquot;)
■ Gestion des exceptions
■ Sources d'erreurs limitées
□ typage fort,
□ pas d'héritage multiple,
□ pas de manipulations de pointeurs, etc.
■ Vérifications faites par le compilateur facilitant une plus grande
rigueur du code
17
18. Java, un langage de programmation
– Applications Java
■ programmes autonomes, quot;stand-alonequot;
– Applets (mini-programmes ou appliquettes)
■ Programmes exécutables uniquement par l'intermédiaire d'une autre
application
□ navigateur web : Netscape, Internet explorer, etc.
□ application spécifique : Appletviewer (livré avec le kit de
développement)
■ Java a longtemps été considéré comme étant uniquement un langage
pour écrire des applets
□ Cependant c'est avant tout un langage de programmation
généraliste
18
19. Java, un langage indépendant? (1)
– Java est un langage interprété
■ La compilation d'un programme Java crée du pseudo-code portable
□ le quot;byte-codequot;
■ Sur n'importe quelle plate-forme, une machine virtuelle Java peut
interpréter le pseudo-code afin qu'il soit exécuté
– Les machines virtuelles Java peuvent être :
■ des interpréteurs de byte-code indépendants (pour exécuter les
programmes Java)
■ contenues au sein d'un navigateur (pour exécuter des applets Java)
19
20. Java, un langage indépendant? (2)
– Avantages :
■ Portabilité
□ Des machines virtuelles Java existent pour de nombreuses plates-
formes dont : Solaris, Windows, MacOS
■ Développement plus rapide
□ courte étape de compilation pour obtenir le byte-code,
□ pas d'édition de liens,
□ débogagge plus aisé,
■ Le byte-code est plus compact que les exécutables classiques
□ pour voyager sur les réseaux.
20
21. Java, un langage indépendant? (3)
– Inconvénients :
■ L'interprétation du code ralentit l'exécution
□ Il y a quelques années c’était de l'ordre de quelques dizaines de
fois plus lent que C++
□ Maintenant cela dépend du type d’application
□ Ce qu’il faut surtout voir c’est le rapport gain sur le temps de
développement / vitesse du logiciel par rapport aux besoins de
l’utilisateur.
■ Les applications ne bénéficient que du dénominateur commun des
différentes plate-formes
□ limitation, par exemple, des interfaces graphiques : AWT
□ Dans le cas des interfaces graphiques, avec Swing ou des
équivalents ce n’est plus vrai.
21
22. Langage compilé
Etapes qui ont lieu avant l'exécution pour un langage compilé
comme C++
Fichier
de Librairies
code
Programme
Compilation Code objet Edition de liens
exécutable
Autres code objet
Fichier
d'entête
22
23. Langage interprété (1)
Cas de Java
Avant exécution Exécution
Autres byte code
Fichier
de code Byte code Machine virtuelle
Compilation Java (JVM)
Java
javac MaClasse.class java
MaClasse.java
23
24. Langage interprété (2)
Librairies des
Fichier source Java Class Loader
Classes Java
Interpréteur Compilateur JIT
Compilateur Java Java (Just In Time)
Système d'Exécution
Fichier « Classe » Java
Système d'Exploitation
D'après Java – La Maîtrise de J. Bougeault
24
25. Java et Compilation
– Il existe déjà au moins un vrai compilateur Java
■ Java devient bien plus rapide ...
■ ... mais perd quelques qualités (portabilité, etc.)
– Autre technologie (celle préconisée par Sun):
■ La compilation à la volée : quot;Just In Time (JIT) compilersquot;
■ Le code est compilé au fur et à mesure de sa première exécution et
stocké dans un cache pour être ensuite réutilisé tel quel.
25
26. L’API de Java (1)
– Javafournit de nombreuses librairies de classes
remplissant des fonctionnalités très diverses : c'est l'API
Java
■ API (Application Program(ming) Interface /Interface pour la
programmation d'applications) : Ensemble de bibliothèques
permettant une programmation plus aisée car les fonctions deviennent
indépendantes du matériel.
■ Ces classes sont regroupées, par catégories, en paquetages (ou
quot;packagesquot;).
26
27. L’API de Java (2)
– Les principaux paquetages
■ java.applet : les applets sur le web
■ java.awt : interfaces graphiques, images et dessins
■ java.beans : relatif aux JavaBeans
■ java.io : entrées / sorties
■ java.lang : chaînes de caractères, interaction avec l'OS, threads
■ java.net : sockets, URL
■ java.util : structures de données classiques
■ javax.swing : package récent proposant des composants « légers »
pour la création d’interfaces graphiques
■ java.rmi : Remote Method Invocation
■ java.sql : fournit le package JDBC
27
28. L’API de Java (3)
– La documentation de Java est standard, que ce soit pour
les classes de l'API ou pour les classes utilisateur
■ possibilité de génération automatique avec l’outil Javadoc.
– Elle est au format HTML.
■ intérêt de l'hypertexte pour naviguer dans la documentation
28
29. L’API de Java (4)
– Pour chaque classe, il y a une page HTML contenant :
■ la hiérarchie d'héritage de la classe,
■ une description de la classe et son but général,
■ la liste des attributs de la classe (locaux et hérités),
■ la liste des constructeurs de la classe (locaux et hérités),
■ la liste des méthodes de la classe (locaux et hérités),
■ puis, chacune de ces trois dernières listes, avec la description
détaillée de chaque élément.
29
30. L’API de Java (5)
– Où trouver les informations sur les classes de l’API
■ sous le répertoire j2sdkx.x.x/docs/api dans le SDK
□ les documentations de l’API se téléchargent et s’installent en
général dans le répertoire dans lequel on installe java.
▪ Ces docs sont à placer à votre convenance, mais il est toujours
utile de les avoir sous la main !
■ Sur le site de Sun, on peut la retrouver à
http://java.sun.com/docs/index.html
30
32. Le multithreading (1)
– Un processus ?
■ Un processus est l’entité dynamique qui représente l’exécution d’un
programme sur un processeur
– Un thread (processus léger)
■ C'est une entité d'exécution qui peut se dérouler en parallèle à d'autres
threads, c'est-à-dire concurremment, au sein d'une même application.
□ On découpe le programme principal en un ensemble de sous-
programmes qui s’exécutent indépendamment les uns des autres.
– Javapermet de lancer plusieurs threads en même temps,
sans bloquer les autres.
32
33. Le multithreading (2)
– Exemple de threads
■ le ramasse-miettes (GC) est un thread quot;systèmequot;
■ la gestion de l'interface graphique qui peut être parallélisée avec
l'accès à l'imprimante et l'envoi de données sur le réseau.
– La programmation des threads est considérée comme
complexe en général…
– … mais relativement aisée en Java ; c’est un des
avantages de ce langage.
■ Néanmoins, même si Java propose un bon support des Threads, leur
programmation restent complexes quoiqu’il arrive et demandent une
bonne maîtrise des algorithmes de synchronisation des processus.
33
34. Outil de développement : le SDK de Sun
– Environnement de développement fourni par Sun
■ Il se nommait le JDK (Java Development Kit : Kit de développement
Java).
■ On parle aussi ou on a parlé du SDK, de J2SDK (System
Development Kit : Kit de développement) ou de J2SE (Java 2
Standard Edition)
– Il contient :
■ les classes de base de l'API java (plusieurs centaines),
■ la documentation au format HTML
■ le compilateur : javac
■ la JVM (machine virtuelle) : java
■ le visualiseur d'applets : appletviewer
■ le générateur de documentation : javadoc
■ etc.
34
35. Java, un langage novateur?
– Java n'est pas un langage novateur :
■ il a puisé ses concepts dans d'autres langages existants (Smalltalk par
exemple) et sa syntaxe s’inspire de celle du C/C++.
– Cette philosophie permet à Java
■ De ne pas dérouter ses utilisateurs en faisant quot;presque comme ... mais
pas tout à faitquot;
■ D'utiliser des idées, concepts et techniques qui ont fait leurs preuves
et que les programmeurs savent utiliser
– Java a su faire une synthèse efficace de bonnes idées
issues de sources d'inspiration variées
■ Smalltalk, C++, Ada, Lisp, etc.
■ Ce n'est pas pour rien que C# s'inspire d'un certain nombre de
techniques mises en oeuvre en Java
35
36. Java et les objets
– Java est un langage purement « objet »
■ Contrairement à des langages comme C, C++, PERL, PHP, par
exemple qui ne sont pas purement objet
■ Et comme Smalltalk , Ruby, etc.
■ Java est ce qu’on nomme un langage de classe, un type particulier de
langage dit à objet
□ Les langages de classes sont certainement, à l’heure actuelle, le
type de « langage objet » le plus répandu.
▪ Héritage de Simula et Smalltalk
□ Il existe également des langages dit objet basées sur la notion de
prototype (JavaScript, Self), ou des langages dit de Frame
(repéresentation des connaissances) et des langages « hybrides ».
36
38. Les commentaires
– /* commentaire sur une ou plusieurs lignes */
■ Identiques à ceux existant dans le langage C
– // commentaire de fin de ligne
■ Identiques à ceux existant en C++
– /** commentaire d'explication */
■ Les commentaires d'explication se placent généralement juste
avant une déclaration (d'attribut ou de méthode)
■ Ils sont récupérés par l'utilitaire javadoc et inclus dans la
documentation ainsi générée.
38
39. Exemple (1)
La classe est l’unité de
Fichier Bonjour.java base de nos programmes.
Le mot clé en Java pour
définir une classe est
public class Bonjour class
{ //Accolade débutant la classe MaClasse
public static void main(String args[])
{ //Accolade débutant la méthode main
/* Pour l’instant juste une instruction */
System.out.println(“bonjour”);
} //Accolade fermant la méthode main
} //Accolade fermant la classe MaClasse
39
40. Instructions, blocs et blancs
– Les instructions Java se terminent par un ;
– Les blocs sont délimités par :
{ pour le début de bloc
} pour la fin du bloc
Un bloc permet de définir un regroupement d’instructions. La
définition d’une classe ou d’une méthode se fait dans un bloc.
– Lesespaces, tabulations, sauts de ligne sont autorisés.
Cela permet de présenter un code plus lisible.
40
41. Exemple (2)
Fichier Bonjour.java Accolades délimitant le
début et la fin de la définition
de la class Bonjour
public class Bonjour
{
public static void main(String args[])
{
Accolades délimitant le début
System.out.println(“bonjour”); et la fin de la méthode main
}
} Les instructions se terminent
par des ;
41
42. Exemple (3)
Fichier Bonjour.java Une méthode peut recevoir
des paramètres. Ici la méthode
public class Bonjour main reçoit le paramètre args
qui est un tableau de chaîne
de caractères.
{
public static void main(String args[])
{
System.out.println(“bonjour”);
}
}
42
43. Compilation et exécution (1)
Le nom du fichier est nécessairement
Fichier Bonjour.java celui de la classe avec l’extension
.java en plus. Java est sensible à la
casse des lettres.
Compilation en bytecode java
dans une console DOS:
javac Bonjour.java
Génère un fichier Bonjour.class public class Bonjour
Exécution du programme
(toujours depuis la console {
DOS ou un terminal sous Unix)
sur la JVM : public static void main(String[] args)
java Bonjour
Affichage de « bonjour » dans {
la console
System.out.println(“bonjour”);
}
}
43
46. Compilation et exécution (4)
– On utilise généralement un IDE
■ IDE = Integrated Development Environment, c’est-à-dire un
Environnement de Développement Intégré (EDI)
■ Un IDE facilite la tâche du développeur, particulièrement quand il y
a beaucoup de classes à créer pour une même application
□ On a vu que grosso modo on avait une classe par fichier.
□ Pour chaque type d’objet on va quasiment avoir une classe
□ Dans un projet un peu gros, il y a plusieurs types d’objets, donc
plusieurs fichiers contenant des classes
□ L’IDE permet d’assurer la compilation et le lien entre les
différents fichiers à la place du développeur
46
48. Compilation et exécution (3)
– Les IDE recommandés
■ JCreator (cf copie d’écran précédente) : www.jcreator.com
■ Eclipse : www.eclipse.org
■ BlueJ : http://www.bluej.org/
■ NetBeans : http://www.netbeans.org/
– Les IDE ne sont pas une obligation …
■ Pour développer en Java, un éditeur de texte tout simple et le kit de
développement de la plateforme standard suffisent.
– …néanmoins pour des développements sérieux et
conséquent ils sont indispensables
■ L’IDE permet de simplifier et d’automatiser certaines tâches
■ Les IDE évolués (Eclipse, NetBeans) permettent l’intégration d’outils
complémentaires (Ant, CVS, BeanShell, ArgoUML, etc.)
48
49. Compilation et exécution (4)
– Les IDE ne sont pas une obligation …
■ Pour développer en Java, un éditeur de texte tout simple et le kit de
développement de la plateforme standard suffisent.
– …néanmoins pour des développements sérieux et
conséquent ils sont indispensables
■ L’IDE permet de simplifier et d’automatiser certaines tâches
■ Les IDE évolués (Eclipse, NetBeans) permettent l’intégration d’outils
complémentaires (Ant, CVS, BeanShell, ArgoUML, etc.)
49
50. Compilation et exécution (5)
– Pourrésumer, dans un terminal, si j’ai un fichier
Bonjour.java pour la classe Bonjour :
■ javac Bonjour.java
□ Compilation en bytecode java
□ Indication des erreurs de syntaxe éventuelles
□ Génération d’un fichier Bonjour.class si pas d’erreurs
■ java MaClasse
□ Java est la machine virtuelle
□ Exécution du bytecode
□ Nécessité d’avoir une (et une seule) méthode main, qui est le
point d’entrée dans le programme
50
51. Le cas d’une applet
– Une applet n’est pas un programme indépendant
■ Elle est incorporée dans une page HTML et exécutée dans un
navigateur
■ HTML dispose d'un quot;tagquot; <applet> </applet> destiné à intégrer des
applets dans une page web. Entre ces tags j’indique le nom d’une
classe java compilé en bytecode (un fichier « .class »).
■ Exemple : maPage.html
■ Ma classe MonApplet.java n’a pas besoin de contenir une méthode
main…nous reviendrons sur les applets plus tard.
<html><head><title>MonApplet</title></head>
<body>
<applet code=MonApplet.class width=100 height=100> </applet>
</body> </html>
51
52. Compilation et exécution : l’applet
– Dans un terminal :
■ javac MonApplet.java
□ Compilation en bytecode java
□ Indication des erreurs de syntaxe éventuelles
□ Génération d’un fichier MonApplet.class si pas d’erreurs
■ appletviewer maPage.html (depuis le terminal) par exemple ou
ouverture de la page HTML maPage.html depuis Nestcape Navigator
ou Internet Explorer.
□ Il faut que le chemin indiqué dans la paramètre code de la balise
applet et permettant d’accéder au fichier « .class » soit valide
▪ Analogue à l’utilisation de liens ou de fichier de style : le fichier
HTML « pointe » sur le fichier « .class »
52
53. Identificateurs (1)
– On a besoin de nommer les classes, les variables, les
constantes, etc. ; on parle d’identificateur.
– Les identificateurs commencent par une lettre, _ ou $
■ Attention : Java distingue les majuscules des minuscules
– Conventions sur les identificateurs :
■ Si plusieurs mots sont accolés, mettre une majuscule à chacun des
mots sauf le premier.
□ exemple : uneVariableEntiere
■ La première lettre est majuscule pour les classes et les interfaces
□ exemples : MaClasse, UneJolieFenetre
53
54. Identificateurs (2)
– Conventions sur les identificateurs :
■ La première lettre est minuscule pour les méthodes, les attributs et
les variables
□ exemples : setLongueur, i, uneFenetre
■ Les constantes sont entièrement en majuscules
□ exemple : LONGUEUR_MAX
54
55. Les mots réservés de Java
abstract default if private throw
assert do implements protected throws
boolean double import public transient
break else instanceof return true
byte extends int short try
case false interface static void
catch final long strictfp volatile
char finally native super while
class float new switch throw
continue for null synchronized
const goto package this
55
57. Les types de bases (1)
– En Java, tout est objet sauf les types de base.
– Il y a huit types de base :
– 1 type booléen
□ pour représenter les variables ne pouvant prendre que 2 valeurs
(vrai et faux, 0 ou 1, etc.) :
□ le type boolean avec les valeurs associées true et false
– 1 type pour représenter les caractères
□ char
– 4 types pour représenter les entiers de divers taille
□ byte, short, int et long
– 2 types pour représenter les réelles
□ float et double
57
58. Les types de bases (2)
– Lataille nécessaire au stockage de ces types est
indépendante de la machine.
■ Dans des langages comme C/C++, la taille nécessaire au stockage
d’un type (le codage de ce type) dépend de la machine.
– L’indépendance du codage des types de base entraîne
■ des avantages
□ portabilité
■ des inconvénients
□ quot;conversionsquot; coûteuses d’un type à l’autre. C’est le système
logiciel (JVM) qui gère complètement le codage des types.
58
59. Les entiers (1)
– Les entiers (avec signe )
■ byte : codé sur 8 bits, peuvent représenter des entiers allant de -27 à 27
–1 (-128 à +127)
■ short : codé sur 16 bits, peuvent représenter des entiers allant de
-215 à 215 –1
■ int : codé sur 32 bits, peuvent représenter des entiers allant de -231 à
231 –1
■ long : codé sur 64 bits, peuvent représenter des entiers allant de -263 à
263 –1
59
60. Les entiers (2)
– Notation
■ 2 : entier normal en base décimal
■ 2L :entier au format long en base décimal
■ 010 : entier en valeur octale (base 8)
■ 0xF : entier en valeur hexadécimale (base 16)
– Opérations sur les entiers
■ opérateurs arithmétiques +, -, *
■ / :division entière si les 2 arguments sont des entiers
■ % : reste de la division entière
□ exemples :
▪ 15 / 4 donne 3
▪ 15 % 2 donne 1
60
61. Les entiers (3)
ExempleCM2.java
class ExempleCM2
{
public static void main(String args[])
{
System.out.println(quot;Starting ExempleCM2...quot;);
int i,j,k;
long l;
i = 2;
l = 2L;
j = 010;
k = 0xF;
System.out.println(quot;i = quot; + i + quot; et l = quot; +l);
System.out.println(quot;j = quot; + j);
System.out.println(quot;k = quot; + k);
}
}
61
62. Les entiers (4)
– Opérations sur les entiers (suite)
■ les opérateurs d’incrémentation et de décrémentation ++ et --
□ ajoute ou retranche 1 à une variable
int n = 12;
n ++; //Maintenant n vaut 13
□ n++; « équivalent à » n = n+1; / n--; « équivalent à » n = n-1;
□ 8++; est une instruction illégale
□ peut s’utiliser de manière suffixée : ++n. La différence avec la
version préfixée se voit quand on les utilisent dans les
expressions. En version suffixée la (dé/inc)rémentation
s’effectue en premier
int m=7; int n=7;
int a=2 * ++m; //a vaut 16, m vaut 8
int b=2 * n++; //b vaut 14, n vaut 8
62
63. Les réels (1)
– Les réels
■ float : codé sur 32 bits, peuvent représenter des nombres allant de
-1035 à + 1035
■ double : codé sur 64 bits, peuvent représenter des nombres allant de
-10400 à +10400
– Notation
■ 4.55 ou 4.55D réel double précision
■ 4.55f réel simple précision
63
64. les réels (2)
– Les opérateurs
■ opérateurs classiques +, -, *, /
■ attention pour la division :
▪ 15 / 4 donne 3
▪ 15 % 2 donne 1
▪ 11.0 / 4 donne 2.75 (si l’un des termes de la division est un réel,
la division retournera un réel).
■ puissance utilisation de la méthode pow de la classe Math.
▪ double y = Math.pow(x, a) équivalent à x^a, x et a étant de type
double
64
65. les réels (3)
ExempleOpEntier.java
class ExempleOpEntier
{
public static void main(String args[])
{
System.out.println(quot;Starting ExempleOpEntier...quot;);
int i,j;
float unReel;
i = 10 ; j = 2; unReel = 2.0f;
System.out.println(quot;i / j = quot; + i/j);
System.out.println(quot;i / unReel = quot; + i/unReel);
}
}
65
66. Les booléens (1)
– Les booléens
■ boolean :
■ Un booléen peut contenir 2 valeurs
□ soit vrai : true (mot réservé)
□ soit faux : false (mot réservé)
– Les opérateurs logiques de comparaisons
■ Egalité : opérateur ==
■ Différence : opérateur !=
■ supérieur et inférieur strictement à : opérateurs > et <
■ supérieur et inférieur ou égal : opérateurs >= et <=
■ L’évaluation d’une expression avec un opérateur de comparaison
renvoie un booléen
66
67. les booléens (2)
– Notation
boolean x;
x= true;
x= false;
x= (5==5); // l ’expression (5==5) est évaluée et la valeur est affectée à x
qui vaut alors vrai
x= (5!=4); // x vaut vrai, ici on obtient vrai si 5 est différent de 4
x= (5>5); // x vaut faux, 5 n'est pas supérieur strictement à 5
x= (5<=5); // x vaut vrai, 5 est bien inférieur ou égal à 5
67
68. les booléens (3)
– L’opérateur de comparaison ternaire
■ Un opérateur parfois intéressant qui vient du C manipuler
■ « ? : »
int res,i,j;
….
res = (i==0)? 0 : j/i; /* res contient 0 si i==0 et sinon il contient j/i
*/
int max = (x > y) ? x : y;
String name = (name != null) ? name : quot;unkownquot;
68
69. Les booléens (4)
– Les opérateurs logiques
■ et logique : &&
■ ou logique : ||
■ non logique : !
■ Exemples : si a et b sont 2 variables booléennes
boolean a,b, c;
a= true;
b= false;
c= (a && b); // c vaut false
c= (a || b); // c vaut true
c= !(a && b); // c vaut true
c=!a; // c vaut false
69
70. Les booléens (5)
ExempleBooleen.java
public class ExempleBooleen
{
public static void main (String args[])
{
System.out.println(quot;Starting ExempleBooleen...quot;);
boolean test1, test2, test3; int res; int i,j,k; i=0; j=2; k=3;
test1 = (i == j); //false
test2 = (i != k); //true
test3 = (j <= k); //true
res = (i==0)? 0 : j/i;
if (test3)
{
System.out.println(quot;Nous sommes dans le ifquot;);
System.out.println(quot;test3 = quot; + test3);
}
System.out.println(quot;test1 = quot; + test1);
System.out.println(quot;test2 = quot; + test2);
System.out.println(quot;res = quot; + res);
}}
70
71. Les caractères (1)
– Les caractères
■ char : contient une seule lettre
■ le type char désigne des caractères en représentation Unicode
□ Codage sur 2 octets contrairement à ASCII/ANSI codé sur 1
octet. Le codage ASCII/ANSI est un sous-ensemble d’Unicode
□ Notation hexadécimale des caractères Unicode de ‘ u0000 ’ à ‘
uFFFF ’.
□ Plus d’information sur Unicode à : www.unicode.org
71
72. Les caractères (2)
– Notation
char a,b,c; // a,b et c sont des variables du type char
a='a'; // a contient la lettre 'a'
b= 'u0022' //b contient le caractère guillemet : quot;
c=97; // x contient le caractère de rang 97 : 'a'
72
73. Les caractères (3)
ExempleChar.java
public class ExempleChar
{
public static void main (String args[])
{
System.out.println(quot;Starting ExempleChar...quot;);
char a,b,c;
a='a';
b='u0022';
c=97;
System.out.println(quot;a = quot; + a);
System.out.println(quot;b = quot; + b);
System.out.println(quot;c = quot; + c);
}
}
73
74. Initialisation des variables (1)
– Java exige que toutes les variables soient définies et
initialisées.
■ Le compilateur sait déterminer si une variable est susceptible d'être
utilisée avant initialisation et produit une erreur de compilation.
■ Donc, le compilateur force l’initialisation de toutes variables avant
son utilisation
□ C’est une sécurité mais oblige à faire attention à ce point pour
éviter une erreur de compilation
■ Erreur de compilation du type
□ Z:TravailJavaexosExempleInit.java:8: variable a might not
have been initialized
74
75. Initialisation des variables (2)
ExempleChar.java
public class ExempleInit
{
public static void main (String args[])
{
System.out.println(quot;Starting ExempleInit...quot;);
int a,b,c;
b = 10;
c = b + a;
}
}
Z:TravailIUTEnseignements2003-2004SRC2AJavaexosExempleInit.java:8:
variable a might not have been initialized
75
76. Opérateurs : mémo
Ce sont, à peu d'exceptions près, les mêmes que ceux de C ou C++.
Le tableau suivant en donne les règles d'associativité de gauche à droite ou de
droite à gauche.
Les plus
Droite à Gauche .[]() prioritaires
DàG ++ - - + - ~ ! (cast_operator)
GàD */%
GàD +-
GàD << >> >>>
GàD < > <= >= instanceof
GàD = = !=
GàD &
GàD ^
GàD &&
GàD ³
DàG ?:
DàG = *= /= %= += -= <<= >>= >>>= &= ^= = Les moins
prioritaires
76
78. Méthodes et paramètres (1)
– La notion de méthodes dans les langages objets
■ Proches de la notion de procédure ou de fonction dans les langages
procéduraux.
□ La méthode c’est avant tout le regroupement d’un ensemble
d’instructions suffisamment générique pour pouvoir être
réutilisées
□ Comme pour les procédures ou les fonctions (au sens
mathématiques) on peut passer des paramètres aux méthodes et
ces dernières peuvent renvoyer des valeurs (grâce au mot clé
return).
78
79. Méthodes et paramètres (2)
– Méthodes de classe et méthode d’instances
■ En java on a 2 grands types de méthodes les méthodes de classe
(défini avec le mot clé static comme pour la méthode main) et les
méthodes d’instance :
□ Une méthode est un message que l’on envoie
▪ à une classe : méthode de classe ou
▪ à un objet : méthode d’instance (ou méthode)
□ La méthode main est toujours une méthode de classe
▪ Pour utiliser une méthode d’instance, il faut d’abord créer un
objet qui peut « recevoir » cette méthode
▪ La méthode main est le point d’entrée dans le programme et est
la première méthode lancée, avant la création du premier objet. Il
est donc nécessaire que cela soit une méthode de classe.
79
80. Méthodes et paramètres (3)
– Opérateurs d’accès à un membre d’un objet ou d’une
classe
■ En java nous avons l’opérateur « . » qui permet d’accéder à un
attribut ou une méthode d’un objet ou d’une classe
■ On précise le nom de l’objet ou de la classe, suivi du point, suivi du
nom de l’attribut ou du nom de la méthode.
readint est une méthode de la classe (méthode static) BasicIO. Pour l’utiliser
on écrit : Basic.readint(quot;Entrer un entier:quot;);
La méthode indexOf est une méthode d’instance de String
Si on a un objet String nommé « s » et initialisé avec une valeur, on pourra appeler la
méthode indexOf de la manière suivante :
s = new String(quot;Bonjourquot;);
int index_j = s.indexOf(quot;jquot; );
Attention : BasicIO ne fait pas partie des classes fournies en standard en Java ; c'est une classe
utilisée dans le cadre de ce cours pour faciliter la saisie des données.
80
81. Méthodes et paramètres (4)
exemple : public, type de la valeur couples d'un type et d'un
static renvoyée ou void identificateur séparés par des « , »
<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}
public double add (double number1, double number2)
{ Notre méthode
retourne ici une
return (number1 +number2); valeur
}
Définition d’une méthode en Java
81
82. Méthodes et paramètres (5)
AdditionEntier.java readint() est une méthode de
classe. Elle est défini comme
public class AdditionEntier static dans la classe BasicIO.
{ C’est un message que l’on
public static void main(String args[]) envoie à la classe BasicIO
{
int nb1, nb2, result;
nb1 = BasicIO.readint(quot;Entrer un entier:quot;);
nb2 = BasicIO.readint(quot;Entrer un entier:quot;);
result = nb1 + nb2; méthode println()
System.out.println(quot;Somme = quot; + result); est une méthode d’instance
} c’est un message que l’on
} envoie à l’objet System.out
qui est un objet particulier
représentant la sortie standard
82
83. Portée des variables (1)
– Lesvariables sont connues et ne sont connues qu’à l’intérieur
du bloc dans lequel elles sont déclarées
public class Bidule
{
int i, j, k;
public void truc(int z)
{
int j,r; Ce sont 2 variables différentes
r = z;
}
public void machin() k est connu au niveau de la méthode
{ machin() car déclaré dans le bloc de la
k = r; classe. Par contre r n’est pas défini pour
} machin(). On obtient une erreur à la
} compilation
83
84. Portée des variables (2)
– Encas de conflit de nom entre des variables locales et des
variables globales,
■ c’est toujours la variable la plus locale qui est considérée comme
étant la variable désignée par cette partie du programme
□ Attention par conséquent à ce type de conflit quand on manipule
des variables globales.
public class Bidule
{
int i, k, j;
public void truc(int z)
{
int j,r;
C’est le j défini en local j = z;
qui est utilisé dans }
la méthode truc() }
84
85. La classe Math (1)
– Les fonctions mathématiques les plus connues sont
regroupées dans la classe Math qui appartient au package
java.lang
■ les fonctions trigonométriques
■ les fonctions d’arrondi, de valeur absolue, ...
■ la racine carrée, la puissance, l’exponentiel, le logarithme, etc.
– Ce sont des méthodes de classe (static)
double calcul = Math.sqrt (Math.pow(5,2) + Math.pow(7,2));
double sqrt(double x) : racine carrée de x
double pow(double x, double y) : x puissance y
85
86. La classe Math (2)
public class ExerciceAlgo2
{
public static void main (String args[])
{
System.out.println(quot;ExerciceAlgo2...quot;);
double val = BasicIO.readdouble(quot;Entrer un nombrequot;);
double val_abs;
val_abs = Math.abs(val);
System.out.println(quot;La valeur absolue de votre nombre est : quot;+ val_abs);
}
}
86
88. Présentation générale
– Les structures de contrôle classiques existent en Java :
■ if, else
■ switch, case, default, break
■ for
■ while
■ do, while
–A utiliser avec parcimonie
■ <étiquette> : suivie d'une boucle for, while ou do
■ break <étiquette> ou break;
■ continue <étiquette> ou continue;
88
89. if / else (1)
– Instructions conditionnelles
■ On veut effectuer une ou plusieurs instructions seulement si une
certaine condition est vraie
if (condition) instruction;
et plus généralement : if (condition) { bloc d’instructions}
condition doit être un booléen ou renvoyer une valeur booléenne
■ On veut effectuer une ou plusieurs instructions si une certaine
condition est vérifiée sinon effectuer d’autres instructions
if (condition) instruction1; else instruction2;
et plus généralement if (condition) { 1er bloc d’instructions} else
{2ème bloc d’instruction}
■ La structure if() {…} else if() {…} else if (){…} else {}est possible
en Java
89
90. if / else (2)
fausse
(sinon)
condition Série 2 d’actions
vraie (alors)
Série 1 d’actions
90
91. if / else (3)
Max.java
public class Max
{
public static void main(String args[])
{
int nb1, nb2;
nb1 = BasicIO.readint(quot;Entrer un entier:quot;);
nb2 = BasicIO.readint(quot;Entrer un entier:quot;);
if (nb1 > nb2)
System.out.println(quot;l’entier le plus grand est quot;, nb1);
else
System.out.println(quot;l’entier le plus grand est quot;, nb2);
}
}
91
92. while (1)
– Boucles indéterminées
■ On veut répéter une ou plusieurs instructions un nombre indéterminés
de fois : on répète l’instruction ou le bloc d’instruction tant que une
certaine condition reste vraie
■ nous avons en Java une première boucle while (tant que)
□ while (condition) {bloc d’instructions}
□ les instructions dans le bloc sont répétées tant que la condition
reste vraie.
□ On ne rentre jamais dans la boucle si la condition est fausse dès
le départ
92
93. while (2)
– Boucles indéterminées
■ un autre type de boucle avec le while:
□ do {bloc d’instructions} while (condition)
□ les instructions dans le bloc sont répétées tant que la condition
reste vraie.
□ On rentre toujours au moins une fois dans la boucle : la condition
est testée en fin de boucle.
93
94. while (3)
fausse
while () { ...} condition
vraie
Instructions
94
95. while (4)
Instructions
do { ...}while ();
vraie
condition
fausse
95
96. while (5)
Facto1.java
public class Facto1
{
public static void main(String args[])
{
int n, result,i;
n = BasicIO.readint(quot;Entrer une valeur pour nquot;);
result = 1; i = n;
while (i > 1)
{
result = result * i;
i--;
}
System.out.println( quot;la factorielle de quot; + n + quot; vaut quot; + result);
}
}
96
97. for (1)
– Boucles déterminées
■ On veut répéter une ou plusieurs instructions un nombre déterminés
de fois : on répète l’instruction ou le bloc d’instructions pour un
certain nombre de pas.
■ La boucle for
for (int i = 1; i <= 10; i++)
System.out.println(i); //affichage des nombres de 1 à 10
■ une boucle for est en fait équivalente à une boucle while
for (instruction1; expression1; expression2) {bloc}
… est équivalent à …
instruction 1; while (expression1) {bloc; expression2}
97
98. for (2)
Facto2.java
public class Facto2
{
public static void main(String args[])
{
int n, result,i;
n = BasicIO.readint(quot;Entrer une valeur pour nquot;);
result = 1;
for(i =n; i > 1; i--)
{
result = result * i;
}
System.out.println( quot;la factorielle de quot; + n + quot; vaut quot; + result);
}
}
98
99. Exermple – Somme des N premiers entiers
public class SommeNEntiers
{
public static void main(String args[])
{
int n;
n = BasicIO.readint(quot;Entrer un entierquot;);
System.out.println(quot;La somme vaut quot; + SommeNEntiers.somme(n));
}
public static int somme(int n)
{
int res = 0;
while (n > 0)
{
res = res + n;
n--;
}
return res;
}
}
99
100. switch (1)
– Sélection multiples
■ l’utilisation de if / else peut s’avérer lourde quand on doit traiter
plusieurs sélections et de multiples alternatives
■ pour cela existe en Java le switch / case assez identique à celui de C/
C++
■ La valeur sur laquelle on teste doit être un char ou un entier (à
l’exclusion d’un long).
■ En règle général l’exécution des instructions correspondant à une
alternative commence au niveau du case correspondant et se termine
à la rencontre d’une instruction break ou arrivée à la fin du switch
100
101. switch (2)
Alternative.java
public class Alternative
Variable contenant la valeur
{
que l’on veut tester.
public static void main(String args[])
{
int nb = ESBasique.litInt(quot;Entrer un entier:quot;);
switch(nb) Première alternative :
{ on affiche 1 et on sort
case 1: du bloc du switch au break;
System.out.println(quot;1quot;); break;
case 2: Deuxième alternative :
System.out.println(quot;2quot;); break; on affiche 2 et on sort
default: du bloc du switch au break;
System.out.println(quot;Autre nombrequot;); break;
}
} Alternative par défaut:
} on réalise une action
par défaut.
101
102. break
– Interruption et interruption étiquetée
■ l’instruction break permet de sortir d ’une boucle
□ on sort du bloc d’instructions dans lequel on est pour remonter
dans le bloc contenant
■ On peut aussi utilisée un étiquetage pour quitter un ensemble de
boucles imbriquées
□ l’étiquette doit précéder la plus externe des boucles que l ’on
veut quitter.
□ <étiquette> : suivie d'une boucle
□ break <étiquette> ou break;
□ continue <étiquette> ou continue;
102
103. continue
– continue
■ l’instruction continue permet de sauter une itération dans une boucle
sans pour autant sortir de la boucle
□ à l’arrivée sur l’instruction continue on passe à l’itération
suivante de la boucle sans aller jusqu’à la fin de la boucle.
□ continue <étiquette> ou continue;
103
105. Récursivité (1)
– On définit la factorielle d’un nombre entier positif n, n!
par
■ n! = n * n-1 * …* 1 sachant que par convention la 0! = 1
■ Définir une classe Java qui calcule la factorielle par récurrence
■ On rappelle que
□ n! = n* n-1 * … *1 = n * (n-1* n-2 * …*1) = n *(n-1)!
105
106. Récursivité (2)
public class Facto3
{
public static void main(String args[])
{
int n, res;
n = BasicIO.readint(quot;Entrer un nombre entier positifquot;);
if (n >=0) { res = facto_recur(n);}
else { res = 0;}
System.out.println(quot;La factorielle de quot; + n + quot; vaut : quot; + res);
}
public static int facto_recur(int n)
{
if ((n == 1) || (n ==0)) {return 1;}
else {return (n*facto_recur(n-1));}
}
}
106
107. Récursivité (3)
– Récursivité
■ Pour résoudre un problème on fait appel à la résolution du même
problème mais dans un cas plus « simple »
■ Schéma de résolution identique mais à un niveau inférieur
□ Classiquement la résolution du problème au niveau « n » fait
intervenir la résolution du problème au niveau « n-1 »
▪ La factorielle
▪ La puissance
□ En mathématique on a des suites définies selon une équation de
récurrence
▪ Un = q * Un-1 + r
□ Problème classique des tours de Hanoi…
107
109. La classe String (1)
– Attention ce n’est pas un type de base. Il s'agit d'une
classe défini dans l’API Java (Dans le package java.lang)
String s=quot;aaaquot;; // s contient la chaîne quot;aaaquot; mais
String s=new String(quot;aaaquot;); // identique à la ligne précédente
– La concaténation
■ l’opérateur + entre 2 « String » les concatène :
String str1 = quot;Bonjour ! quot;;
String str2 = null;
str2 = quot;Comment vas-tu ?quot;;
String str3 = str1 + str2; / * Concaténation de chaînes : str3
contient quot; Bonjour ! Comment vas-tu ?quot;
109
110. Différences entre objets et types de base (1)
Mémoire
3
int x=3,y=3;
x == y est vrai 3
0x768
0x852
String s1=quot;abcquot;,s2=quot;abcquot;; Abc
s1 == s2 est faux... ....
Quand on compare 2 variables d’un type de base
on compare leur valeur. Quand on compare 2 objet
Abc
avec les opérateurs on compare leur référence (leur
....
adresse en mémoire). Introduction de la méthode
equals() pour les objets : s1.equals(s2) est vrai
110
111. Différences entre objets et types de base (2)
public class ExempleString
{
public static void main(String args[])
{
String s1=new String(quot;abcquot;);
String s2=new String(quot;abcquot;);
String s_abc1 = quot;abcquot;;
String s_abc2 = quot;abcquot;;
int x = 3, y =3;
System.out.println(quot;x = quot; + x + quot; y = quot; + y + quot; et x == y vaut quot; + (x == y));
System.out.println(quot;s1 = new String(quot;abcquot;); --> quot; + s1);
System.out.println(quot;s2 = new String(quot;abcquot;); --> quot; + s2);
System.out.println(quot;s1 == s2 vaut quot; + (s1 == s2));
System.out.println(quot;s1.equals(s2) vaut quot; + (s1.equals(s2)));
System.out.println(quot;s_abc1 = quot;abcquot;; --> quot; + s_abc1);
System.out.println(quot;s_abc2 = quot;abcquot;; --> quot; + s_abc2);
System.out.println(quot;s_abc1 == s_abc2 vaut quot; + (s_abc1 == s_abc2));
System.out.println(quot;s_abc1.equals(s_abc2) vaut quot; + (s_abc1.equals(s_abc2)));
}
}
111
112. La classe String (2)
– Longueur d’un objet String :
■ méthode int length() : renvoie la longueur de la chaîne
String str1 = quot;bonjourquot;;
int n = str1.length(); // n vaut 7
– Sous-chaînes
■ méthode String substring(int debut, int fin)
■ extraction de la sous-chaine depuis la position debut jusqu’à la
position fin non-comprise.
String str2 = str1.substring(0,3); // str2 contient la valeur quot;bonquot;
■ le premier caractère d’une chaîne occupe la position 0
■ le deuxième paramètre de substring indique la position du premier
caractère que l’on ne souhaite pas copier
112
113. La classe String (3)
– Récupération d’un caractère dans une chaîne
■ méthode char charAt(int pos) : renvoie le caractère situé à la position
pos dans la chaîne de caractère à laquelle on envoie se message
String str1 = quot;bonjourquot;;
char unJ = str1.charAt(3); // unJ contient le caractère 'j'
113
114. La classe String (4)
– Modification des objets String
■ Les String sont inaltérables en Java : on ne peut modifier
individuellement les caractères d’une chaîne.
■ Par contre il est possible de modifier le contenu de la variable
contenant la chaîne (la variable ne référence plus la même chaîne).
str1 = str1.substring(0,3) + quot; soirquot;; /* str1 contient maintenant la
chaîne quot;bonsoirquot; */
■ Quand on a besoin de manipuler directement les chaînes de caractères
il existe la classe StringBuffer (cf. TP)
114
115. La classe String (5)
– Les chaînes de caractères sont des objets :
■ pour tester si 2 chaînes sont égales il faut utiliser la méthode boolean
equals(String str) et non ==
■ pour tester si 2 chaînes sont égales à la casse près il faut utiliser la
méthode boolean equalsIgnoreCase(String str)
String str1 = quot;BonJourquot;;
String str2 = quot;bonjourquot;; String str3 = quot;bonjourquot;;
boolean a, b, c, d;
a = str1.equals(quot;BonJourquot;); //a contient la valeur true
b = (str2 == str3); //b contient la valeur false
c = str1.equalsIgnoreCase(str2);//c contient la valeur true
d = quot;bonjourquot;.equals(str2); //d contient la valeur true
115
116. La classe String (6)
– Quelques autres méthodes utiles
■ boolean startsWith(String str) : pour tester si une chaine de caractère
commence par la chaine de caractère str
■ boolean endsWith(String str) : pour tester si une chaîne de caractère
se termine par la chaine de caractère str
String str1 = quot;bonjour quot;;
boolean a = str1.startsWith(quot;bonquot;);//a vaut true
boolean b = str1.endsWith(quot;jourquot;);//b vaut true
116
117. La classe String (7)
Plus d’informations
dans les
documentations
de l’API dans le
package
java.lang
117
118. La classe String (8)
public class ExempleString2
{
public static void main(String args[])
{
String str1 = quot;bonjourquot;;
System.out.println(quot;Il y a quot; + str1.length() + quot; caractères dans str1quot;);
String str2 = str1.substring(0,3);
System.out.println(quot;str2 contient la chaine : quot; + str2);
char unJ = str1.charAt(3);
System.out.println(quot;Le 3eme caractère de str1 est : quot; + unJ);
String str3 = quot;BonJourquot;;
System.out.println(quot;str1.equals(quot;BonJourquot;); vaut : quot; + str1.equals(quot;BonJourquot;));
System.out.println(quot;str1.equalsIgnoreCase(str3); vaut quot; + str1.equalsIgnoreCase(str3));
System.out.println(quot;quot;bonjourquot;.equals(str1); vaut quot; + quot;bonjourquot;.equals(str1));
System.out.println(quot;str1.startsWith(quot;bonquot;); vaut quot; + str1.startsWith(quot;bonquot;));
System.out.println(quot;str1.endsWith(quot;Jourquot;); vaut quot; + str1.endsWith(quot;jourquot;));
}
}
118
120. Objets, tableaux, types de base
– Lorsqu'une variable est d'un type objet ou tableau :
■ ce n'est pas l'objet ou le tableau lui-même qui est stocké dans la
variable mais une référence vers cet objet ou ce tableau (on retrouve
la notion d’adresse mémoire ou du pointeur en C).
– Lorsqu'une variable est d'un type de base :
■ La variable contient la valeur.
– Lorsqu’unevariable est d’un type « complexe » (Chaine,
Tableau, Objet quelconque)
■ La variable contient la valeur de l’adresse à laquelle se trouve l’objet
120
121. Références
– La référence en Java correspond à la notion de pointeur
■ La référence est, en quelque sorte, un pointeur pour lequel le langage
assure une manipulation transparente (pour l’utilisateur), comme si
c'était une valeur
□ pas de déréférencement : on manipule toujours l’objet et jamais
directement le « pointeur ». Contrairement au C/C++, il n’y a pas
d’arithmétique sur les pointeurs
– Attention
■ La référence n’étant pas une valeur, c'est au programmeur de prévoir
l'allocation mémoire nécessaire pour stocker effectivement l'objet
□ utilisation de l’opérateur new
121
122. Différences entre objets et types de base
Mémoire
3
int x=3,y=3;
x == y est vrai 3
0x768
0x852
String s1=new String(quot;abcquot;),s2=new String(quot;abcquot;); Abc
s1 == s2 est faux... ....
Quand on compare 2 variables d’un type de base
on compare leur valeur. Quand on compare 2 objet
Abc
avec les opérateurs on compare leur référence (leur
....
adresse en mémoire). Introduction de la méthode
equals() pour les objets : s1.equals(s2) est vrai
122
124. Les tableaux (1)
– Les
tableaux permettent de stocker plusieurs valeurs de
même type dans une variable.
■ Les valeurs contenues dans la variable sont repérées par un indice
■ En langage Java, les tableaux sont des objets
– Déclaration
■ type_elt_tableau nom_var_tab [ ];
□ int tab [ ];
String chaines [ ];
– Création d'un tableau
■ nom_var_tab = new type_elt_tableau [taille_tableau];
□ tab = new int [20]; //tableau de 20 entiers de type int
□ chaines = new String [100]; //tableau de 100 chaînes
124
125. Les tableaux (2)
– Le nombre d'éléments du tableau est stocké.
■ Java peut ainsi détecter à l'exécution le dépassement d'indice et
générer une exception.
■ Mot clé length
□ Le nombre d’éléments (la taille) est récupérable par
nomTableau.length
tab = new int [20];
int taille = tab.length; //taille vaut 20
– Comme en C/C++ ou en JavaScript, les indices d’un
tableau commencent à ‘ 0 ’.
■ Donc un tableau de taille 100 aura ses indices qui iront de 0 à 99.
125
126. Les tableaux (3)
– Initialisation
tab[0]=1;
tab[1]=2; //etc.
noms[0] = new String( quot;Boulequot;);
noms[1] = new String( quot;Billquot;);//etc
– Création et initialisation simultanées
String noms [ ] = {quot;Boulequot;,quot;Billquot;};
Point pts[ ] = { new Point (0, 0), new Point (10, -1)};
126
127. Les tableaux (4)
– Il
est possible de créer des tableaux quot;rectangulairesquot; et
des tableaux quot;non rectangulairesquot;.
■ Des tableaux à 2 dimensions : notion de matrices
■ on parle plus généralement de tableau multidimensionnel.
– Exemples :
int matrice [ ] [ ] = new int [4] [3];
int tab [ ] [ ] = new int [4] [ ];
tab [0] = new int [5];
tab [1] = new int [8];
tab [2] = new int [3];
tab [3] = new int [10];
127
128. Les tableaux (5)
– Quelques méthodes utiles
■ Dans la classe java.lang.System
□ static void arraycopy(Object src, int src_position, Object dst, int
dst_position, int length) qui copie le tableau src à partir de
l’indice src_position dans le tableau dst, en le remplissant à
partir de dst_position et en copiant length élément(s).
128
129. Les tableaux (6)
– Quelques méthodes utiles
■ Dans la classe java.util.Arrays
□ static int binarySearch ( type[ ] tab, type elt_a_chercher) qui
recherche de elt_a_chercher. Renvoie l’indice si trouver, une
valeur négative sinon. Dans ce dernier cas, (-r +1) désigne la
position à laquelle il faudrait insérer elt_a_chercher pour que tab
reste trié.
□ static boolean equals(type[ ] tab1, type[ ] tab2) pour comparer 2
tableaux de même type.
□ static void fill(type[ ] tab, type elt_de_remplissage) pour remplir
un tableau avec un même élément.
□ static void sort(type[ ] tab) qui réalise un quickSort ascendant sur
les éléments de tab.
129
130. Les tableaux (7)
Tab1.java
public class Tab1
{
public static void main (String args[]) Pour déclarer une variable tableau
{ on indique le type des éléments du
int tab[ ] ; tableau et le nom de la variable tableau
tab = new int[4]; suivi de [ ]
tab[0]=5;
tab[1]=3;
tab[2]=7; on utilise new <type> [taille];
tab[3]=tab[0]+tab[1]; pour initialiser le tableau
}
}
On peut ensuite affecter
des valeurs au différentes
cases du tableau :
Les indices vont toujours de <nom_tableau>[indice]
0 à (taille-1)
130
131. Les tableaux (8)
Tab1.java
Mémoire
public class Tab1
{
public static void main (String args[])
{
int tab[ ] ; 0x0000
0x258
tab = new int[4];
tab[0]=5; 0
tab[1]=3; 0
tab[2]=7;
tab[3]=tab[0]+tab[1]; 0
} 0
}
131
132. Les tableaux (9)
Tab1.java
Mémoire
public class Tab1
{
public static void main (String args[])
{ 0x258
int tab[ ] ;
tab = new int[4];
tab[0]=5; 0
5
tab[1]=3; 0
3
tab[2]=7;
tab[3]=tab[0]+tab[1]; 0
7
} 0
8
}
132
133. Les tableaux (10)
Tab2.java
Mémoire
public class Tab2
{ 0x0258
public static void main (String args[])
{
String tab[ ] ; 0x0106
0x0000
tab = new String[4]; 0x0115
0x0000
tab[0]=new String(quot;Pierrequot;);
0x0234
0x0000
tab[1]=new String(quot;Paulquot;);
tab[2]=new String(quot;Jacquesquot;); 0x0599
0x0000
tab[3]=new String(quot;Philippequot;);
}
} quot;Pierrequot;
133
134. Les tableaux (11)
Tab2.java
Modification du programme
pour afficher le contenu
public class Tab2 du tableau.
{
public static void main (String args[])
{
String tab[ ] ;
tab = new String[4];
tab[0]=new String(quot;Pierrequot;);
tab[1]=new String(quot;Paulquot;);
tab[2]=new String(quot;Jacquesquot;);
tab[3]=new String(quot;Philippequot;);
for (int i=0;i<tab.length;i++)
{
System.out.println(quot;Prénom Numero : quot;
+ i + tab[i]);
}}
}
134
136. Accès aux attributs d’un objet (1)
Personne.java Personne
nom : String
prenom : String
public class Personne age : Integer
{
public String nom; getNom()
public String prenom; setNom()
public int age;
public void setNom(String unNom)
{
nom = unNom;
}
public String getNom()
{
return (nom);
}
}
136
137. Accès aux attributs d’un objet (2)
Application.java
public class Application
{
public static void main(String args[])
{
Personne jean = new Personne();
jean.nom = quot;Jeanquot; ;
jean.prenom = quot;Pierrequot; ;
}
}
Remarque :
Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas initialisés,
se voient affecter automatiquement une valeur par défaut.
Cette valeur vaut : 0 pour les variables numériques, false pour les booléens, et null
pour les références.
137
138. Accès aux méthodes d’un objet (1)
Personne.java Personne
nom : String
prenom : String
public class Personne age : Integer
{
public String nom; getNom()
public String prenom; setNom()
public int age;
public void setNom(String unNom)
{
nom = unNom;
}
public String getNom()
{
return (nom);
}
}
138
139. Accès aux méthodes d’un objet (2)
Application.java
public class Application
{
public static void main(String args[])
{
Personne jean = new Personne();
jean.setNom(quot;Jeanquot;) ;
}
}
139
140. Les constructeurs (1)
– L'appel de new pour créer un nouvel objet déclenche,
dans l'ordre :
■ L'allocation mémoire nécessaire au stockage de ce nouvel objet et
l'initialisation par défaut de ces attributs,
■ L'initialisation explicite des attributs, s'il y a lieu,
■ L'exécution d'un constructeur.
– Un constructeur est une méthode d'initialisation.
public class Application
{ Le constructeur est ici celui
public static void main(String args[]) par défaut (pas de
{ constructeur défini dans
Personne jean = new Personne(); la classe Personne)
jean.setNom(quot;Jeanquot;) ;
} }
140
141. Les constructeurs (2)
– Lorsque l'initialisation explicite n'est pas possible
■ par exemple lorsque la valeur initiale d'un attribut est demandée
dynamiquement à l'utilisateur, il est possible de réaliser l'initialisation
au travers d'un constructeur.
– Le constructeur est une méthode :
■ de même nom que la classe,
■ sans type de retour.
– Toute classe possède au moins un constructeur
■ Si le programmeur ne l'écrit pas, il en existe un par défaut, sans
paramètres, de code vide.
141
142. Les constructeurs (3)
Personne.java Définition d’un
Constructeur. Le
public class Personne constructeur par défaut
{ (Personne() )n’existe plus.
public String nom; Le code précédent occasionnera
public String prenom; une erreur
public int age;
public Personne(String unNom,
String unPrenom,
int unAge)
{
nom=unNom; public class Application
prenom=unPrenom; {
age = unAge; public static void main(String args[])
} {
} Personne jean = new Personne();
jean.setNom(quot;Jeanquot;) ;
} }
Va donner une erreur à la compilation
142
143. Les constructeurs (4)
– Pour une même classe, il peut y avoir plusieurs
constructeurs, de signatures différentes (surcharge).
– L'appel de ces constructeurs est réalisé avec le new
auquel on fait passer les paramètres.
– p1 = new Personne(quot;Pierrequot;, quot;Richardquot;, 56);
– Déclenchement du quot;bonquot; constructeur
■ Il se fait en fonction des paramètres passés lors de l'appel (nombre et
types). C'est le mécanisme de quot;lookupquot;.
– Attention
■ Si le programmeur crée un constructeur (même si c'est un
constructeur avec paramètres), le constructeur par défaut n'est plus
disponible. Attention aux erreurs de compilation !
143
144. Les constructeurs (5)
Personne.java
Redéfinition d’un
public class Personne Constructeur sans paramètres
{
public String nom;
public String prenom;
public int age;
public Personne()
{
nom=null; prenom=null; On définit plusieurs constructeurs
age = 0; qui se différencient uniquement
} par leurs paramètres (on parle
public Personne(String unNom, de leur signature)
String unPrenom, int unAge)
{
nom=unNom;
prenom=unPrenom; age = unAge;
} }
144
145. Destruction d’objets (1)
– Java n'a pas repris à son compte la notion de destructeur
telle qu’elle existe en C++ par exemple.
■ C'est le ramasse-miettes (ou Garbage Collector - GC en anglais) qui
s'occupe de collecter les objets qui ne sont plus référencés.
■ Le ramasse-miettes fonctionne en permanence dans un thread de
faible priorité (en « tâche de fond »).
□ Il est basé sur le principe du compteur de références.
■ Il faut faire attention certains bibliothèques graphiques (SWT)
exigent du programmeur qu’il gère lui-même la libération des la
mémoire par les objets inutilisés.
□ Cependant ce n’est pas le cas général en Java.
145
146. Destruction d’objets (2)
– Leprogrammeur n’a plus à gérer directement la
destruction des objets,
■ c’était une importante source d'erreurs
□ on parlait de fuite de mémoire ou « memory leak » en anglais
– Désactivation du GC
■ Le ramasse-miettes peut être quot;désactivéquot; en lançant l'interpréteur java
avec l'option -noasyncgc.
– Activation du gc
■ le ramasse-miettes peut être lancé explicitement par une application
avec l'appel System.gc();
146
147. Destruction d’objets (3)
– Il
est possible au programmeur d'indiquer ce qu'il faut
faire juste avant de détruire un objet.
■ C'est le but de la méthode finalize() de l'objet.
■ Cette méthode est utile, par exemple, pour :
□ fermer une base de données,
□ fermer un fichier,
□ couper une connexion réseau,
□ etc.
147
148. méthodes (rappel)
exemple : public, type de la valeur couples d'un type et d'un
static renvoyée ou void identificateur séparés par des « , »
<modificateur> <type-retour> <nom> (<liste-param>) {<bloc>}
public double add (double number1, double number2)
{ Notre méthode
retourne ici une
return (number1 +number2); valeur
}
148
149. Mode de passage des paramètres (1)
– Java
n'implémente qu'un seul mode de passage des
paramètres à une méthode :
■ le passage par valeur (comme le C)
– Conséquences :
■ l'argument passé à une méthode ne peut être modifié,
■ si l'argument est un objet, c'est sa référence qui est passée par valeur.
□ Ainsi, le contenu de l'objet peut être modifié, mais pas la
référence elle-même.
149
150. Mode de passage des paramètres (2)
public class Personne
{
public String nom;
public String prenom;
public int age;
public Personne()
{
nom=null;
prenom=null;
age = 0;
}
public Personne(String nom, String prenom, int age)
{
this.nom=nom;
this.prenom=prenom;
this.age=age;
}
public void affiche_personne()
{ System.out.println(this.prenom + quot; quot; + this.nom + quot; quot; + this.age);}
}
150
151. Mode de passage des paramètres (3)
public class exemplePassageParam
{
public static void main(String args[])
{
int nombre = 5;
System.out.println(nombre);
modification_nombre(nombre);
System.out.println(nombre);
Personne etudiant = new Personne(quot;Terieurquot;,quot;Alexquot;, 20);
etudiant.affiche_personne();
modification_personne(etudiant);
etudiant.affiche_personne();
}
public static void modification_personne (Personne p)
{ p.nom = quot;Terieurquot;; p.prenom = quot;Alainquot;; p.age = 21; }
public static void modification_nombre (int unNombre)
{ unNombre = 16; }
}
151
152. Contrôle d’accès (1)
– Chaque attribut et chaque méthode d'une classe peut être
:
■ visible depuis les instances de toutes les classes d'une application. En
d'autres termes, son nom peut être utilisé dans l'écriture d'une
méthode de ces classes. Il est alors public.
■ visible uniquement depuis les instances de sa classe. En d'autres
termes, son nom peut être utilisé uniquement dans l'écriture d'une
méthode de sa classe. Il est alors privé.
– Les mots réservés sont :
– public
– private
152
153. Contrôle d’accès (2)
– En toute rigueur, il faudrait toujours que :
■ les attributs ne soient pas visibles,
□ Les attributs ne devraient pouvoir être lus ou modifiés que par
l'intermédiaire de méthodes prenant en charge les vérifications et
effets de bord éventuels.
■ les méthodes quot;utilitairesquot; ne soient pas visibles,
■ seules les fonctionnalités de l'objet, destinées à être utilisées par
d'autres objets soient visibles.
■ C’est la notion d’encapsulation
■ Nous verrons dans la suite que l’on peut encore affiner le contrôle
d’accès .
153
154. Contrôle d’accès (3)
public class Parallelogramme
{
private int longueur = 0; // déclaration + initialisation explicite
private int largeur = 0; // déclaration + initialisation explicite
public int profondeur = 0; // déclaration + initialisation explicite
public void affiche ( )
{System.out.println(quot;Longueur= quot; + longueur + quot; Largeur = quot; + largeur +
quot; Profondeur = quot; + profondeur);
}}
public class ProgPpal
{
public static void main(String args[])
{
Parallelogramme p1 = new Parallelogramme();
p1.longueur = 5; // Invalide car l'attribut est privé
p1.profondeur = 4; // OK
p1.affiche( ); // OK
}}
154
155. Contrôle d’accès évolué (1)
– Outre private et public, Java définit deux niveaux de
contrôle d'accès supplémentaires.
– S'il n'y a pas de modificateur explicite dans la déclaration
d'un attribut ou d'une méthode, celui-ci est visible depuis
toute méthode d'une classe quelconque du même
paquetage.
■ On l'appelle accès friendly.
■ Pas de mot réservé.
155
156. Contrôle d’accès évolué (2)
– Un attribut ou une méthode protégé est visible depuis :
■ Toute méthode d'une classe quelconque appartenant au même
paquetage,
■ Toute méthode d'une sous-classe.
■ Mot réservé : protected.
– Une classe ou une interface peut être
■ publique (c'est-à-dire accessible partout où son paquetage l'est)
■ friendly (c'est-à-dire accessible seulement dans son paquetage).
156
157. Contrôle d’accès évolué (3)
– Pour résumer
■ private : visible uniquement par la classe
■ public : visible par toutes mes classes
■ protected : visible par les sous-classes et par le package
□ attention, la signification de protected en Java est différente de sa
signification en C++ où il définit une visibilité uniquement pour
les sous-classes.
■ Visibilité par défaut (quand aucun modificateur n’est spécifié) :
visibilité par le package (paquetage)
157
158. L’héritage avec Java (1)
– Java implémente le mécanisme d'héritage simple
■ L’héritage permet de quot;factoriserquot; de l'information dans le cas où deux
classes sont reliées par une relation de généralisation / spécialisation.
■ L'héritage multiple n'existe pas en Java.
□ Une classe ne peut hériter que d’une seule autre classe
□ L’implémentation d’interface permet de compenser cette
limitation
– Pour le programmeur, il s'agit d'indiquer, dans la sous-
classe, le nom de la superclasse dont elle hérite.
■ Par défaut toute classe Java hérite de la classe Object
– Mot réservé : extends
158
159. L’héritage avec Java (2)
class Personne Personne
{ nom : String
date_naissance : Date
private String nom;
private Date date_naissance;
// ...
}
class Employe extends Personne
{ Employe
private float salaire; salaire : Double
// ...
}
class Etudiant extends Personne
{
private int numero_carte_etudiant;
// ... Etudiant
} numero_carte_etudiant : Integer
159
160. L’héritage en Java (3)
– Constructeurs et héritage
■ par défaut le constructeur d’une sous-classe appelle le constructeur
quot;par défautquot; (celui qui ne reçoit pas de paramètres) de la superclasse.
Attention donc dans ce cas que le constructeur sans paramètre existe
toujours dans la superclasse...
■ Pour forcer l'appel d'un constructeur précis, on utilisera le mot
réservé super. Cet appel devra être la première instruction du
constructeur.
160