/**
* Un autre exemple du troisième cours portant sur la transmission de
* références.
*/
public class Ex32 {
/*
* Cette fonction échange des données, mais non pas des données qui
* auraient été passées en paramètre, puisque ce n'est pas possible,
* elle échange des données qui sont «ailleurs» mais accessible via
* le paramètre passé. Quand on appelle cette fonction, on lui
* transmet la valeur d'une référence, qui sert à l'initialisation
* de la référence t, laquelle désigne alors une zone de stockage
* existante par ailleurs (probablement dans le tas). On ne
* transmet pas cette zone, on transmet simplement son adresse...
* La modification effectuée dans cette zone est donc observable
* au retour de l'appel!
*/
public static void echange(int []t) {
int tmp = t[0];
t[0] = t[1];
t[1] = tmp;
}
/*
* Ceci est une fonction qui reçoit en paramètre une valeur du type
* référence vers tableau d'entiers, cette valeur sera stockée dans
* le paramètre (la variable locale) de nom t.
*/
public static void f(int []t) {
System.out.println(t+" "+t[0]);
// t désigne maintenant un nouveau tableau
t = new int[2];
// on modifie ce nouveau tableau
t[0] = 111;
// on fait joujou avec ce tableau (voir la fonction echange)
echange(t);
System.out.println(t+" "+t[0]);
// quand on sort t est oubliée (détruite), le tableau se retrouve
// orphelin de référence (il n'y a plus de référence le désignant)
// et est donc recyclé...
}
public static void main(String []args) {
int []tab;
tab = new int[5];
System.out.println(tab+" "+tab[0]);
f(tab);
System.out.println(tab+" "+tab[0]);
tab[0] = 111;
tab[1] = 222;
System.out.println(tab+" "+tab[0]+" "+tab[1]);
echange(tab);
System.out.println(tab+" "+tab[0]+" "+tab[1]);
echange(tab);
System.out.println(tab+" "+tab[0]+" "+tab[1]);
}
}