← (précédent) A.3 La fonction System.in.read()
A.5 La classe Math
Accueil S O M M A I R E

A.4 Les variables (II) : opérateurs et opérations.

EXEMPLE 1 :  

1.     public class Variables21
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age = 40;
7.               age = 41;
8.               System.out.println("age = " + age);
9.          }
10.
11.    }
Compilez puis exécutez. Il sera affiché : age = 41

La déclaration d' une variable réserve en mémoire un espace. L' affectation d' une valeur à cette variable entraîne le remplissage de cet espace mémoire par la valeur.
C' est ce qui se passe ligne 6. un espace mémoire appelé age et ayant la forme de type byte est créé. Puis la valeur 40 y entre. Puis à la ligne 7, on affecte une nouvelle valeur 41 à la variable. A ce moment, la valeur 41 entre dans cet espace mémoire, chassant dans le même temps la valeur 40. La nouvelle valeur de la variable est alors 41. C' est pourquoi il s' affiche age = 41
EXEMPLE 2 :  


1.     public class Variables22
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age = 40;
7.               age = 41;
8.               System.out.println("age = " + age);
9.               age = 35;
10.              System.out.println("age = " + age);
11.              age = 98;
12.              System.out.println("age = " + age);
13.          }
14.
15.    }
Compilez puis exécutez. Il sera affiché :
age = 41
age = 35
age = 98


Vous l' aurez compris, la nouvelle valeur affectée à la variable, prend la place de l' ancienne valeur.
EXEMPLE 3 :  


1.     public class Variables23
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age = 40;
7.               byte age = 41;
8.               System.out.println("age = " + age);
9.          }
10.
11.    }
Compilez ce programme et un message d' erreur sera affiché : age is already defined in main()
byte age = 41;

Ce qui veut dire que dans la classe Variables23.java et à la ligne 7, la variable age a déjà été définie.
En effet, en java, comme en tout langage de programmation, on ne définit pas une même variable plus d' une fois.
EXEMPLE 4 :  


1.     public class Variables24
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age1 = 40;
7.               byte age2 = age1;
8.               System.out.println("age2 = " + age2);
9.          }
10.
11.    }
Compilez ce programme puis exécutez. Il sera affiché : age2 = 40

Ligne 6 : déclaration de la variable age1 de type byte, puis affectation de la valeur 40 à cette variable.
Ligne 7 : déclaration de la variable age2 de type byte, puis affectation de la valeur de la variable age1 à la variable age2
De manière générale, en Java comme en tout langage, lorsqu' on a l' instruction variable1 = variable2; ça veut dire que la valeur de la variable de droite est affectée à la variable de gauche.
EXEMPLE 5 :  

1.     public class Variables25
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age1 = 40;
7.               byte age2 = 33;
8.               byte age3 = age1 + age2;
9.               System.out.println("age3 = " + age3);
10.      
11.          }
12.
13.    }
Compilez ce programme, il sera affiché une erreur possible loss of precision
found int required byte
byte age3 = age1 + age2;


Qu' est-ce que ça veut dire ? ... une possible perte de précision
une valeur de type int a été trouvée alors que la variable dans laquelle on essaye de la mettre est de type byte. Vous allez me dire que 40 + 33 reste une valeur de type byte. C' est vrai. Mais Java considère que l' addition de 2 byte donne un int. Allez donc savoir pourquoi. Pour ma part, je ne comprends pas non plus. Mais c' est comme ça.
Ceci reste encore vrai pour les autres opérations arithmétiques (soustraction, multiplication et division).
De même, si vous écrivez l' instruction : age = age + 1; le résultat est de type int. Aussi vrai si age était de type short. C' est pourquoi, lorsqu' on manipule des variables de type entier(byte, short, int et long), il vaut mieux choisir le type int. Ce que nous allons faire pour la suite des opérations.
EXEMPLE 6 :  


1.     public class Variables26
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte age1 = 40;
7.               byte age2 = 33;
8.               int age3 = age1 + age2;
9.               System.out.println("age3 = " + age3);
10.      
11.          }
12.
13.    }
Compilez puis exécutez, il sera affiché : age3 = 73

Cette fois, la somme de 2 bytes est bien mise dans un int. Pas de message d' erreur. Java effectue la somme de la valeur de age1 avec celle de age2. Puis Java met le résultat dans la variable age3.
De manière générale, lorsque Java rencontre l' instruction variable = opération entre des variables , il effectue d' abord l' opération. Puis le résultat est affecté à la variable à gauche du signe égal. Parce que à gauche du signe égal, c' est l' espace mémoire alors qu ' à droite, c' est le contenu, la valeur.
EXEMPLE 7 :  


1.     public class Variables27
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int marches = 124;
7.               marches = marches + 1;
8.               
9.               System.out.println("marches = " + marches);
10.      
11.          }
12.
13.    }
Compilez puis exécutez, il sera affiché : marches = 125

La ligne 7 peut étonner au premier abord si vous réfléchissez en tant que mathématicien. Mais si vous réfléchissez à ce que j' ai déjà dit, vous comprendrez que marches à gauche du signe égal est l' espace mémoire alors que marches à droite du signe égal est la valeur de ce même espace mémoire. Autrement dit, la ligne 7 veut dire qu' on prend la valeur de la variable marches, on l' additionne avec le nombre 1. Puis on met le résultat dans cet espace mémoire que représente la variable marches.
EXEMPLE 8 :  


1.     public class Variables28
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int marches = 124;
7.               marches++;
8.               System.out.println("marches = " + marches);
9.               System.out.println();
10.              marches += 1;
11.              System.out.println("marches = " + marches);      
12.          }
13.
14.    }
Compilez puis exécutez, il sera affiché :
marches = 125

marches = 126


ligne 6 : déclaration, puis affectation à la variable marches, la valeur 124. puis la ligne 7 représente ce qu' on appelle en Java, l' opération d' incrémentation de la variable marches. C' est à dire, augmenter de 1, la valeur de cette variable. C' est pourquoi l' affichage est de 125 (124 + 1). Puis l' instruction de la ligne 9 affiche une ligne vide.
La ligne 10 peut aussi étonner un mathématicien. Mais en Java, ça veut simple dire qu' on ajoute 1 à la valeur de marches. En fin de compte :
variable = variable + 1    équivaut à    variable++    équivaut à    variable += 1
EXEMPLE 9 :  


1.     public class Variables29
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int marches = 124;
7.               marches = marches - 1;
8.               System.out.println("marches = " + marches);
9.               System.out.println();
10.              marches--;
11.              System.out.println("marches = " + marches);
12.              System.out.println();
13.              marches -= 1;
14.              System.out.println("marches = " + marches);      
15.          }
16.
17.    }
Compilez puis exécutez, il sera affiché :
marches = 123

marches = 122

marches = 121


Même raisonnement que l' exemple précédent. Cette fois, c' est l' opération de décrémentation.
variable = variable - 1    équivaut à    variable--    équivaut à    variable -= 1
EXEMPLE 10 :  


1.     public class Variables210
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int marches = 124;
7.               marches = marches - 2;
8.               System.out.println("marches = " + marches);
9.               System.out.println();
10.              marches -= 2;
11.              System.out.println("marches = " + marches);      
12.          }
13.
14.    }
Compilez puis exécutez, il sera affiché :

marches = 122

marches = 120


Vous l' aurez compris :
variable = variable - 2 équivaut à variable -= 2

EXEMPLE 11 :  


1.     public class Variables211
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int marches = 124;
7.               marches = marches * 2;
8.               System.out.println("marches = " + marches);
9.               System.out.println();
10.              marches = *= 2;
11.              System.out.println("marches = " + marches);
12.              System.out.println();
13.              marches = marches / 2;
14.              System.out.println("marches = " + marches);
15.              System.out.println();
16.              marches /= 2;
17.              System.out.println("marches = " + marches);    
18.          }
19.
20.    }
Compilez puis exécutez, il sera affiché :

marches = 248

marches = 496

marches = 248

marches = 124


Explications : ligne 7 veut dire : nouvelle valeur de la variable marches = ancienne valeur de marche fois 2. le caractère * est le signe de la multiplication en java.
variable = variable * 2 équivaut à variable *= 2
D' où l' affichage de marches = 496. On passe de 248 à 248 fois 2 = 496

ligne 13 veut dire : nouvelle valeur de marches = ancienne valeur de marches divisé par 2. le caractère / est le signe de la division en java.
variable = variable / 2 équivaut à variable /= 2
D' où l' affichage de marches = 124. On passe de 248 à 248 divisé par 2 = 124

EXEMPLE 12 :  

1.     public class Variables212
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int a = 1;
7.               a + 5 = 2;
8.          }
9.
10.    }
Compilez ce programme et un message d' erreur sera affiché à caude la ligne 7. Ce messages est :

unexpected type
required variable
found value
a + 5 = 2;


Ce qui veut dire que le type est inconnu. on attend une variable et on trouve une valeur.
En effet, l' expression a + 5 est une valeur. Or, à gauche du signe égal, c' est toujours une variable, autrement dit, un espace mémoire. Java ne peut pas réserver un espace mémoire à une expression mathématique.
EXEMPLE 13 :  


1.     public class Variables213
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int a, b;
7.               a = 2;
8.               b = 5;
9.              System.out.println("a = " + a + " et b = " + b);    
10.         }
11.
12.    }
Compilez puis exécutez, il sera affiché :

a = 2 et b = 5

Sur la ligne 6, on a déclaré 2 variables. En effet, en Java, on peut déclarer simultanément plusieurs variables de même type.
type variable1, variable2, variable3; une virgule et un caractère espace séparent les noms des variblaes déclarées simultanément. Le nom de la dernière variable est évidement suivi d' un point-virgule. Normal, toute instruction en java se termine toujours par un point-virgule.
LEs autres lignes, vous les comprenez forcément. Sinon, revoyez les exemples précédents.
EXEMPLE 14 :  


1.     public class Variables214
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int a, b;
7.               a = 2;
8.               b = 5;
9.               a = b;
10.              b = a;
11.              System.out.println("a = " + a + " et b = " + b);    
12.         }
13.
14.    }
Compilez puis exécutez, il sera affiché :

a = 5 et b = 5

En mathématique, lorsqu' on donne des valeurs différentes à deux variables, écrire l' égalité entre ces variables devient faux. Pas en informatique.
Souvenez-vous, écrire a = b veut dire que la valeur de la variable b est mise dans la variable a. Donc, la valeur 5 vient remplacer l' ancienne valeur qui était 2. Puis en écrivant b = a, ce n' est pas l' ancienne valeur 2 de a qu' on met dans la variable b. Mais plutôt la nouvelle valeur de a. Puisqu' à ce moment précis, a n' est plus égale 2, mais plutôt égale à 5. Donc, b = 5. D' où l' affichage a = 5 et b = 5
EXEMPLE 15 :  échanger les valeurs de deux variables


1.     public class Variables215
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int a, b, t;
7.               a = 2;
8.               b = 5;
9.               t = a;
10.              a = b;
11.              b = t;
12.              System.out.println("a = " + a + " et b = " + b);    
13.         }
14.
15.    }
Compilez puis exécutez, il sera affiché :

a = 5 et b = 2

Pour échanger les valeurs de 2 variables, on est obligé d' utiliser une variable tampon. Car si on écrit a = b; et b = a; on se retrouve à la fin avec la même valeur dans les deux variables. Exemple 14. Car en commençant par dire que a = b; la première valeur de a disparaît à jamais. D' où l' utilité de la variable tampon t dans laquelle on commence par mettre la valeur initiale de a.
EXEMPLE 16 :  échanger les valeurs de 3 variables 


1.     public class Variables216
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int a, b, c, t; 
7.               a = 1; b = 2; c = 3;
8.               t = a;
9.               a = b; b = c; c = a;
10.              System.out.println("a = " + a + " et b = " + b + " et c = " + c);    
11.         }
12.
13.    }
Compilez puis exécutez, il sera affiché :

a = 2 et b = 3 et c = 1

Même explication que dans l' exemple précédent. Cet exemple pour vous dire que quel que soient le nombre de variables dont on veut changer les valeurs, on utilisera une et une seule variable tampon.
EXEMPLE 17 :  


1.     public class Variables217
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int k;
7.               int b = a + 1;   
8.         }
9.
10.    }
Compilez, il sera affiché un message d' erreur :

variable a might not have been initialized

Ce qui veut dire que la variable k a dû ne pas être initialisée. En Java, avant d' utiliser une variable, il faut lui donner une valeur initiale. Quand on débute en programmation, on croit que le fait qu' on ne sache pas la valeur d' une variable à la fin du programme fait que on ne doit pas lui donner une valeur avant de l' utiliser. Erreur grave, fatale.
Donner toujours une valeur à votre variable. Même si sa valeur finale sera différente, la nouvelle valeur viendra chasser l' ancienne.
EXEMPLE 18 :  


1.     public class Variables218
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = 't';
7.               System.out.println(" c = " + c);  
8.         }
9.
10.    }
Compilez puis exécutez, il sera affiché :

c = t

Normal: affichage du contenu d' une variable.
EXEMPLE 19 :  


1.     public class Variables219
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = ' ';
7.               System.out.println(" c = " + c);  
8.         }
9.
10.    }
Compilez puis exécutez, il sera affiché :

c =

Normal: affichage du contenu d' une variable. Ce contenu étant un espace, on ne le distingue pas.
EXEMPLE 20 :  


1.     public class Variables220
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = '';
7.                 
8.         }
9.
10.    }
Compilez ce programme et il sera affiché un message d' erreur :

empty character literal

Ce qui veut dire que la valeur de la variable de type char n' existe pas. En effet, le type char n' accepte pas zéro caractère. on doit y mettre un caractère et un seul.
EXEMPLE 21 :  


1.     public class Variables221
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               String chaine = "";
7.               
7.               System.out.println(" chaine = " + chaine);  
8.         }
9.
10.    }
Compilez puis exécutez ce programme. Il sera affiché:

chaine =

La chaine de caractères chaine posséde zéro caractère. pourtant, pas de message d' erreur. Donc la variable de type String accepte zéro caractère. Ce qui n' est pas le cas du type char.
EXEMPLE 22 :  


1.     public class Variables222
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               String chaine1, chaine2;
7.               chaine1 = "bonjour"; chaine2 ="java";
8.               System.out.println(" somme des chaines = " + chaine1 + " " + chaine2);  
9.         }
10.
11.    }
Compilez puis exécutez ce programme. Il sera affiché:

somme des chaines = bonjour java

Comme je vous l' ai déjà dit, type String + type String = type String. "bonjour" + "java" = bonjourjava. Pour éviter que ces deux mots soient collés l' un à l' autre, j' ai pris soin de mettre une chaine de caractères représentée par un caractère espace. J' ai mis cette chaine dans les parenthèses de System.out.println() à la ligne 7. C' est pourquoi à l' affichage, il y a un espace à l' affichage entre les deux chaines.

Nous aurons l' occasion de revenir sur la manipulation des caractères et des chaines de caractères dans la partie traitant les classes String et StringBuffer.

Autre chose, sur la ligne 7, vous voyez pour la première fois, deux instructions sur la même ligne. Sachez que c' est normal. on peut mettre autant d' instructions qu' on veut sur la même ligne. L' important, c' est de terminer chaque instruction par le fameux point-virgule obligatoire.

Attention ! ! ! Ne jamais faire la soustraction des string. Le seul opérateur arithmétique appliqué aux String et aux types char aussi, c' est le + : addition.
Evidement, la somme de deux char ne paut pas être un char puisque ce type n' accepte qu' un seul caractère. La somme de deux char est donc forcément un String.
EXEMPLE 23 :  


1.     public class Variables223
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = 't'; 
7.               String chaine = c;
8.               
9.               
10.         }
11.
12.    }
A la compilation, vous aurez un message d' erreur. Incompatible types
found char
required String


Types incompatibles. La Valeur à affecter est de type char alors que la variable dans laquelle on essaye de la mettre est de type String.
Ça peut étonner. Parce que vous vous dîtes peut-être, que mettre un caractère dans une chaine de caractères n' est pas anormal. Type moins étendu dans type étendu. Il n' en est rien. Vous vous souvenez lorsque je vous ai dit que le type String n' est pas un type primitif. C' est là où le bas blesse. Un type primitif (par exemple char) ne peut pas affecté au type Objet (par exemple String).
Pour y arriver, on fait une conversion. En Java, le mot utilisé est : "cast". Pour convertir (ou "caster"), on écrit le type vers lequel on doit caster qu'on met entre parenthèses, suivi du type à caster. La correction de la ligne 7 du programme ci-dessus donnerait ceci :
String chaine = (String)i;
EXEMPLE 24 :  


1.     public class Variables224
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = 't'; 
7.               String chaine = (String)c;
8.               
9.               
10.         }
11.
12.    }
A la compilation, vous aurez un message d' erreur. inconvertible types
found char
required String


Types inconvertibles. On ne peut pas convertir le type primitif en un type Objet. L' opération de cast n' est pas possible.

Pour transformer une variable de type char en une de type String, c'est quand même possible, on utilise une fonction contenue dans une classe pré-définie dans Java. Cette classe s'appelle "Character". Remarquez la première lettre en majuscule dans le nom d'une classe. Et cette fonction s'appelle : "toString()".
Voici comment l'utiliser : Character.toString(c). c étant la variable de type char à transformer en type String.

On peut remplacer la ligne 7 par celle-ci : String chaine = Character.toString(c);

Les deux exemples précédents ( ex 23 et ex 24 ) sont en quelque sorte une petite anticipation de l'opération de cast et une propriété des objets (au sens de la programmation orientée objet). Mais il m'a semblé nécessaire de les aborder parce que pour un débutant en Java, la tentation de vouloir mettre un char dans un String est trop grande lorsque la situation se présente.

EXEMPLE 25 :  


1.     public class Variables225
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c = 'e'; String chaine = "pil";
7.               chaine = chaine + c;
8.               System.out.println("chaine = " + chaine);
9.               
10.         }
11.
12.    }
compil + exécution donne à l' affichage :

chaine = pile

On ne peut pas affecter la valeur d' un char à une variable de type string. Mais on peut ajouter un caractère à un String. Parce que l ' addition d' un type primitif (en l'occurence le type Char) et d' un String donne toujours un type String.
EXEMPLE 26 :  


1.     public class Variables226
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c1, c2;
7.               c1 = 't'; 
8.               c2 = 'u';
9.               System.out.println("Le pronom est " + c1 + c2);    
10.         }
11.
12.    }
Compilez puis exécutez, il sera affiché :

le pronom est tu

Normal, la fonction System.out.println() additionne les 2 caractères pour en faire une chaine. Mais l'addition ci-dessous (exemple 27) est plutôt impossible.
EXEMPLE 27 :  


1.     public class Variables227
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c1, c2;
7.               c1 = 't'; c2 = 'u';
8.               String pronom = c1 + c2;
9.                   
10.         }
11.
12.    }
Si vous compilez ce programme, il sera affiché un message d' erreur :

incompatibles types
found : int
required : String
String pronom = c1 + c2;


qu' est-ce ça veut dire ? ... les types incompatibles. java a trouvé un type int en faisant c1 + c2 alors que vous voulez mettre ce résultat dans une variable de type String. En l' occurence, la variable pronom.
Etonnant ? Pas vraiment. En effet, le type char est en réalité une donnée de type numérique dont les valeurs vont de 0 à 255. Quand on met une valeur de type 'a' dans une variable de type char, Java fais ce qu' on appelle une conversion implicite (nous y reviendrons) de la valeur numérique en type char. De même, la fonction System.out.print() fait la même conversion.
Mais quand on essaye de mettre la somme de deux char dans un String, ça ne va plus. Y a plus de conversion implicite. Pour y arriver, faut-il faire une conversion explicite ?
Non, on ne peut pas convertir un type primitif (ici, c' est int ) en type Objet (String). Mais il existe une petite astuce qui permet de mettre la somme de caractères dans une chaine de caractères.
EXEMPLE 28 :  


1.     public class Variables228
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               char c1, c2;
7.               c1 = 't'; c2 = 'u';
8.               String pronom = c1 + "" + c2;
9.               System.out.println("pronom = " + pronom);    
10.         }
11.
12.    }
compil + exécution, il sera affiché :

pronom = tu

"" = valeur de type String avec zéro caractère. Et vous savez que String + un type primitif donne toujours un String. D' où l' affichage.
EXEMPLE 29 :  


1.     public class Variables229
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte b = 55; short s = 199; int i = 214748364; long l = 922337203685477580l;
7.               l = i; i = s; s = b;
8.               
9.               System.out.println(" l = " + l + "et " i = " + i + " et " s = " + s);
10.         }
11.
12.    }
Compilez puis exécutez, il sera affiché

l = 214748364 et i = 199 et s = 55

Première explication : Lorsque vous déclarez une variable de type long et que vous lui affectez une valeur qui ne se trouve pas dans l' intervalle du type int, c' est à dire une valeur supérieure à 2147483647 et inférieure à - 2147483648, le compilateur envoie un message d' erreur. On est obligé de terminer par la lettre l. Comme vous le voyez dans l' exemple.
Si cette valeur se trouve dans l' intervalle du type int , la lettre l n' est pas nécessaire. Mais pas interdite.

la ligne 7 montre les affectations d' un type à un autre différent. on a mis le int dans le long. Le short dans le int. Et enfin le byte dans le short. Aucun message d' erreur. Parce que cette conversion est normale. le type byte peut entrer dans le type short parce que le type short est plus étendu.

Rappel :
byte = nombres entiers compris entre - 128 et + 127. short = nombres entiers compris entre - 32768 et + 32767. Facile à comprendre.

C' est comme si on mettait le contenu d' une bouteille d' un litre dans une bouteille de 2 litres. Même raisonnement pour le short dans le int et le int dans le l. La conversion se fait automatiquement. C' est la conversion implicite des variables.
EXEMPLE 30 :  


1.     public class Variables230
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte b = 55; short s = 199; int i = 214748364; long l = 922337203685477580l;
7.               
8.               b = s; s = i; i = l;
9.               
10.         }
11.
12.    }
Compilez ce programme et il sera affiché 3 messages d' erreur correspondant aux trois affectations anormales

message 1 : possible loss of precision found short required byte.

message pour l' affectation b = s; trouvé short comme valeur affecté alors que la variable est de type byte.
C' est comme si vous essayez de mettre le contenu d' une bouteille de 2 litres dans une bouteille d' un litre. ça ne va pas.
Pour les bouteilles, si le contenu de la bouteille de 2 litres est inférieur ou égal à un litre, il n' y aurait pas de problème.
Pour les variables de java, même si la valeur de short est dans l' intervalle de byte, le compilateur java refuse quand même. Il ne compare pas les valeurs, mais plutôt les types.

message 2 : possible loss of precision found int required short.

message pour l' affectation s = i; Java a trouvé int comme valeur affectée alors que la variable est de type short.
C' est comme si vous essayez de mettre le contenu d' une bouteille de 3 litres dans une bouteille de 2 litre. ça ne va pas.
Pour les bouteilles, si le contenu de la bouteille de 3 litres est inférieur ou égal à 2 litres, il n' y aurait pas de problème.
Pour les variables de java, même si la valeur de int est dans l' intervalle de short, le compilateur java refuse quand même. Il ne compare pas les valeurs, mais plutôt les types.

message 3 : possible loss of precision found long required int .

message pour l' affectation i = l; Java a trouvé long comme valeur affectée alors que la variable est de type int.
C' est comme si vous essayez de mettre le contenu d' une bouteille de 4 litres dans une bouteille de 3 litres. ça ne va pas.
Pour les bouteilles, si le contenu de la bouteille de 4 litres est inférieur ou égal à 3 litres, il n' y aurait pas de problème.
Pour les variables de java, même si la valeur de long est dans l' intervalle de int , le compilateur java refuse quand même. Il ne compare pas les valeurs, mais plutôt les types.
EXEMPLE 31 :  


1.     public class Variables231
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte b = 55; short s = 101; 
7.               b = (byte)s;
8.               System.out.println("valeur de b = " + b);
9.               
10.         }
11.
12.    }
après compilation puis exécution, pas de message d' erreur. Cette fois, avant de mettre un short dans un byte, type moins étendue, on a pris une précaution. On a effectué une conversion explicite. En java, ça s ' appelle le cast. La ligne 7 veut dire, transformer la valeur du short en byte, (byte)s, puis mettre le résultat dans un byte. Ici, la valeur du short (101) se trouve dans l' intervalle du type byte (- 128 et + 127). C' est pourquoi à l' affichage on a :
valeur de b = 101

Maintenant, essayons de mettre une valeur short hors intervalle du type byte et voyons ce que ça va donnér
EXEMPLE 32 :  


1.     public class Variables232
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               byte b = 55; short s = 351; 
7.               b = (byte)s;
8.               System.out.println("valeur de b = " + b);
9.               
10.         }
11.
12.    }
Après compilation puis exécution, il sera affiché :

valeur de b = 95

La question logique qu' on peut se poser est de savoir pourquoi la valeur affichée n' est pas 127. La bouteille de 2 litres dont le contenu est 1.2 litres, et qu' on essaye de mettre dans une bouteille de 1 litre. On aura la bouteille de 1 litre pleine. Et le reste sera perdu.
Pour ce qui est de l' espace mémoire, les choses sont moins triviales. Un calcul compliqué aboutit à la valeur 95 affichée. Pour vous, débutants en programmation, il n' est pas nécessaire de le comprendre. Contentez-vous d' abord de comprendre l' art de programmer. Les livres de java réservés aux non débutants vous feront mieux comprendre ces choses lorsque vous ne serez plus débutant.

Pour les autres types entiers, vous pouvez utilisez le même principe de cast poour mettre une valeur d' un type dans une variable de type moins étendue. Du int dans du short ou dans du byte et du long dans du int ou dans du short ou dans du byte.
EXEMPLE 33 :  


1.     public class Variables233
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int x = 2; int y = 2; 
7.               boolean proposition = x==y;
8.               System.out.println("proposition = " + proposition);
9.               
10.         }
11.
12.    }
Après compilation puis exécution, il sera affiché :

proposition = true

La ligne 7 présente la déclaration puis l' affectation d' une variable booléenne nommée proposition. On lui affecte une valeur qui va paraître bizarre au programmeur débutant. Cette valeur (x==y) représente une valeur booléenne qui est soit true (vraie) ou false (faux fausse). Le signe = représente l' opérateur d' affectation d' une variable. Mais le signe == représente l' opérateur de comparaison. En écrivant x==y (ou x == y), c' est comme si on se demandait s' il y a égalité entre x et y. Si la réponse est oui, alors, la valeur booléenne que représente x == y est true (vraie : x est bien égal à y). Dans le cas contraire, la réponse est non et la valeur booléenne est false (faux : x n' est pas égal à y.
EXEMPLE 34 :  


1.     public class Variables234
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int x, y, z, t; x = 1; y = 5; z = 35; t = 65;
7.               boolean proposition1, proposition2, proposition3, proposition4;
8.               proposition1 = x > y; proposition2 = x < y; proposition3 = z == t;
9.               proposition4 = z != t;
10.              System.out.println("x est supérieur à y ? : " +  proposition1);
11.              System.out.println("y est inférieur à x ? : " +  proposition2);
12.              System.out.println(" z est égal à t ? : " +  proposition3);
13.              System.out.println(" z n' est pas égal t? : " +  proposition4);
14.         }
15.
16.    }
Après compilation puis exécution, il sera affiché :

x est supérieur à y ? : false
x est inférieur à y ? : true
z est égal à t ? : false :
z n' est pas égal à t ? : true


Le caractère < veut dire inférieur. > veut dire supérieur. == veut dire égal (en comparaison bien sûr. pas en affectation). Et != veut dire différent ou n' est pas égal.
Prenez l' habitude, afin d' éviter des risques d' erreur, de mettre les parenthèses autour des expressions de comparaison. Vivement conseillé.
Vivement, vivement, vivement conseillé.
EXEMPLE 35 :  


1.     public class Variables235
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int x, y, z, t; x = 1; y = 5; z = 35; t = 65;
7.               boolean proposition1, proposition2, proposition3, proposition4;
8.               proposition1 = (x > y) || (z < t); 
9.				 proposition2 = (x < y) || (z < t); 
10.              proposition3 = (x < y) || (z > t); 
11.              proposition4 = (x > y) || (z > t);
12.              System.out.println("(x > y) ou (z  < t) : " +  proposition1);
13.              System.out.println(" (x < y ) ou (z < t): " +  proposition2);
14.              System.out.println(" (x < y ) ou (z > t) : " +  proposition3);
15.              System.out.println("(x > y) ou (z > t) : " +  proposition4);
16.         }
17.
18.    }
compilation puis exécution donnent à l' affichage :

(x > y) ou (z < t) : true
(x < y ) ou (z < t): true
(x < y ) ou (z > t) : true
(x > y) ou (z > t) : false

D' abord, le signe || s' obstient en appuyant simultanément sur les touches altGr et la touche 6
Ce signe veut dire ou. Le ou inclusif. Comme en mathématique, le ou renvoie false (faux) dans le cas ou les deux opérandes sont fausses.
x > y (faux) Et z > t (faux). proposition4 est donc false.
Dans les 3 autres cas, la valeur est forcément true.
Ligne 8 : faux ou vrai . Ligne 9 : vrai ou vrai . Ligne 10 : vrai ou faux.
EXEMPLE 36 :  


1.     public class Variables236
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int x, y, z, t; x = 1; y = 5; z = 35; t = 65;
7.               boolean proposition1, proposition2, proposition3, proposition4;
8.               proposition1 = (x > y) && (z < t); 
9.               proposition2 = (x < y) && (z < t); 
10.              proposition3 = (x < y) && (z > t); 
11.              proposition4 = (x > y) && (z > t);
12.              System.out.println("(x > y) et (z  < t) : " +  proposition1);
13.              System.out.println(" (x < y ) et (z < t): " +  proposition2);
14.              System.out.println(" (x < y ) et (z > t) : " +  proposition3);
15.              System.out.println("(x > y) et (z > t) : " +  proposition4);
16.         }
17.
18.    }
compilation puis exécution donnent à l' affichage :

(x > y) et (z < t) : false
(x < y ) et (z < t): true
(x < y ) et (z > t) : false
(x > y) et (z > t) : false

D' abord, le signe && s' obstient en appuyant 2 fois sur la touche 1
Ce signe veut dire et. Comme en mathématique, le et renvoie true (vraie) dans le cas ou les deux opérandes sont vraies. Evidement, (x < y) est vraie et (z < t) est aussi vraie. Proposition2 est donc true.
Dans les 3 autres cas, la valeur est forcément false.
Ligne 8 : faux ou vrai . Ligne 10 : vrai ou faux . Ligne 11 : faux ou faux.
EXEMPLE 37 :  


1.     public class Variables237
2.     {
3.		
4.          public static void main (String [] args)
5.          {
6.               int x, y, z, t; x = 1; y = 5; z = 35; t = 65;
7.               boolean proposition1, proposition2, proposition3, proposition4;
8.               proposition1 = (x > y); proposition2 = !(x > y); 
9.               System.out.println("(x > y)  : " +  proposition1);
10.              System.out.println("non (x < y ) : " +  proposition2);
11.         }     
12.    } 
compilation puis exécution donnent à l' affichage :

(x > y) : false
non (x < y ) : true


De même que != veut dire différent, le contraire de =, de même !(expression booléenne) veut dire contraire de expression booléenne.
x supérieur à y renvoie false car effectivement x n'est pas supérieur à y. d' ou (x > y) : false
le contraire renvoie évidement true. D' où l' affichage non (x < y ) : true.

Bien que nous ayons abordé 37 exemples sur les opérations sur les variables, je peux vous dire qu' on n' en a pas encore terminé. Si je veux continuer à vous donner d' autres exemples, je risquerais d' aborder les strucures de contrôle que nous verrons plus tard.

Avant d' y arriver, nous allons voir comment manipuler les variables avec des fonctions prédéfinies par Java. D' abord, les fonctions mathématiques pour manipuler les nombres réels (double, float, long, int, short et byte : un nombre entier est dorcément réel. exemple 2 = 2.0). Ces fonctions sont regroupées dans une classes appelée Math
Ensuite, nous verrons les fonctions permettant de manipuler les caractères et surtout les chaines de caractères. Ces fonctions sont regroupées dans les classes String et StringBuffer.

← (précédent) A.3 La fonction System.in.read()
A.5 La classe Math
Accueil S O M M A I R E

A.4 Les variables (II) : opérateurs et opérations.