Les attributions de valeur (le signe =). Dans cette présentation, nous allons tenter de...

Preview:

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.

Recommended