• Aucun résultat trouvé

Informatique / Programmation

N/A
N/A
Protected

Academic year: 2022

Partager "Informatique / Programmation"

Copied!
98
0
0

Texte intégral

(1)

Jacques Bapst

[email protected]

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

(2)

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)

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

Jacques Bapst

[email protected]

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

(10)

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

(11)

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)

(12)

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

(13)

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 entail dans le cadre du polymorphisme }

(14)

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

(15)

Jacques Bapst

[email protected]

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

(16)

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

Références

Documents relatifs

culateur musculeux, entouré de cellules prostatiques, s’ouvrant à la face ventrale ou à la partie postérieure du Ver... SUR LA POSITION SYSTEMATIQUE DES MONOGENES

Laquelle des deux classes est la plus représentative de l'ensemble des 110

Regrouper les valeurs dans le tableau ci-dessous ; les résultats donnés précédemment correspondent à la classe A, les valeurs déjà inscrites correspondent

On constate qu’une classe abstraite (exemple BufferedReader) contient au moins une méthode abstraite (exemple : abstract void close()). Création d’un fichier

Par contre, un rectangle est une figure géométrique dont le calcul du périmètre et de la surface est connu, on peut alors implémenter ces méthodes qui sont très concrètes (pas

[r]

[r]

http://projet.eu.org/pedago/sin/1ere/ds/ds5_numeration_correction.pdf à préparer : contrôle numération pour semaine prochaine (mardi) 6 21/09/15 présentation avant projet (étude