Adloun

programmation Java (école d'ingénieur) · Chapitre 5 · Application directe du cours

Prédire l'affichage

Tableaux · niveau 2

Énoncé

Sans l'exécuter, prédire ce qu'affiche ce programme. Faire un schéma de la pile et du tas au moment où f se termine.


import java.util.Arrays;

public class PredireRef {

    static void f(int[] t, int x) {
        t[0] = t[0] + x;
        x = x + 1;
        t = new int[] {7, 7};
        t[1] = x;
    }

    public static void main(String[] args) {
        int[] a = {1, 2};
        int[] b = a;
        int x = 10;
        f(b, x);
        System.out.println(Arrays.toString(a) + " " + x);
        b = new int[] {1, 2};
        System.out.println((a == b) + " " + Arrays.equals(a, b));
    }
}

Corrigé

Le programme affiche :


[11, 2] 10
false false

À l'appel f(b, x), le paramètre t reçoit une copie de la référence de b, qui est aussi celle de a : les trois désignent le tableau {1, 2}. L'instruction t[0] = t[0] + x modifie ce tableau, qui devient {11, 2}. Ensuite, x = x + 1 modifie la copie locale de x (), pas celle de main (). Enfin, t = new int[] {7, 7} fait pointer t vers un nouveau tableau, que t[1] = x transforme en {7, 11} : ce tableau est perdu à la fin de f, aucune variable de main ne le désigne.

À la fin de f, le tas contient donc deux tableaux : {11, 2}, désigné par a et b (et par rien d'autre une fois f terminée), et {7, 11}, qui n'est plus désigné par aucune variable. Java le récupérera automatiquement : c'est le rôle du ramasse-miettes.

Dernière ligne : b désigne maintenant un nouveau tableau {1, 2} ; a == b est faux (deux tableaux distincts), et Arrays.equals(a, b) aussi, puisque a contient {11, 2}.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →