Médiaforma

Java – Un langage orienté objet fin

Print Friendly

Fonction membre constructeur

Dans la version actuelle du programme, les variables rayon et hauteur sont définies par l’intermédiaire de la fonction DefDonnees(). Dans une classe, cette initialisation peut être simplifiée. En effet, lors de la création d’un objet, une fonction membre particulière est exécutée, si elle existe. Cette fonction est appelée constructeur. Elle porte obligatoirement le même nom que la classe.

Pour standardiser la classe Cylindre, nous allons donc placer les instructions de la fonction DefDonnees() dans la fonction constructeur.

public class Cylindre {
  static private double rayon;
  static private double hauteur;

public Cylindre(double r, double h) {
    rayon = r;
    hauteur = h;
  };

  static double LitRayon() {
    return rayon;   // Le rayon est retourné par la fonction publique
  }

  static double LitHauteur() {
    return hauteur;   // La hauteur est retournée par la fonction publique
  }


  static public double Calcule()
  {
    return 3.1415 * rayon * rayon * hauteur;
  }
}

Dans la fonction main(), l’initialisation de l’objet peut maintenant se faire pendant son instanciation :

Cylindre Cyl = new Cylindre(4.6, 12.0);

L’utilisation d’un constructeur simplifie grandement le programme :

public class Calcul {
  public static void main(String args[])
  {
    Cylindre Cyl = new Cylindre(4.6, 12.0);
    System.out.println("Volume du cylindre : " + Cyl.Calcule());
  }
}

Surcharger un constructeur

De la même façon que pour une méthode, un constructeur peut être surchargé. On parle parfois du « polymorphisme des constructeurs ». Dans l’exemple suivant, un objet de type Cylindre peut être créé en passant zéro ou deux arguments. Si aucun argument n’est passé, le rayon et la hauteur sont initialisés à la valeur 1. Si deux arguments sont passés, ils sont utilisés pour initialiser les variables rayon et hauteur.

public class Cylindre{
  static private double rayon;
  static private double hauteur;

public Cylindre() {
    rayon = 1;
    hauteur = 1;
  };

public Cylindre(double r, double h) {
    rayon = r;
    hauteur = h;
  };

  static double LitRayon() {
    return rayon;   // Le rayon est retourné par la fonction publique
  }

  static double LitHauteur() {
    return hauteur;   // La hauteur est retournée par la fonction publique
  }

  static public double Calcule()
  {
    return 3.1415 * rayon * rayon * hauteur;
  }
}

Voici une nouvelle version du programme Calcul :

public class Calcul {
  public static void main(String args[]) {
    Cylindre Cyl1 = new Cylindre();  // L'objet Cylindre Cyl1 est défini sans arguments
    System.out.println("Volume du cylindre Cyl1 : " + Cyl1.Calcule());

    Cylindre Cyl2 = new Cylindre(4.6, 12.0);  // L'objet Cylindre Cyl2 est défini avec arguments
    System.out.println("Volume du cylindre Cyl2 : " + Cyl1.Calcule());
  }
}

Le premier bloc d’instructions définit l’objet Cylindre Cyl1 sans fournir d’arguments au constructeur, puis affiche le volume du cylindre correspondant :

Cylindre Cyl1 = new Cylindre();
System.out.println("Volume du cylindre Cyl1 : " + Cyl1.Calcule());

Le second bloc d’instructions définit l’objet Cylindre Cyl2 en fournissant deux arguments au constructeur, puis affiche le volume du cylindre correspondant :

Cylindre Cyl2 = new Cylindre(4.6, 12.0);
System.out.println("Volume du cylindre Cyl2 : " + Cyl1.Calcule());

Voici le résultat :

 

Ce programme illustre la nature orientée objet du langage Java : deux objets de type Cylindre sont définis et manipulés sans aucune interaction dans le même programme. Il montre également à quel point l’utilisation d’une classe simplifie la fonction main() et améliore sa lisibilité.

Fonction membre destructeur

Vous savez maintenant que la fonction membre constructeur est automatiquement exécutée lors de la définition d’un objet. De la même manière, si elle existe, une fonction membre destructeur est automatiquement exécutée lorsqu’un objet est détruit. Le nom de la fonction destructeur est toujours finalize().

Voici un exemple :

public class Cylindre {
  static private double rayon;
  static private double hauteur;

public Cylindre() {
    // Fonction membre constructeur sans argument
    rayon = 1;
    hauteur = 1;
  };

public Cylindre(double r, double h) {
    // Fonction membre constructeur avec deux arguments
    rayon = r;
    hauteur = h;
  };

  static public double Calcule() {
    return 3.1415 * rayon * rayon * hauteur;
  }

  public void finalize() {
    // Fonction membre destructeur
  };
}

La fonction membre destructeur est généralement utilisée pour optimiser la disparition d’un objet et de toutes les entités dont il s’est servi pendant son temps de vie. Il faut cependant noter qu’elle n’est pratiquement jamais utilisée, car Java se débrouille très bien tout seul en ce qui concerne la libération de mémoire…

Vous avez aimé cet article ? Partagez-le avec vos réseaux...
 
Comments

No comments yet.

Leave a Reply