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 lordinateur quand un programme sexécute. Parfois, un rectangle rouge apparaîtra en bas de lécran : il sagit de la représentation de la mémoire de lordinateur.
En Java, on appelle type primitif le type double, float, int, short, char, byte, boolean.
Lorsque lon 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 dabord créer une case appelée a 3 a puis il va placer la valeur 3 dans cette case.
3 a Si je rajoute une seconde variable dans mon code : int a, b; a = 3; b = 4; A la fin, jaurai ceci en mémoire : 4 b
Lorsque je fais une attribution de valeur (un « égal ») entre types primitifs, jeffectue une recopie de la valeur de lun dans lautre. int a, b; a = 3; b = a; Par exemple, si je fais : Voilà ce qui se passe en mémoire : 3 a 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.
3 ta Si je travaille avec des tableaux, voici ce quil 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 dentiers. On construit trois cases sur le tableau ta. 65 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).
3 ta 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; tb 65 Fusionnons les deux codes précédents... On retrouve en mémoire deux entiers et un tableau. 3 a 3 b tb[1]=9; On modifie la valeur de b, mais la valeur de a nest 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; 6 9 On peut dire que lon a en mémoire un entier nommé a, un entier nommé b, et un tableau avec deux noms : ta et tb.
Lorsque lon est en présence de types primitifs, une attribution de valeur (un « égal ») revient à recopier la valeur de lun dans lautre. 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. 3 ta tb 65 On construit sur tb un nouveau tableau dentiers 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. 365
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 lobjet en question.