Les types de base du langage
Comme beaucoup d'autre langage, Java possède un certain nombre de types de bases. Mais contrairement au autres, Java impose que la représentation interne de ces types de bases soit uniforme (même espace mémoire) et ce, quelque soit la machine sur laquelle tourne le programme. En effet, cette uniformisation est un gage de portabilité pour les applications écrites en Java.
La déclaration des variables
Pour un peu situer (ou resituer) les choses, une variable est en quelques sortes la carte d'identité d'un petit élément (une donnée) du programme. Ce petit élément est totalement définit par la connaissance des informations suivantes :
·
le type de la donnée : nous allons très rapidement revenir sur la notion de type. En simplifiant les choses, on pourra dire qu'un type correspond à un ensemble de valeurs que pourra prendre une données qui aurra était définit à partir de ce type. Par exemple, le type entier, définit un ensemble de valeurs numériques, non décimales, compris entre une borne minimale et une borne maximale (nous en repparlerons).
·
le nom de la variable : ce nom permet d'identifier ce petit élément de programme. En l'utilisant, on pourra alors affecter, à la donnée mentionnée, une valeur (bien entendu, contenue dans l'ensemble de valeurs définit par le type).
·
une éventuelle valeur initiale : pour pouvoir correctement utiliser cette donnée, il pourra être judicieux de lui donner une valeur initiale. Par la suite, la valeur de la variable pourra malgrè tout changer (sauf dans quelques cas précit).
Bien entendu, il faut, pour que le compilateur comprenne ce qu'on veut lui dire, que la définition des variables respecte une certaine syntaxe. Toute déclaration débute en mentionnant le type utilisé pour la (ou les) variables considéré(s). Ensuite, on faire suivre le nom de chaque variable à définir (séparées par des virgules). Un poit-virgule final permet de terminer la déclaration. Pour chaque variable, on peut à la volée, mentionner la valeur initiale en utilisant le signe d'égalité suivit de la valeur : le compilateur fera alors attention à ce que chaque valeur soit compatible avec le type utilisé. Attention à une chose : le langage fait la distinction entre minuscules et majuscules. La variable nommée i est donc distincte de celle nommée I. Saisissez (ou mieux copier à partir de votre navigateur) la section de code suivante, compilez et testez là afin de bien comprendre comment on définit une variable. Tester d'autres valeurs. Essayer de forcer une valeur 3.2 pour j : qu'en concluez-vous ?
Fichier "Variables.java"
public class Variables {
static public void main(String params[]){
// Définition deux deux variables entières i et j
// i sera de plus initialisée avec la valeur 15
int i=15 , j;
// Définition d'une chaîne de caractères avec
// comme valeur initiale "Cours Java"
String chaine = "Cours Java";
// On donne une valeur à j
j = 10;
// On utilise ces variables en les affichants
System.out.println("i = " + i + " et j = " + j);
System.out.println("chaine = " + chaine);
}
}
Les types numériques
Le langage propose un grand nombre de types numériques. On peut classer ces types en deux catégories : les types entiers et les types décimaux. Ce qui différencit les types d'une même catégorie, c'est la taille de mémoire utilisée pour contenir une valeur. Plus cette taille est grande, plus les valeurs utilisables sont nombreuses. Vous choisissez donc un type en fonction de l'étendu de valeur souhaitée pour vos variables.
Les types numériques entiers
Quatre types d'entiers vous sont proposés. La différence réside dans la taille nécessaire pour stocker la valeur. Le tableau qui suit précise un petit peu mieux les choses. Le bit y est utilisé pour décrire les tailles. Notez qu'un bit ne peut prendre que deux valeurs (0 ou 1). En conséquence, n bits ne peuvent définir que 2n valeurs. On regroupe traditionnellement (c'est lié à des aspects électroniques) les bits par groupe de huit, ce qui forme un octet (byte en anglais). Un octet peut donc contenir 2^8 (soit 256) valeurs distinctes.
|
byte |
short |
int |
long |
Taille (bits) |
8 |
16 |
32 |
64 |
Etendue |
0 .. 255 |
-32768 .. 32767 |
-2^31 .. 2^31-1 |
-2^63 .. 2^63-1 |
Les types numériques décimaux
De même que pour les type numériques, vous avez deux types pour les nombres décimaux, la seule différence résidant dans la taille utilisée pour stocker une valeur de ce type.
|
float |
double |
Size (bits) |
32 |
64 |
Exemple de valeurs |
3.25f |
3.25 |
Le type booléen
On introduit une variable de ce type pas le mot clé boolean. Ce type accepte seulement deux états : l'un est nommé true et symbolise un état d'acceptation, l'autre, nommé false, symbolise un état de réfutation. Attention, ce n'est plus comme en C : le type booléen n'est pas en Java, un sous-type numérique (je rappelle qu'en C, la valeur 0 est considérée comme fausse et les autres valeurs entières comme vraies).
Le type caractère
Ce type, introduit par le mot clé char, permet la gestion des caractères (comme son nom le laisse présager). Jusqu'à présent, la plupart des langages utilisaient à cet effet le codage ASCII. Ce codage permet des représenter seulement 128 caractères : en effet à l'origine, seul les sept bits de poids faibles d'un octet servaient au codage du caractères, le huitième servait alors de bit de parité assurant le bon transport du caractère à travers le réseau. Ensuite, des couches de protocole de transport de données sur le réseau ont rendus ce huitième bit utilisable. Malheureusement aucun standard n'a rendu possible l'utilisation des 128 nouveaux caractères potentiels tout en garantissant une certaine compatibilité. Pour information, nos caractères accentués ne font pas partie du codage ASCII. Pour palier les problèmes engendrés, une nouvelle norme de codage de caractères fut proposée : ce codage est nommé unicode. Ce nouveau standard utilise 16 bits et permet donc de coder 65536 caractères et donc nos caractères accentués, tout comme d'autres caractères provenant d'autres alphabets. Les concepteurs de Java, et ce dans un souci de portabilitée du code produit, ont donc trouvés judicieux d'utiliser ce standard. Les exemples qui suivent vous donne la syntaxe à utiliser pour décrire un caractère en Java.
'a' |
'\t' pour un tab |
'\u0521' un caractère quelconque |
Le type chaîne de caractères
Première remarque, par rapport au langage C, le type chaîne de caractères et totalement différent du type tableau de caractères (la description des tableaux Java se trouve quelques paragraphes plus bas). Pour ce qui est de la syntaxe d'un chaîne de caractères, rien n'a changé par rapport à C ou C++ : une chaîne de caractères commence par un caractère double guillemets et se termine aussi par ce même signe. Ainsi, "Dominique" est une chaîne de caractères. Là ou ca se complique un petit peu, c'est que le type d'un telle valeur est
String, qui est une classe fournie par la machine virtuelle.
Les wrapped classes
Quasiment de même que les chaînes de caractères possède une classe (en fait une chaîne est un objet), tous les types de bases (que l'on vient de passer en revue) possède une classe, dite wrapped classe, qui propose des fonctionnalités sur des élément du type de base considéré. Ces classes seront étudiée dans le chapitre consacré au package java.lang.
Les tableaux
De même que beaucoup d'autres langages, Java permet lui aussi de définir des tableaux. Pour ceux qui ne connaissent pas encore ce concept, on dira qu'un tableau est la succession d'un certain nombre d'éléments d'un type particulier : on peut donc, par exemple, obtenir un tableau (une succession) de dix
float.
Un remarque importante : on peut créer un tableau d'élément de n'importe quel type. Une seconde remarque tout aussi importante (et lourde de conséquence) : un tableau d'élément d'un type donné possède lui aussi un type : le type tableau d'élément du type initial. On peut donc créer des tableaux de tableaux : c'est ce mécanisme qui permet de simuler de tableaux multidimensionnels.
Quelques exemples de définition de tableaux en Java
int monTableau[];
nomTableau = new int[10]; |
un tableau de dix entiers |
int tableau[][] = new tableau[10][]; |
un tableau de dix tableaux d'entiers |
int a, b[]; |
un entier (variable a) et un tableau de dix entiers(variable b) |
int[] monTableau2 = new int[10]; |
un tableau de dix entiers |
int[] a, b[]; |
un tableau d'entier non alloué (variable a) et
un tableau de tableaux d'entiers non alloué (variableb). On voit donc que si l'opérateur [] se trouveavant les variables, il agit alors sur toutes
les variables de la déclaration. |
int a[], b[][]; |
cette déclaration est donc équivalente à
la précédente. |
Si tout ne vous a pas semblé limpide, ce n'est pas trop grave. Nous allons reprendre très clairement tous les points importants pour créer un tableau. Premièrement, vous devez déclarer une variable comme étant de type tableau de quelque chose : en effet, si vous ne le faîte pas, vous ne pourrez plus, ultérieurement, accéder à celui-ci. Pour ce faire, vous devez placer l'opérateur [] dans une déclaration de variable. Deux possibilités sont possibles : soit vous placez l'opérateur immédiatement après le type (et donc devant les variables), soit vous le placez derrière chaque variable. La subtilité tient dans le fait que si vous choisissez la première possibilité, l'opérateur agira sur toutes les variables de la déclaration. Dans le second cas, il agira uniquement sur la variable qui le précède. Dans les deux cas, vous définissez au moins un tableau. Deuxièmement point important, vous devez allouer de la mémoire pour contenir les données de ce tableau. Cela se fait en utilisant l'opérateur new que nous étudierons plus tard. Cet opérateur doit forcément connaître la taille du tableau pour le créer : on la spécifie, placée entre des crochets, directement après la variable. Il est possible de réunir ces deux étapes en une seule opération, comme le montre les exemples précédents.
Il est possible de connaître la taille d'un tableau, ce à tout moment, grâce à l'expression suivante :
variableTableau.length;. Nous reviendrons plus en détail sur la manipulation des tableaux, tout au long de ce cours.
Nous en avons donc finit de la présentation des types de bases du langage. Nous pouvons, par conséquent, passer à l'étude des expressions du langage, qui vont manipuler les types maintenant supposé connus.
|