Jacques Bapst
Informatique / Programmation
Programmation orientée objet avec Java
01 : Introduction / Éléments de base
Bref historique du langage Java
§ Le langage Java a été conçu au sein de l'entreprise Sun Microsystems (par une équipe dirigée par James Gosling).
§ Initialement baptisé Oak (chêne), il a été officiellement lancé en 1995 sous le nom Java
• Javaest synonyme de "café" en argot américain
§ Le langage a été popularisé par :
• Sa portabilité (indépendance des plates-formes)
• Le slogan "Write Once Run Anywhere"
• Une syntaxe de base très proche de C/C++
• Une orientation Web native
• Des éléments de sécurité intégrés
• La gratuité de son kit de développement (JDK)
• Son adoption dans la formation (écoles, universités)
• Son nom ? Java / Introduction
C o m p l é m e n t
PR1_01
EIA-FR / Jacques Bapst 3
Caractéristiques principales
§ Orientation Objet
§ (C++)
--
§ Sécurité intégrée
§ Portabilité
§ Robustesse (typage fort, gestion de la mémoire, ...)
§ Richesse des librairies de classes (plate-forme Java)
§ Multitâche intégré au langage (Multithreading)
§ Bonne intégration des communications réseau (Sockets, RMI, …)
§ Évolutivité (SDK 1.0, 1.1, 1.2, 1.3, 1.4, 5.0, 6.0, 7.0, 8.0, …)
§ Java ¹ JavaScript
§ C# est fortement inspiré de Java Java / Introduction
C o m p l é m e n t
Mode de déploiement [1]
§ Application
• Se comporte comme une application native
• Lancement par une ligne de commande (lanceur natif)
• Nécessite la disponibilité d'une machine virtuelle Java (JVM, JRE)
• Peut accéder (par défaut) aux ressources locales (fichiers, réseau, périphériques, ...)
§ Applet
• Lancement intégré dans des pages HTML
• S'exécute à l'intérieur du navigateur (IE, Firefox, ...)
• Utilise la machine virtuelle Java du navigateur (attention aux versions de la machine virtuelle)
• Ne peut pas accéder (par défaut) aux ressources locales (notion de Sandbox) ÞSécurité
• Pratiquement plus utilisé (remplacé par Flash, HTML5, …) Java / Introduction
C o m p l é m e n t
PR1_01
EIA-FR / Jacques Bapst 5
Modes de déploiement [2]
§ Applet
§ Java Web Start
• Application déployée et mise à jour par le Web
• Mise en mémoire cache locale (lancement plus rapide)
• L'application peut être lancée depuis une page HTML ou comme une application locale
• Technologie destinée à remplacer les Applets (mais assez peu utilisée) Machine cible
Navigateur
Page HTML
Applet JVM Java / Introduction
C o m p l é m e n t
Différences par rapport à C/C++
§ Syntaxe simplifiée (élimination des redondances C/C++)
§ Tailles définies pour les types primitifs
§ Garbage Collector (ramasse-miettes)
§ Éléments supprimés :
• Pré processeur / #define/ #include/ typedef
• Fichiers header (.h)
• Structures / Unions
• Fonctions et variables globales
• Héritage multiple
• Pointeurs
• Surcharge des opérateurs
• Instruction goto
• Certains transtypages (casting) automatiques Java / Introduction
C o m p l é m e n t
PR1_01
EIA-FR / Jacques Bapst 7
Premier programme Java
§ Un premier programme (très poli) enregistré dans le fichier "Bonjour.java" :
Java / Introduction
Nom de la classe : il doit correspondre au nom du fichier source (sans l'extension)
//--- // Un premier programme Java
//--- public class Bonjour {
public static void main(String[] args) { System.out.println("Bonjour à tous !");
}
} Point d'entréedu programme
Compilation et Interprétation
Source Compilateur Bytecode Java / Introduction
Linux
P1.java javac P1.java P1.class
Compilation Interprétation
On utilise un éditeur pour créer et modifier les fichiers sources
Interpréteur java P1
Java VM
Dans un environnement de développement intégré (IDE) les commandes sont disponibles sous forme de menus et barres d'outils
Windows Java VM
. . . Java VM
Machines virtuelles (JVM/JRE)
PR1_01
EIA-FR / Jacques Bapst 9
Commentaires
§ Trois formes de commentaires : // …Texte…
üCommence dès //et se termine à la fin de la ligne üSur une seule ligne
üA utiliser de préférence pour les commentaires généraux
/* …Texte… */
üLe texte entre /*et */est ignoré par le compilateur üPeuvent s'étendre sur plusieurs lignes
üNe peuvent pas être imbriqués
üPeuvent être utiles pour inactiver (temporairement) une zone de code
/** …Texte… */
üCommentaire de documentation (comme /* … */mais avec fonction spéciale) üInterprétés par l'utilitaire javadocpour créer une documentation au format HTML üPeuvent contenir des balises de documentation (@author, @param, …)
üPeuvent contenir des balises HTML (Tags)
Java / Eléments de base
Exemples de commentaires
Java / Eléments de base
/**
* Somme : Calcule une somme
*
* @author Marc Duchemin
* @version 2.3 08.07.2014
*/
public class Somme {
/*---+
| Programme principal | +---*/
public static void main(String[] params) { //--- Initialisation des variables
int a = 1;
int b = 2;
int total; // Totalisateur total = a + b;
//--- Affichage du résultat de l'addition System.out.println("Résultat = " + total);
}
PR1_01
EIA-FR / Jacques Bapst 11
Identificateurs
§ Les identificateurs sont des noms symboliques permettant de référencer les éléments des programmes Java (variables, fonctions, ...).
§ Règles pour les identificateurs :
• Doivent commencer par une lettre ou un souligné (ou, à éviter, un caractère monétaire)
• Suivi (éventuellement) d'un nombre quelconque de lettres, chiffres ou soulignés (ou, à éviter, de caractères monétaires)
• Distinction entre les majuscules et les minuscules
(éviter de créer des identificateurs qui ne se distinguent que par la casse)
• Utilisent le jeu de caractères Unicode(16 bits)
• Selon les plates-formes, les caractères alphabétiques spéciaux (par exemple les caractères accentués, les lettres grecques, …) peuvent encore poser des problèmes => A éviter
• Les mots réservés du langage sont exclus (voir liste à la page suivante)
Java / Eléments de base
Mots réservés (Keywords)
§ Mots réservés du langage Java (mots-clé) :
abstract default goto 1) package synchronized
assert 3) do if private this
boolean double implements protected throw
break else import public throws
byte enum 4) instanceof return transient
case extends int short true 2)
catch false 2) interface static try
char final long strictfp void
class finally native super volatile
const 1) float new switch while
continue for null 2)
Java / Eléments de base
1)Mots réservés du langage mais non utilisés actuellement
2)Littéraux prédéfinis
3)Depuis la version 1.4 du JDK 4)Depuis la version 1.5 du JDK
PR1_01
EIA-FR / Jacques Bapst 13
Notion de variable [1]
§ En informatique, la notion de variable est une notion fondamentale (un concept essentiel).
§ Une variable définit une case mémoire nommée et typée.
• Le nom est représenté par un identificateur
• Le type définit le genre d'informations qui sera enregistré ainsi que les opérations qui pourront être effectuées sur ces informations
• Il existe un certain nombre de types prédéfinis mais il est également possible de créer ses propres types
§ Avant de pouvoir être utilisée, une variable doit préalablement être déclarée (définition de l'identificateur et du type).
§ Syntaxe :
Type Identificateur ; float note;
Polygone triangle;
Java / Eléments de base
note 4.75
Notion de variable [2]
§ La valeur de la variable peut être définie (initialisée), consultée, modifiée en utilisant le nom de la variable.
§ Les variablesont une visibilité et une durée de vie qui dépendent du contexte dans lequel elles sont déclarées.
§ Le type d'une variable peut être soit un type primitif, soit un type référence (c'est-à-dire le nom d'une classe ou d'un tableau)
§ Exemples :
int unNombreEntier; // Type primitif int
String motDePasse; // Classe String (prédéfinie) Point position; // Classe Point
char[] voyelles; // Tableau de caractères Point[] nuage; // Tableau de Point(s) Java / Eléments de base
PR1_01
EIA-FR / Jacques Bapst 15
Représentation en mémoire
Variable Adresse Contenu
1215 note 1216 1217
. . .
float note;
. . .
Notation abstraite (à utiliser)
note
Variable Adresse Contenu
1215
note 1216 5.2
1217
. . .
note = 5.2;
. . .
5.2 note
§ De manière interne, la zone mémoire allouée à une variable est identifiée par une adresse.
§ Cette adresse est complètement cachée au programmeur : l'accès à la zone mémoire s'effectue en utilisant le nom de la variable.
Code Java Représentation interne
Java / Eléments de base
Types primitifs [1]
Java / Eléments de base
Type Contient Taille Valeurs
boolean Booléen [1 bit 1) ] true, false char Caractère (entier non-signé) 16 bits \u0000..\uFFFF
byte Entier signé 8 bits -128..127
short Entier signé 16 bits -215.. 215-1
int Entier signé 32 bits -231.. 231-1
long Entier signé 64 bits -263.. 263-1
float Nombre en virgule flottante 32 bits ±3.4*1038 double Nombre en virgule flottante 64 bits ±1.7*10308
1)Dépend de l'implémentation de la machine virtuelle
PR1_01
EIA-FR / Jacques Bapst 17
Types primitifs [2]
§ Booléen (boolean)
• Ne peuvent prendre que deux valeurs : Vrai ou Faux
• Ne peuvent pas être interprétés comme des valeurs numériques [0, 1]
• Valeurs littérales (valeurs qui figurent directement dans le code) ü true Vrai
ü false Faux
§ Caractère (char)
• Caractères Unicode(codage normalisé sur 16 bits)
• Site de référence de la norme : www.unicode.org
• Peuvent être traités comme des entiers (non-signés !)
• Valeurs littérales
üEntre apostrophes : 'A' (attention : "A"n'est pas de type char) üSéquence d'échappement pour certains caractères spéciaux
(voir tabelle page suivante) Java / Eléments de base
Types primitifs [3]
§ Séquences d'échappement (char) Java / Eléments de base
Code Signification
\b Retour en arrière (Backspace)
\t Tabulateur horizontal
\n Saut de ligne (Line-feed)
\f Saut de page (Form-feed)
\r Retour de chariot (Carriage-Return)
\" Guillemet
\' Apostrophe
\\ Barre oblique arrière (Backslash)
\xxx Caractère Latin-1(xxx : valeur octale 000..377)
\uxxxx Caractère Unicode
(xxxx : valeur hexadécimale 0000..FFFF)
PR1_01
EIA-FR / Jacques Bapst 19
Types primitifs [4]
§ Entiers signés (byte, short, int, long)
• Valeurs littérales (int par défaut) : notation habituelle
• Suffixe l ou Lpour type long (Lest préférable)
• Préfixe 0(zéro) pour valeur octale (base 8)
• Préfixe 0bou 0Bpour valeur binaire (base 2)
• Préfixe 0xou 0Xpour valeur hexadécimale (base 16)
• Exemples :
0 // valeur de type int 123 // valeur de type int -56 // valeur de type int
0377 // 377 [octal] = 255 [décimal]
433L // valeur de type long
0b1011 // valeur binaire de type int 0xff // valeur hexadécimale de type int 0xA0B3L // valeur hexadécimale de type long Java / Eléments de base
Java 7
Types primitifs [5]
§ Nombres en virgule flottante (float, double)
• Norme IEEE 754-1985
• Précision
üfloat : env. 6 chiffres significatifs üdouble : env. 15 chiffres significatifs
• Valeurs littérales (doublepar défaut) : notation habituelle (n.m)
• Suffixe f ou Fpour type float
• Suffixe d ou Dpour type double (rarement nécessaire)
• Notation exponentielle avec eou Esuivi de l'exposant
• Valeurs spéciales : infini, -infini, zéro négatif, NaN (Not a Number) Java / Eléments de base
Attention : Les nombres en virgule flottante sont des approximations de nombres réels (tous les nombres réels ne peuvent pas être représentés de manière exacte).
Il faut en tenir compte dans les comparaisons et notamment dans les tests d'égalité (prendre en compte un "epsilon").
PR1_01
EIA-FR / Jacques Bapst 21
Types primitifs [6]
§ Nombres en virgule flottante (float, double)
123.45 // valeur de type double (par défaut) 17d // valeur de type double
-4.032F // valeur de type float
6.02e23 // 6.02 x 1023 de type double -5.076E-2f // -5.076 x 10-2 de type float Java / Eléments de base
§ Le caractère '_' peut être inséré dans les littéraux numériques
long creditCardNr = 1234_5678_9012_3456L;
int tenMillions = 10_000_000;
int bytePattern = 0b11000011_00001111_11110000_00110011;
float pi = 3.14_15_93f;
§ Cas particuliers (problèmes numériques) :
1.2/0.0 // Infini Double.POSITIVE_INFINITY
-5.1/0.0 // Moins l'infini Double.NEGATIVE_INFINITY
0.0/0.0 // Not a Number (NaN) Double.NaN
Java 7
Affichage sur la console
§ Pour afficher une valeur littérale ou le contenu d’une variable sur la console de sortie, on utilise les lignes de code suivantes :
•System.out.print(…); // Affichage (reste sur la même ligne)
•System.out.println(…); // Affichage et retour à la ligne
§ Exemples :
System.out.println("Résultats");
System.out.println("---");
Résultats --- int size = 123;
char unit = 'm';
System.out.print("Longueur : ");
System.out.print(size);
System.out.print(" ");
System.out.println(unit);
Longueur : 123 m
int size = 123;
char unit = 'm';
System.out.println("Longueur : " + size + " " + unit);
Même affichage mais en utilisant l'opérateur de concaténation (+)
Java / Eléments de base
PR1_01
EIA-FR / Jacques Bapst 23
Conversions de types [1]
§ Mis à part le type booléen, tous les types primitifs peuvent être convertis entre eux.
§ L'encodage Unicode permet (si nécessaire) de considérer les caractères comme des nombres.
Le type char peut donc agir comme un entier short mais il est non signé (contrairement aux autres entiers).
§ Conversion élargissante / Promotion (automatique)
(avec perte éventuelle de précision lors du passage en virgule flottante)
§ Conversion restrictive explicite (par transtypage / casting) (sous la responsabilité du programmeur)
Java / Eléments de base
Remarque : Certaines conversions restrictives implicites sont automatiquement effectuées lorsque le résultat d'une expression constante est assignée à une variable (byte, shortou char) pour autant que la valeur de l'expression puisse être représentée (sans perte) par la variable.
short compteur = 12*34; // Conversion implicite int -> short
Conversions de types [2]
§ Conversions des types primitifs
boolean byte short char int long float double
boolean – N N N N N N N
byte N – E R E E E E
short N R – R E E E E
char N R R – E E E E
int N R R R – E E* E
long N R R R R – E* E*
float N R! R! R! R! R! – E
double N R! R! R! R! R! R* –
Conversion de
Conversion vers
N: pas de conversion possible R: conversion restrictive
E: conversion élargissante *: perte de précision !: valeur tronquée (promotion)
Java / Eléments de base
PR1_01
EIA-FR / Jacques Bapst 25
Transtypage (Casting)
§ Conversion de type explicite (au risque du programmeur)
§ Syntaxe :
(
Type_de_destination)
Valeur_à_convertir§ Exemples :
int i = 17;
byte b = 4; // Conversion implicite : littéral int -> byte b = i; // Erreur à la compilation
b = (byte)i; // Conversion explicite (int -> byte)
float f = 23.86f;
i = (int)f; // Valeur tronquée (i==23)
Java / Eléments de base
Types "Référence"
§ En plus des huit types primitifs, Java définit deux autres catégories de types de données :
- les classes et - les tableaux qui seront étudiés en détail plus tard.
§ Les classes et les tableaux sont des types généralement composites (représentant des valeurs multiples).
§ Ils sont collectivement nommés : Types "Référence"
(on parle également parfois de types non-primitifs).
§ Pour une variable de type référence, la case mémoire ne contient pas directement les valeurs de la variable mais une référence (une sorte de pointeur) vers une autre zone mémoire contenant les valeurs.
Java / Eléments de base
String nom = "Dupont"; nom "Dupont"
PR1_01
EIA-FR / Jacques Bapst 27
Chaînes de caractères
§ Les chaînes de caractères ne font pas partie des types primitifs
§ Les chaînes de caractères font partie des types référence (ce sont des objets de la classe String)
§ D'usage courant Þ Syntaxe particulière (simplifiée) pour les valeurs littérales :
• Texte entre guillemets ("…")
• Peuvent contenir des séquences d'échappement identiques à celles définies pour les types char
• Ne peuvent pas s'étendre sur plusieurs lignes
• Concaténation (mise bout à bout) avec l'opérateur "+"
• Conversions possibles : types primitifs ó String
"Ceci est une chaîne de caractères"
"Le caractère \" se nomme 'guillemet'"
"La conca" + "ténation peut s'étendre " +
"sur plusieurs lignes"
Java / Eléments de base
Conversions types primitifs
óString
§ Il est possible de convertir des valeurs de types primitifs en chaînes de caractères (String) et inversement en utilisant des fonctions (méthodes) disponibles dans des classes appelées Wrappers.
Conversions
Type primitif Wrapper en String de String
byte Byte toString(byte b) parseByte(String s) short Short toString(short s) parseShort(String s) int Integer toString(int i) parseInt(String s) long Long toString(long l) parseLong(String s) float Float toString(float f) parseFloat(String s) double Double toString(double d) parseDouble(String s)
D'autres fonctions de conversion sont également disponibles dans la classe String, notamment la méthode valueOf()qui permet de convertir en Stringles valeurs de tous les types primitifs.
Java / Eléments de base
Exemples de conversions
Attention: Ne pas confondre les littéraux de type caractère ou chaîne de caractères avec les littéraux numériques. Par exemple '4', "4"et 4.
Le premier est un caractère (type char), le deuxième une chaîne de caractères (type String) et le troisième est une valeur numérique entière (type int).
int i; // Variable de type int
float f; // Variable de type float
double d; // Variable de type double
String s; // Variable de type String
s = "412";
i = Integer.parseInt(s); // Conversion String -> int s = "1.234";
d = Double.parseDouble(s); // Conversion String -> double f = 123.8F;
s = Float.toString(f); // Conversion float -> String s = String.valueOf(f); // Conversion float -> String
Java / Eléments de base
Jacques Bapst
Informatique / Programmation
Programmation orientée objet avec Java
02 : Expressions et opérateurs
Java / Expressions et opérateurs
Expressions [1]
§ Les expressions sont des entités composées de littéraux, de
variables, d'invocations de méthodes et d'opérateurs. Ex : 4 + a / f(x)
§ Les expressions sont des éléments syntaxiques permettant de déterminer une valeur à partir d'autres valeurs
§ L'évaluation d'une expression détermine une valeur et un type de retour
§ Les expressions primaires : littéraux ou variables
§ La valeur résultante de l'évaluation d'une expression primaire est la valeur littérale ou la valeur enregistrée dans la variable.
Le type résultant est celui de la valeur littérale ou de la variable
§ Exemples :
141 Littéral entier (type int, valeur 141)
true Littéral booléen (type boolean, valeur true)
total Variable (type selon déclaration de variable, valeur actuelle de total)
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 3
Expressions [2]
§ Les expressions complexes sont composées d'expressions primaires (opérandes) et d'opérateurs (y c. invocation de méthodes)
§ Exemples :
total = 141 Expression d'affectation
1 + 2 Expression avec opérateur d'addition
total = 7 + b Expression comprenant une addition et une affectation r = p.min(a, b) Expression comprenant une invocation de méthode
§ La valeur et le type d'une expression complexe sont déterminés par les valeurs et types des opérandes ainsi que par les opérateurs qui interviennent dans l'expression (les règles seront vues plus tard).
§ Certains opérateurs ont des effets de bord : ils changent par ex.
la valeur des opérandes et donc modifient l'état du programme (affectation, incrémentation, décrémentation, invocation de méthodes, création d'objets)
a = 2 i++
Java / Expressions et opérateurs
Opérateurs
§ Les opérateurs sont des éléments syntaxiques qui effectuent certaines opérations en utilisant les valeurs de leurs opérandes (paramètres de l'opération).
§ Opérateurs unaires(monadiques) 1 opérande
-b Opérateur monadique moins
a++ Opérateur monadique de post-incrémentation
§ Opérateurs binaires(dyadiques) 2 opérandes
a * b L'opérateur de multiplication est binaire y = z L'affectation est également binaire (int)y Transtypage (casting)
§ Opérateurs ternaires 3 opérandes
• Un seul opérateur ternaire en Java
x > y ? x : y Retourne la valeur maximale entre x et y
Op Résultat
Opérandes
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 5
Liste des opérateurs [1]
P A Opérateur Type(s) des opérandes Opération 15 G .
[]
( params ) ++, --
objet, membre tableau, int
méthode, liste de paramètres variable
accès au membre d'un objet accès à l'élément d'un tableau invocation (appel) de méthode post-incrémentation, décrémentation
14 D ++, --
+, -
~
!
variable nombre entier booléen
pré-incrémentation, décrémentation plus monadique, moins monadique complément binaire
NON logique 13 D new
( type )
classe, liste de paramètres type, quelconque
création (instanciation) d'objet transtypage (conversion de type)
12 G *, /, % nombre, nombre multiplication, division, modulo
11 G +, - +
nombre, nombre
chaîne de caract., quelconque
addition, soustraction concaténation
10 G <<, >>, >>> entier, entier décalage à gauche, droite, non-signé 9 G <, <=
>, >=
instanceof
nombre, nombre nombre, nombre référence, type
inférieur, inférieur ou égal supérieur, supérieur ou égal comparaision de types 8 G ==
!=
==
!=
primitif, primitif primitif, primitif référence, référence référence, référence
égalité (valeurs égales) non-égalité
égalité (référence au même objet) non-égalité
P : Précédence A : Associativité
Java / Expressions et opérateurs
Liste des opérateurs [2]
P A Opérateur Type(s) des opérandes Opération 7 G &
& entier, entier
booléen, booléen
ET binaire (bit à bit) ET logique
6 G ^
^
entier, entier booléen, booléen
OU exclusif binaire (bit à bit) OU exclusif logique
5 G |
|
entier, entier booléen, booléen
OU binaire (bit à bit) OU logique
4 G && booléen, booléen ET logique conditionnel 1)
3 G || booléen, booléen OU logique conditionnel 1)
2 D ? : booléen, quelconque, quelconque opérateur conditionnel (ternaire) 1 D =
*=, /=, %=, +=, -=, <<=,
>>=, >>>=,
&=, ^=, |=
variable, quelconque variable, quelconque
affectation
affectation avec opération
P : Précédence A : Associativité
1)L'opérande de droite n'est évaluée que si c'est nécessaire
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 7
Précédence et Associativité
§ Précédence (voir colonne Pdans la liste des opérateurs)
• Définit, en l'absence de parenthèses, quelles opérandes sont liés à quels opérateurs
• Plus le degré de précédence est élevé et plus les opérandes sont liés à l'opérateur considéré
• Les parenthèses permettent de spécifier explicitement les liens entre les opérandes et les opérateurs
• Conseil : Sauf cas triviaux, toujours mettre des parenthèses dans les expressions complexes afin d'éviter toute ambiguïté d'interprétation
§ Associativité (voir colonne Adans la liste des opérateurs)
• S'il y a plusieurs opérateurs de même précédence, l'associativité définit l'ordre dans lequel les opérations seront exécutées
üDe la gauche vers la droite (G) üDe la droite vers la gauche (D)
Java / Expressions et opérateurs
Opérateurs arithmétiques
+ - plus, moins monadique
+ - addition, soustraction
++ -- pré/post incrémentation, pré/post décrémentation
* / % multiplication, division, modulo (reste de la division entière) -2.7
i++
--j - 2
a * x*x + 4.2 5.6/3
17 % 5 (ne pas confondre avec 17 / 5 )
§ Effectuent des opérations arithmétiques et retournent des résultats numériques
§ Le type du résultat dépend du type des opérandes
§ Si nécessaire, une conversion élargissante (automatique) des opérandes est effectuée avant l'opération
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 9
Ordre d'évaluation
§ Pour mettre en évidence l'ordre d'évaluation des opérations d'une expression, on peut placer des parenthèses en fonction de la précédence et de l'associativité des opérateurs impliqués :
1 + 3 * 4 - 2 - 5
11 12 11 11
G G G G
( ( 1 + ( 3 * 4 ) ) - 2 ) - 5 v = a - i++
1 11 14 D G D
v = ( a - ( i++ ) )
Précédence
Associativité
§ Après placement des parenthèses, les opérateurs ne devraient avoir comme opérandes que des expressions entre parenthèses ou éventuellement un symbole ou une valeur littérale unique (isolé).
§ Analyse non terminée : u = (a * b) - (c * d) + f(e);
Java / Expressions et opérateurs
Ordre d'évaluation / Ordre des opérations
§ Dans des expressions plus complexes (et un peu tordues) il est nécessaire de bien distinguer l'ordre d'évaluation des opérandes (qui s'effectue de gauche à droite) et l'ordre des opérations (qui dépend
de la précédence et de l'associativité des opérateurs).
§ De telles expressions pièges sont à éviter (il faut impérativement écrire le code de manière moins ambiguë).
int i = 10;
i = i + (i=5);
int i=2;
i = ++i + ++i * ++i;
int i=1, j=2;
i = i+++j;
C o m p l é m e n t
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 11
Évaluation des opérations [1]
§ Si l'un des opérandes est un nombre en virgule flottante, l'arithmétique décimale (arithmétique réelle) est utilisée (calcul en virgule flottante)
§ Si les deux opérandes sont des nombres entiers, l'arithmétique entière est utilisée (important pour les divisions et pour le domaine des valeurs possibles)
§ Les caractères (char) sont traités comme des entiers short (leur valeur Unicode est utilisée)
§ L'arithmétique entière est circulaire et ne produit jamais de dépassement (une division par zéro lève cependant l'exception ArithmeticException)
§ L'arithmétique décimale (en virgule flottante) peut produire des valeurs spéciales (infini, -infini, zéro négatif, NaN) mais ne lève jamais d'exceptions
Java / Expressions et opérateurs
Évaluation des opérations [2]
§ Le résultat d'une expression entière est de type int1) sauf si l'un des opérandes est de type long, auquel cas l'expression est de type long (voir diagramme page suivante)
§ Le résultat d'une expression réelle (comprenant au moins un opérande en virgule flottante) est de type float1) sauf si l'un des opérandes est de type double, auquel cas l'expression est de type double (voir diagramme page suivante)
1)par conversion élargissante automatique (promotion) des opérandes
byte b = 12;
short s = 167;
float f = 1.2f;
int i = s - b; // Expression entière, s et b sont convertis en int // avant l'opération
double d = f * 2.5; // Expression réelle, f est converti en doubleavant // l'opération (car 2.5 est de type double)
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 13
Évaluation des expressions arithmétiques
§ Pour chaque opérateur arithmétique, d'éventuelles conversions préalables sont effectuées en fonction du type de ses opérandes :
Nb à virg.
?
long
?
double
?
Conversion év.
et calcul en int
N Y
N
Conversion év.
et calcul en long
Conversion év.
et calcul en float
N Y
Conversion év.
et calcul en double Y
Arithmétique entière Arithmétique décimale
Exemple: 17 / 3 + 1.0
Java / Expressions et opérateurs
Opérateurs relationnels
== != égalité, inégalité
< > plus petit, plus grand
<= >= plus petit ou égal, plus grand ou égal i < 5
if (age >= 18) {...}
while (i<100) {...}
if (objet1 != objet2) {...} // Comparaison des références
§ Effectuent des opérations de comparaison et retournent des résultats booléens
Attention :pour les types références (objets et tableaux) les opérateurs d'égalité et d'inégalité comparent les références et non les valeurs référencées.
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 15
Opérateurs et nombres en virgule flottante
§ Les nombres en virgule flottante (float et double) ne sont que des approximations des nombres réels car ils sont codifiés (en
base 2) avec un nombre limité de bits pour la mantisse et pour l'exposant (voir par ex. www.binaryconvert.com oubabbage.cs.qc.edu/IEEE-754).
§ Même à l'intérieur du domaine de valeurs prévu et avec un nombre de décimales inférieur à la précision maximale, une grande quantité de nombres réels ne peuvent pas être représentés exactement.
§ C'est pourquoi il faut être très prudent lors de l'utilisation des opérateurs relationnels avec les nombres en virgule flottante et tenir compte de ces problèmes d'arrondi.
float a=1.0f, b=0.1f, c=0.2f;
(a+(b+c)) != ((a+b)+c) // !!! true !!!
(a+(b+c)) < ((a+b)+c) // !!! true !!!
float d=2.0E7f;
d == (d+1) // !!! true !!!
Java / Expressions et opérateurs
Opérateurs logiques
! NON logique
& ET logique
&& ET logique conditionnel
(le 2èmeopérande n'est évalué que si le 1erest vrai)
| OU logique
|| OU logique conditionnel
(le 2èmeopérande n'est évalué que si le 1erest faux)
^ OU exclusif logique Ne pas confondre avec l'élévation à la puissance !
if (!found) {...}
if (size>1.4 || age>12) {...}
if (t!=null && t.length>=2 && t[1]!=4) {...}
§ Effectuent des opérations logiques et retournent des résultats booléens
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 17
Opérateurs orientés bits
~ Inversion (complément à 1)
& ET (bit à bit)
| OU (bit à bit)
^ OU exclusif (bit à bit) Ne pas confondre avec l'élévation à la puissance !
<< Décalage à gauche (zéros ajoutés à droite)
>> Décalage à droite signé (bit du signe ajouté à gauche)
>>> Décalage à droite non-signé (zéros ajoutés à gauche) byte b = ~12 // ~00001100 => 11110011 (-13) 10 & 7 // 00001010 & 00000111 => 00000010 ( 2) 10 | 7 // 00001010 | 00000111 => 00001111 ( 15) 10 ^ 7 // 00001010 ^ 00000111 => 00001101 ( 13) 10 << 2 // 00001010 => 00101000 ( 40) 10 >> 2 // 00001010 => 00000010 ( 2) -10 >> 2 // 11110110 => 11111101 ( -3) -10 >>>2 // 11110110 => 00111101 ( 61)
§ Effectuent des opérations bit à bit et retournent des résultats entiers (signés)
Java / Expressions et opérateurs
Affectation / Assignation
§ Enregistre dans l'opérande de gauche (variable) la valeur de l'opérande de droite (valeur de l'expression)
§ Le type de la variable (opérande de gauche) doit être compatible avec le type de l'expression de droite
(si nécessaire, conversion élargissante automatique)
§ Le type et valeur de retour d'une expression d'affectation correspondent au type de la variable et, respectivement, à sa valeur après affectation
§ Attention : Ne pas confondre l'opérateur d'affectation (=) avec celui d'égalité (==)
"prend pour valeur" et non pas "est égal à"
a = b + c; // La variable a prend pour valeur le résultat de la somme(b+c) a = b = c; // Associativité à droite Þ a = (b = c)
t[i] = circle.center();
PR1_02
Java / Expressions et opérateurs
EIA-FR / Jacques Bapst 19
§ Combinaison de l'affectation avec un opérateur (arithmétique ou orienté bits)
§ Le type de l'opérande de gauche (variable) doit être compatible avec le type de l'expression de droite
var op= expr est équivalent à var =var op ( expr )
§ Opérateurs combinés : += -= *= /= %=
&= |= ^=
<<= >>= >>>=
Affectation avec opérateur
i += 2; // i = i + 2;
a *= z + 4; // a = a * (z + 4);
flag |= mask; // flag = flag | mask;
// set some bits according to a mask
Java / Expressions et opérateurs
Opérateur instanceof
§ Permet de tester si une expression (de type référence) est compatible (convertible) avec un type donné.
§ Retourne true si l'opérande de gauche (qui doit être une expression de type objet ou tableau) est une instance du type spécifié par l'opérande de droite (qui doit être un type référence)
"Texte" instanceof String; // true
"Texte" instanceof Object; // true null instanceof String; // false new int[] {1} instanceof Object // true
new int[] {1} instanceof byte[] // false tableau d'int Ûtableau de byte // Utile pour prévenir des erreurs de transtypage
if (forme instanceof Polygone) { Polygone p1 = (Polygone)forme;
Sera vu plus en détail dans le cadre du polymorphisme }
Java / Expressions et opérateurs
Opérateurs particuliers
§ Ces opérateurs particuliers sont parfois considérés comme des éléments syntaxiques, parfois comme opérateurs :
• Accès à un membre d'un objet(.)
obj.x obj.f()
• Accès à un élément d'un tableau ([])
t[2]
• Invocation de méthode (()) rectangle.move(x, y)
• Création d'un objet(new)
new Point(4.0, -2.5);
new ArrayList();
• Conversion de type / Transtypage (())
(float)position (int)(a*1.414f) (Circle)shape
C o m p l é m e n t
Jacques Bapst
Informatique / Programmation
Programmation orientée objet avec Java
03 : Instructions et contrôle de flux
Instructions [1]
§ Une instruction définit une opération qui sera exécutée par la machine virtuelle Java.
§ Par défaut, les instruction sont exécutées séquentiellement (les unes après les autres), dans l'ordre dans lequel elles ont été rédigées (ordre d'apparition dans le fichier source).
§ Cependant, certaines instructions de contrôle de flux permettent de modifier l'ordre d'exécution d'une manière bien définie
(instructions exécutées conditionnellement, répétition d'instructions, etc.).
§ Les expressions avec effets de bord(affectation, incrémentation, décrémentation et invocation de méthodes) peuvent être utilisées comme instructions; elles sont alors suivies d'un point-virgule :
j = 2;
count++;
move(dx, dy);
Java / Instructions
PR1_03
EIA-FR / Jacques Bapst 3
Instructions [2]
§ Une instruction vide est constituée d'un simple point-virgule (;) Une instruction vide ne fait rien, mais son expression syntaxique peut parfois être utile.
§ Une instruction peut s'étendre sur plusieurs lignes du fichier source Dans ce cas, les retours à la ligne doivent être placés entre les éléments syntaxiques.
§ Plusieurs instructions peuvent être placées sur une même ligne du fichier source.
Cette pratique est généralement à éviter et doit être réservée aux cas où les instructions sont fortement corrélées et assez courtes.
§ Le point-virgule marque la fin d'une instruction (et non la fin d'une ligne).
screen.draw(x, y);
x += dx; y += dy;
Java / Instructions
Bloc d'instructions
§ Un bloc d'instructions(appelé également instruction composée) est constitué d'un certain nombre d'instructions quelconques
placées entre accolades ( {...} ).
§ Un bloc d'instructions peut être utilisé pratiquement partout où une instruction est requise par la syntaxe Java.
if (a<b)
{ // Début du bloc d'instructions t = b;
b = a;
a = t;
} // Fin du bloc d'instructions
§ Pour mettre en évidence la structure du code, on indenteles instructions à l'intérieur du bloc.
La forme suivante est fréquemment utilisée : if (a<b) { t = b;
( Notez bien l'indentation ) b = a;
a = t;
Java / Instructions
PR1_03
EIA-FR / Jacques Bapst 5
Déclaration de variables locales [1]
§ Une déclaration de variable locale (souvent simplement appelée variable) définit une zone mémoire en lui associant un nom (identificateur) et un type.
La déclaration permet en outre de spécifier (optionnellement) la valeur initiale de la variable.
§ Syntaxe :
Type Identificateur [= Expression ];
§ Toutes les variables locales doivent être déclarées et initialisées avant d'être utilisées.
§ En Java, les déclarations de variables peuvent être placées n'importe où dans les blocs d'instructions.
Conseil: Pour faciliter la lecture du code, groupez de préférence les déclarations de variables au début des structures (méthodes, blocs d'instructions)
Java / Instructions
Déclaration de variables locales [2]
§ Une seule instruction de déclaration de variable permet de déclarer et d'initialiser plusieurs variables, pour autant qu'elles soient toutes du même type.
§ Lors de déclarations multiples, les noms des variables (avec leurs éventuelles valeurs initiales) sont séparés par des virgules.
int counter;
Point p;
int number= 0; // Déclaration et initialisation
String s = getName(); // Valeur connue à l'exécution seulement int i, j, k; // Déclarations multiples
int i=2, j=5, k; // i et j sont initialisés, k ne l'est pas Java / Instructions
PR1_03
EIA-FR / Jacques Bapst 7
Représentation en mémoire
Variable Adresse Contenu
1215
price 1216 3
1217
cost 1218 6
1219
{
int price;
price = 3;
{
int cost=2*price;
} }
3
price cost 6
Représentation abstraite usuelle (notation à utiliser) Java / Instructions
§ Une déclaration de variable locale définit (dans la mémoire vive) une zone mémoire dont la taille et le codage dépend du type de la variable.
§ Les détails d'implémentation ne sont pas importants (mais il faut retenir le principe).
Portée des variables
§ Les variables locales ne peuvent être utilisées que dans la méthode ou le bloc d'instruction au sein duquel elles ont été déclarées
§ On définit la portée(scope) ou portée lexicale d'une variable la zone de code où la variable est accessible (cette zone va de sa déclaration jusqu'à la fin du bloc dans lequel elle est déclarée).
§ A la fin de leurs portées lexicales, les variables ne sont plus visibles et le système peut récupérer l'espace mémoire qui leur était alloué
public static void m() {
int i = 0; // i while (i<10) { // i
double d = 1.2 * i; // i d System.out.println(d); // i d i++; // i d } // i
System.out.println(i); // i }
Java / Instructions