/** * Programme démontrant la différence entre des variables * de types primitifs et les objets. */ public class Variables { /** * Classe représentant un enregistrement. */ static class Enregistrement { // Champs de l'enregistrement int champ1; double champ2; // Constructeur permettant de créer un enregistrement public Enregistrement (int champ1, double champ2) { this.champ1 = champ1; this.champ2 = champ2; } // Construit une chaîne de caractères représentant l'enregistrement public String toString() { return String.format ("{%d, %f}", champ1, champ2); } } public static void main (String[] args) { int v1 = 12; int v2 = v1; // Affiche v1=12, v2=12 System.out.printf ("v1=%d, v2=%d%n", v1, v2); // Chaque variable de type élémentaire peut être modifiée indépendamment // des autres. Affectation par copie. v1 = 24 / 5; // Attention, donne 4 et non 4.8 // Affiche v1=4, v2=12 System.out.printf ("v1=%d, v2=%d%n", v1, v2); System.out.println(); // Création d'un objet de type Enregistrement Enregistrement e1 = new Enregistrement (5, 2.4); // Création d'une variable e2 de type Enregistrement et // copie de e1 vers e2 par référence. // e1 et e2 se réfèrent au même objet. Enregistrement e2 = e1; // Affiche e1={5, 2.4}, e2={5, 2.4} System.out.printf ("e1=%s, e2=%s%n", e1, e2); // Modification de e1 répercutée sur e2. // Équivalent à e1.champ1 = e1.champ1 / 3; e1.champ1 /= 3; // Donne un entier e1.champ2 /= 3; // Affiche e1={1, 0.8}, e2={1, 0.8} System.out.printf ("e1=%s, e2=%s%n", e1, e2); // Changement de la valeur de e2. // e2 pointe vers un nouvel objet. // e1 et e2 sont maintenant des objets indépendants e2 = new Enregistrement (e1.champ1, e1.champ2); // Modification de e1 e1.champ1 *= 3; e1.champ2 *= 3; // Affiche e1={3, 2.4}, e2={1, 0.8} System.out.printf ("e1=%s, e2=%s%n", e1, e2); // Modifier e1 n'a plus d'impact sur e2 } }