Exercice POO de base - trouver les erreurs

But:
Trouver l'erreur dans un programme donné
Thème:
POO de base
Fichiers:
Erreurs.java

Le fichier Erreurs.java contient les déclarations de deux classes. La classe Erreurs contient une méthode main et sert à démarrer le programme. La classe GrillePain sert à représenter des grille-pains dans le programme sous forme d'objets dotés de deux variables d'instance: l'année de fabrication et le nombre de tranches que l'appareil peut griller. Il y a également une méthode d'instance afficherVariables que l'on peut appliquer sur un objet de type GrillePain afin d'afficher les valeurs de ses variables d'instance.

  1. Eclipse vous signale des messages d'erreurs à propos de ce programme. Pourquoi? Corrigez-les.
  2. L'affichage lors de l'exécution montre que la variable d'instance nbTranches a la valeur 0 pour les deux grille-pains même si l'on a envoyé une autre valeur à la méthode constructeur. Pourquoi? Corrigez le programme.

Exemple d'exécution du programme (après la première correction):

Objet de type GrillePain avec variables d'instance annee = 1995 et nbTranches = 2Objet de type GrillePain avec variables d'instance annee = 1998 et nbTranches = 4

Code donné:

Erreurs.java
12345678910111213141516171819202122class Erreurs { public static void main(String[] args) { GrillePain g1 = new GrillePain(1995, 2); g1.afficherVariables(); GrillePain g2 = new GrillePain(1998, 4); g2.afficherVariables(); }}class GrillePain { private int annee; private int nbTranches; private GrillePain(int a, int nbTranches) { annee = a; nbTranches = nbTranches; } private void afficherVariables() { System.out.println ("Objet de type GrillePain avec variables d'instance année = " + annee + " et nbTranches = " + nbTranches); }}
Fichiers:
Erreurs.java
    1. Le programmeur a trop utilisé le mot-clé private au point que l'on ne peut même pas accéder à la méthode constructeur depuis l'extérieur de la classe, ni à la méthode afficherVariables(). Il faut rendre ces deux méthodes publiques en supprimant le mot-clé private.
  1. Les variables d'instance (mais pas les variables locales) reçoivent toujours des valeurs par défaut. Si la variable d'instance nbTranches n'est pas initialisée, elle aura donc la valeur 0. Dans la méthode constructeur, il y a une situation de shadowing où le paramètre a le même nom que la variable d'instance. Il faut utiliser l'objet this pour différencier les deux et ainsi affecter la valeur du paramètre nbTranches à la variable d'instance nbTranches.
Erreurs.java
12345678910111213141516171819202122232425/* Version corrigée */class Erreurs { public static void main (String[] args) { GrillePain g1 = new GrillePain(1995, 2); g1.afficherVariables(); GrillePain g2 = new GrillePain(1998, 4); g2.afficherVariables(); }}class GrillePain { private int annee; private int nbTranches; public GrillePain (int a, int nbTranches) { // !!! pas de private annee = a; this.nbTranches = nbTranches; // !!! this } public void afficherVariables() { // !!! pas de private System.out.println ("Objet de type GrillePain avec variables d'instance année = " + annee + " et nbTranches = " + nbTranches); }}
Article publié le 17 Août 2010 Mise à jour le Samedi, 17 Décembre 2022 18:00 par GC Team