II. - Les Fondamentaux de Java Gérald Monard Chimie et Physique informatiques L3 Physique et Chimie
Concepts fondamentaux Un programme Java se compose d éléments de base comme : les expressions les instructions les blocs d instructions les blocs de méthodes les blocs de classes etc.
Constantes et variables Une constante est un valeur non modifiable. Une variable peut contenir des valeurs différentes 1 i = 1; 2 i = 10; 1 et 10 sont des constantes. i est une variable qui prend ici successivement les valeurs 1 et 10. = est l opérateur d affectation.
Expressions Une expression est une combinaison de constantes, de variables et d opérateurs utilisés dans des calculs mathématiques. 1 (2+3) 10 1 6 2 i 3 6+ i autres exemples:
Opérateurs arithmétiques Une expression peut contenir des symboles appelés opérateurs arithmétiques en langage Java. Liste des opérateurs: + Addition - Soustraction * Multiplication / Division % Modulo
Les opérateurs de multiplication et de division sont prioritaires par rapport à l addition et à la soustraction. Pour modifier l ordre de priorité, on peut utiliser les parenthèses (). 1 2+3 10 est différent de 1 (2+3) 10
Instructions En langage Java, une instruction est une ligne exécutable, terminée par un point-virgule. Exemple : 1 i = 1; 2 System. out. p r i n t f ( "Hello a tous\n" ) ; 3 System. e x i t ( 0 ) ; / / f i n normal d un programme sont des instructions.
Blocs d instructions Les instructions peuvent être regroupées en blocs compris entre deux accolades : l une dite d ouverture ({), l autre dite de fermeture (}). Un bloc d instructions est traité comme une instruction simple par le compilateur Java. 1 { 2 i = 2; 3 j = i 10; 4 }
Déclarations Il faut déclarer toutes les variables avant de s en servir. Une déclaration précise un type et comporte une liste de une ou plusieurs variables de ce type. Par exemple : 1 i n t mini, maxi, i n t e r v a l l e ; 2 char c ; / on peut mettre un commentaire pour i n d i q u e r 3 à quoi s e r t l a v a r i a b l e / On peut également initialiser les variables au moment où on les déclare. Si le nom de variable est suivi du signe = et d une expression, cette expression donne la valeur initiale de la variable. 1 i n t i = 0; 2 double eps = 1.0e 5; 3 char a = a ;
Typage Le typage des données est essentiel car il permet d indiquer au compilateur comment stocker en mémoire les variables ainsi que la façon dont les variables vont pouvoir interagir. Par exemple: 1 i n t i = 10; 2 i n t j = 3; 3 double x = 1 0. ; 4 double y = 3. ; 5 System. out. p r i n t l n ( i / j ) ; / / d i v i s i o n dans l e s e n t i e r s 6 System. out. p r i n t l n ( x / y ) ; / / d i v i s i o n dans l e s r e e l s Noms et types de données Le langage Java comporte très peu de types de base : char, int (byte, short, long), float, double, boolean.
Type int Le mot-clé int correspond au type entier applicable aux variables. Un nombre entier est une valeur sans partie décimale. En conséquence, une division entière a comme effet de tronquer le résultat par rapport à la valeur décimale. Typage taille (octets) valeur mini. valeur maxi. int 4-2 147 483 648 2 147 483 647 short 2-32768 32767 byte 1-128 127 long 8-9 223 372 036 854 775 808-9 223 372 036 854 775 807
Type float A la différence d un nombre entier, un nombre à virgule flottante comprend une partie décimale dissociée de la partie entière par une virgule. En Java, le type float définit les nombres décimaux, aussi appelés nombres réels. En général, la précision du type float est de sept chiffres après la virgule. Type double En Java, un nombre à virgule flottante peut aussi être de type double. En général, la précision du type double est de quinze chiffres après la virgule. utilisez double de préférence
Notation scientifique Les valeurs décimales peuvent être exprimées à l aide de la notation scientifique. Ainsi un nombre se composera d une mantisse et d un exposant, séparés indifféremment par e ou E. Ainsi, 5000 peut s écrire 5e3, -300 est égal à -3e2, 0.0025 à 2.5e-3.
Type char Un objet de type char correspond à un élément du jeu de caractères utilisé par l ordinateur. Un caractère compris entre deux guillemets simples ( ) s appelle une constante caractères. Par exemple, a, A, b, 7 sont des constantes caractères du jeu de caractères ASCII. Il existe un correspondance entre chaque caractère et un code numérique unique (compris entre 0 et 255). Par exemple, les caractères A, a, B, et b ont respectivement comme valeur numérique unique 65, 97, 66 et 98. Ainsi les deux instructions d affectation suivantes sont équivalentes : 1 char x ; 2 x = A ; 3 x = 6 5 ;
En langage Java, le caractère d échappement (\) est toujours suivi d un caractère spécial. Par exemple \n correspond au retour chariot et au passage à une nouvelle ligne. Exemple : Caractère Description \n Retour chariot : passage à une nouvelle ligne \t Tabulation : place le curseur au niveau de la tabulation suivante \r Caractère de début de ligne : replace le curseur en début de ligne \\ insère le caractère \ \" insère le caractère " etc.
La méthode System.out.printf La méthode System.out.printf prend comme arguments une chaîne de caractère pouvant contenir des indicateurs de formats. Par exemple, dans : 1 System. out. p r i n t f ( " Voici l entier deux : %d\n", 2 ) ; L indicateur de format %d permet d afficher l entier 2. De manière générale, System.out.printf s occupent de mettre en forme les données en sortie. On appelle cela le formattage des données. Syntaxe de System.out.printf 1 System. out. p r i n t f ( S t r i n g format,... ) ; L argument String format contient deux types d objets : des caractères ordinaires et des indicateurs de format.
Les indicateurs de format commencent par % et se terminent par un caractère de conversion. Entre les deux, on peut placer dans l ordre : des drapeaux - cadre l argument à gauche dans son champ d impression + imprime systématiquement le signe du nombre si le premier caractère n est pas un signe, place un espace au début 0 pour les conversions numériques, complète le début du champ par des zéros un nombre, qui précisent la largeur minimum du champ d impression un point, qui sépare la largeur du champ de la précision désirée un nombre qui donne la précision (voir exemple) que ce soit pour une chaîne, un entier, un flottant (f, e, E, g, ou G)
Indicateurs Description %d %i Format entier %c Format caractère %f Format décimal (virgule flottante) %e %E Format de notation scientifique %g utilise %f ou %e selon la longueur de la valeur décimale %G utilise %f ou %E selon la longueur de la valeur décimale %s Format chaîne de caractère %% %
1 p u b l i c class Main { 2 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) { 3 System. out. p r i n t f ( "%d\n", 1 ) ; 4 System. out. p r i n t f ( "%f\n", 0. 1 0 ) ; 5 System. out. p r i n t f ( "%e\n", 0. 1 0 ) ; 6 System. out. p r i n t f ( "%E\n", 0. 1 0 ) ; 7 System. out. p r i n t f ( "%g\n", 0. 1 0 ) ; 8 System. out. p r i n t f ( "%G\n", 0.0000010); 9 10 System. out. p r i n t f ( "12345 12345 12345\n" ) ; 11 System. out. p r i n t f ( "%5d %-5d %d\n", 1, 1, 1 ) ; 12 System. out. p r i n t f ( "%5d %-5d %d\n", 10, 10, 1 0 ) ; 13 System. out. p r i n t f ( "%5d %-5d % 5d\n", 10, 10, 10); 14 System. out. p r i n t f ( "%+5d %-5d % 5d\n", 10, 10, 1 0 ) ; 15 System. out. p r i n t f ( "%5d %-5d %d\n", 1000, 1000, 1000); 16 System. out. p r i n t f ( "%5d %-5d %d\n", 1000000, 1000000, 17 1000000); 18 19 System. out. p r i n t f ( "%10.4f\n", 123.456789); 20 21 System. out. p r i n t f ( "%s\n", "toto" ) ; 22 System. out. p r i n t f ( "%10s\n", "toto" ) ; 23 System. out. p r i n t f ( "%-10s\n", "toto" ) ; 24 } 25 }
Opérateurs En plus de opérateurs standards vus précedemment (+, -, *, /, %) le langage Java possède d autres opérateurs plus évolués : des opérateurs arithmétiques d affectation des opérateurs unaires des opérateurs d incrémentation et de décrémentation des opérateurs relationnels des opérateurs de conversion de type
Opérateurs arithmétiques d affectation C est l opérateur =, à ne pas confondre avec le = mathématique. Par exemple, a=5 signifie que l on affecte à la variable a la valeur 5. On ne peut pas écrire en langage Java 5=a. Il existe en langage Java des opérateurs d opérations-affectations qui regroupe les deux propriétés. Ce sont les opérateurs +=, -=, *=, /=, et %=. Ainsi x+=y équivant à x=x+y, etc.
Opérateurs unaires Un opérateur unaire en Java est l opérateur - : moins, qui transforme une valeur en son opposé. 1 x = 1.234; 2 y = x ; 3 z = x y ; / é q u i v a l e n t à z = x ( y ) ; 4 é q u i v a l e n t à z = x + y ; /
Opérateurs d incrémentation et de décrémentation Le langage Java propose une solution simple au cas où l on veut incrémenter ou décrémenter de 1 une valeur entière : l opérateur ++ ou l opérateur --. Il existe deux façons en Java d incrémenter (respectivement de décrémenter) 1 à une variable x : x++ (resp. x--) ou ++x (resp. --x). Les instructions suivantes sont équivalentes : 1 x = x + 1; 2 x += 1; 3 x ++; 4 ++x ; Dans le cas de l association des opérateurs ++ ou -- et une affection, on distingue --x qui correspond à une pré-incrémentation (l incrémentation a lieu avant l affectation), de x++ qui correspond à une post-incrémentation (l incrémentation a lieu après l affectation)..
Exemple : 1 p u b l i c class Main 2 { 3 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) 4 { 5 i n t a, b, c, d, r e s u l t ; 6 a = 1; 7 b = 1; 8 c = 1; 9 d = 1; 10 r e s u l t = a++; 11 System. out. p r i n t f ( " Resultat de a++ : %d\n", r e s u l t ) ; 12 r e s u l t = ++b ; 13 System. out. p r i n t f ( " Resultat de ++b : %d\n", r e s u l t ) ; 14 r e s u l t = c ; 15 System. out. p r i n t f ( " Resultat de c-- : %d\n", r e s u l t ) ; 16 r e s u l t = d ; 17 System. out. p r i n t f ( " Resultat de --d : %d\n", r e s u l t ) ; 18 } 19 }
Opérateurs de conversion de types Il est possible de convertir en Java un type en un autre de type en faisant précéder l opérande de l opérateur de conversion. La syntaxe générale est 1 ( type ) x où type correspond au type de données cibles et x est une variable (ou une expression) contenant la valeur du type en cours. Par exemple ( float ) 5 convertit l entier 5 en nombre décimal de type float.
Exemple : 1 p u b l i c class Main 2 { 3 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) 4 { 5 i n t x, y ; 6 x = 7; 7 y = 5; 8 System. out. p r i n t f ( "x = %d et y = %d\n", x, y ) ; 9 System. out. p r i n t f ( "x / y = %d\n", x / y ) ; 10 System. out. p r i n t f ( "(float) x/y = %f\n", ( f l o a t ) x / y ) ; 11 } 12 }
Méthodes (de classe) Les méthodes (ou fonctions) permettent de regrouper des instructions Java en une unité simple qui peut être réutilisée à volonté. 1 s t a t i c i n t a d d e n t i e r s ( i n t x, i n t y ) 2 { 3 i n t r e s u l t a t ; 4 r e s u l t a t = x+y ; 5 r e t u r n ( r e s u l t a t ) ; 6 } En java, il existe deux types de méthodes: les méthodes d objets les méthodes de classes. Les méthodes de classes sont déclarés en utilisant le mot-clé static.
Nom d une méthode Le nom d une méthode doit être le plus explicite possible afin d éclaircir l utilisateur sur le traitement réalisé par la méthode. Type d une méthode Le type d une méthode correspond au type de la valeur renvoyée par la méthode (dans l exemple, add entiers est de type int ). Si une méthode ne renvoie aucune donnée, alors elle est de type void. 1 void a f f i c h e ( i n t a, f l o a t y ) 2 { 3 p r i n t f ( "Voici un entier : %d\n", a ) ; 4 p r i n t f ( "Voici un flottant : %f\n", y ) ; 5 }
Arguments d une méthode Il est parfois nécessaire de transmettre des informations pour que la méthode les traite lors de son exécution. Ces informations s appellent les arguments. L argument figure entre parenthèses juste après le nom de la méthode qui va l exploiter. Le nombre d arguments varie selon le traitement réalisé. Les arguments transmis à une même fonction sont séparés par des virgules. Si une méthode ne requiert pas d arguments, les parenthèses sont alors vides.
Début et fin d une méthode Les accolades d ouverture et de fermeture marquent le début et la fin d une méthode. Elles permettent aussi de délimiter un bloc d instructions. En fait, ces marques indiquent que la séquence contient plusieurs instructions. Corps d une méthode Il s agit de l emplacement compris entre les deux accolades et contenant déclarations de variables et instructions qui s exécutent séquentiellement lors de l appel de la méthode. Appel d une méthode Les méthodes ne représentent que des définitions informatiques d instructions à traiter, elles ne sont exécutées que si on les appelle.
1 p u b l i c class Main { 2 s t a t i c void a f f i c h e ( i n t a, double y ) { 3 System. out. p r i n t f ( "Voici un entier : %d\n", a ) ; 4 System. out. p r i n t f ( "Voici un flottant : %f\n", y ) ; 5 } 6 7 s t a t i c i n t a d d e n t i e r s ( i n t x, i n t y ) { 8 i n t r e s u l t a t ; 9 r e s u l t a t = x+y ; 10 r e t u r n ( r e s u l t a t ) ; 11 } 12 13 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) { 14 i n t a ; 15 i n t b ; 16 i n t c ; 17 18 a = 5; 19 b = 7; 20 c = a d d e n t i e r s ( a, b ) ; 21 a f f i c h e ( c, 3. 5 6 ) ; 22 a = a d d e n t i e r s ( c, a ) ; 23 } 24 }
Booléens et opérations sur les booléens En langage Java, il existe le type boolean qui permet de représenter des booléens. Une variable de type booléen ne peut posséder que deux valeurs: true ou false. On peut associer au type booléen des opérateurs : Opérateur Description ou logique && et logique! non logique
1 p u b l i c class Main 2 { 3 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) 4 { 5 boolean v = t r u e ; 6 boolean f = f a l s e ; 7 System. out. p r i n t f ( "vrai ou faux : v f : %b\n", v f ) ; 8 System. out. p r i n t f ( "vrai et faux : v && f : %b\n", v && f ) ; 9 System. out. p r i n t f ( "non vrai :!v : %b\n",! v ) ; 10 System. out. p r i n t f ( "non faux :!f : %b\n",! f ) ; 11 } 12 }
De plus il existe des opérateurs de comparaison qui permettent de comparer deux expressions à la fois : Opérateur Description == égal à!= non égal à > supérieur à < inférieur à >= supérieur ou égal à <= inférieur ou égal à
1 p u b l i c class Main 2 { 3 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) 4 { 5 i n t x, y ; 6 double z ; 7 x = 7; 8 y = 25; 9 z = 24. 46; 10 System. out. p r i n t f ( " x = %d, y = %d, z = %f\n", x, y, z ) ; 11 System. out. p r i n t f ( " x >= y : %b\n", x >= y ) ; 12 System. out. p r i n t f ( " x == y : %b\n", x == y ) ; 13 System. out. p r i n t f ( " x < z : %b\n", x < z ) ; 14 System. out. p r i n t f ( " y > z : %b\n", y > z ) ; 15 System. out. p r i n t f ( " x!= y - 18 : %b\n", x!= y 1 8 ) ; 16 System. out. p r i n t f ( " x + y!= z : %b\n", x + y!= z ) ; 17 } 18 }
Instructions conditionnelles Il est possible en Java (comme dans tous les langages évolués) d exécuter des instructions sous conditions. Par exemple, la racine carrée d un nombre x ne peut se calculer que si x est positif. Avant tout calcul d une racine carrée, il est donc nécessaire de vérifier la positivité de la variable. Cela se fait en Java en utilisant 1 i f ( e x p r e s s i o n c o n d i t i o n n e l l e ) 2 i n s t r u c t i o n ;
1 p u b l i c class Main 2 { 3 4 p u b l i c s t a t i c void main ( S t r i n g [ ] args ) 5 { 6 f l o a t x ; 7 x = 5; 8 i f ( x >= 0) { 9 System. out. p r i n t f ( "La racine carrée de %f vaut %f\n", 10 x, Math. s q r t ( x ) ) ; 11 } 12 } 13 }
Souvent, une condition peut impliquer une action ou une autre : si... alors... sinon... Cela se traduit en Java par : 1 i f ( e x p r e s s i o n c o n d i t i o n n e l l e ) 2 i n s t r u c t i o n 1 ; 3 else 4 i n s t r u c t i o n 2 ; Attention : si il y a plusieurs instructions après le if, il faut penser à introduire des { }. Si expression_conditionnelle vaut true alors on exécute instruction1, sinon (dans le cas ou expression_conditionnelle vaut false) on exécute instruction2.
1 / c a l c u l d une v a l e u r absolue / 2 3 s t a t i c double valeur absolue ( double x ) 4 { 5 double fabs ; 6 7 / s i x est p o s i t i f, l a v a l e u r absolue de x est x / 8 / s i x est n é g a t i f, l a v a l e u r absolue de x est x / 9 i f ( x >= 0) { 10 fabs = x ; 11 } else { 12 fabs = x ; 13 } 14 r e t u r n ( fabs ) ; 15 }
L ensemble if (...) inst1 else inst2 est perçue comme une seule instruction. Il peut donc être inséré dans un ensemble if (...) inst1 else inst2 de manière à former des if imbriqués. Ex. : la suite de Fibonnacci (U n = U n 1 + U n 2 avec U 0 = 0 et U 1 = 1) : 1 s t a t i c i n t f i b o ( i n t n ) 2 { 3 i n t u n ; 4 i f ( n == 0) { 5 u n = 0 ; 6 } e l s e i f ( n == 1) { 7 u n = 1 ; 8 } e l s e { 9 u n = f i b o ( n 1) + f i b o ( n 2 ) ; 10 } 11 return ( u n ) ; 12 }