Upload
catherine-duchesne
View
107
Download
3
Embed Size (px)
Citation preview
Les attributions de
valeur
(le signe “=“)
Dans cette présentation, nous allons tenter de
représenter ce qui se passe dans la mémoire
de l’ordinateur quand un programme
s’exécute.
Parfois, un rectangle rouge apparaîtra en bas
de l’écran : il s’agit de la représentation de la
mémoire de l’ordinateur.
En Java, on appelle type primitif le type
double,
float,
int,
short,
char,
byte,
boolean.
Lorsque l’on déclare un type primitif, une case est
créée en mémoire afin de pouvoir y stocker une
valeur.
int a;
a = 3;
Par exemple, si je fais :
Dans la mémoire, Java va d’abord créer une case
appelée a
3a
puis il va placer la valeur 3 dans cette case.
3a
Si je rajoute une seconde variable dans mon code :
int a, b;
a = 3;b = 4;
A la fin, j’aurai ceci en mémoire :
4b
Lorsque je fais une attribution de valeur (un
« égal ») entre types primitifs, j’effectue une
recopie de la valeur de l’un dans l’autre.
int a, b;
a = 3;b = a;
Par exemple, si je fais :
Voilà ce qui se passe en mémoire :
3a b
recopie
3
Ceci est valable pour les types primitifs.
Pour les autres types de données (tableaux,
structures de données), ça ne fonctionne pas
de la même manière.
3ta
Si je travaille avec des tableaux, voici ce qu’il se passe
:int[] ta, tb;
ta = new int[3];ta[0] = 3;ta[1] = 6;ta[2] = 5;
tb=ta;
tb
ta et tb sont deux tableaux d’entiers.
On construit trois cases sur le tableau ta.
6 5
On remplit les trois cases du tableau ta.
Ici, on dit que ta et tb sont le même
tableau (on ne recopie pas ta dans tb, on
ne créé pas un second tableau).
3ta
Quelle différence fondamentale cela
apporte-t-il ?
int a, b;a = 3;b = a;
int[] ta, tb;ta = new int[3];ta[0] = 3;ta[1] = 6;ta[2] = 5;tb=ta;
tb6 5
Fusionnons les deux codes précédents...
On retrouve en mémoire deux entiers et un
tableau.
3a
3b
tb[1]=9;
On modifie la valeur de b, mais la valeur de a
n’est pas modifiée.
On modifie la valeur de la seconde case de tb,
et comme ta et tb sont le même tableau, ta est
modifié aussi !
b=6;
69
On peut dire que l’on a en mémoire un entier
nommé a, un entier nommé b, et un tableau
avec deux noms : ta et tb.
Lorsque l’on est en présence de types primitifs, une
attribution de valeur (un « égal ») revient à recopier la
valeur de l’un dans l’autre.
En présence de types non primitifs, une attribution de
valeur revient en fait à désigner par deux noms
différents un même objet.
Mais comment faire alors pour recopier le tableau ta
dans tb (et avoir deux tableaux en mémoire) ?
int i;
tb = new int [ ta.length ];
for (i=0; i<tb.length; i=i+1){ tb[i] = ta[i];}
Solution : construire un nouveau tableau sur
tb, et recopier case par case, ta dans tb.
3ta
tb6 5
On construit sur tb un nouveau tableau
d’entiers de la taille de ta.
Puis, on recopie case par case les éléments
de ta dans tb : comme chaque élément de ta
est un entier, le signe « = » effectue bien une
recopie de valeurs.
3 6 5
Rappelez-vous que le signe égal recopie les valeurs dans le cas de types primitifs
(boolean, byte, char, short, int, float, double).
Pour les autres types de données (tableaux,
structures de données), le signe égal fait
pointer la variable sur l’objet en question.