Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Développement informatique
  3. L'héritage
Extrait - Développement informatique Apprenez à concevoir avant de programmer
Extraits du livre
Développement informatique Apprenez à concevoir avant de programmer
3 avis
Revenir à la page d'achat du livre

L'héritage

Objectifs du chapitre

Les objectifs de ce chapitre sont :

  • Concevoir des applications en utilisant le diagramme de classes UML.

  • Développer des applications en utilisant l’héritage, les classes abstraites et les interfaces.

Ces notions sont présentées à partir d’exemples.

Héritage, polymorphisme

1. Classe Cercle

a. Propriétés et méthodes de la classe Cercle

Un cercle est défini par son centre et son rayon :


public class Cercle 
{  
    private Point centre; 
    private int rayon; 
 
    public Cercle(Point centre, int rayon) 
    { 
        this.centre = centre; 
        this.rayon = rayon; 
    }
 

Un objet de la classe java.awt.Point représente les coordonnées (x,y) d’un point. Les valeurs x et y permettent de localiser un point, par rapport à une origine (0, 0). Cette origine désigne le coin supérieur gauche de l’espace dans lequel le point est localisé.

La classe Cercle possède :

  • les propriétés centre et rayon,

  • des méthodes qui simulent le déplacement graphique d’un cercle. Le déplacement d’un cercle consiste à l’effacer, puis à le déplacer et enfin à l’afficher à la nouvelle position. Les trois méthodes sont :

  • efface()

  • deplace()

  • affiche()

Faute d’avoir abordé la programmation graphique, les méthodes efface() et affiche() se contentent d’une impression dans la console.


    public void affiche() 
    { 
        System.out.println("Affichage du cercle  : " + this); 
    } 
 
    public void efface() 
    { 
        System.out.println("Effacement du cercle : " + this); 
    } 
 
    public void deplace(Point nouveauCentre) 
    { 
        efface(); 
        centre = nouveauCentre; 
        affiche(); 
    }
 
  • Une méthode toString() pratique pour l’affichage :


    public String toString() 
    { 
        return centre.x + ", " + centre.y + ", rayon " + rayon; 
    } 
}
 

b. Programme de test

Le programme de test est le suivant :


import java.awt.Point; 
 
public class TestCercle 
{ 
    public static void main(String...

Travail pratique : Animal

1. Objectif

L’objectif est de manipuler les concepts d’héritage et de polymorphisme.

2. Sujet

Créer une classe Animal.

Propriétés

  • un booleen vivant (vrai si l’animal est vivant, faux sinon) ;

  • un entier age (âge de l’animal) ;

  • un entier nombreAnimauxVivants (nombre d’animaux vivants) ;

  • un entier ageMaximum (âge maximum d’un animal).

Méthodes

  • Constructeur d’initialisation (Animal(int age)).

  • vieillir() : fait vieillir l’animal d’un an.

  • mourir() : fait mourir l’animal.

  • crier() : fait crier l’animal (l’animal criera : « Je suis un animal ! »).

Créer une classe Vache héritant de Animal.

  • Une vache crie « Meuh ! »

  • Elle possède aussi une propriété ageMaximum (âge maximum d’une vache).

Pour effectuer vos tests, utilisez le programme qui suit (tant que des animaux sont vivants, on les fait crier et vieillir) :


public class TestAnimal 
{ 
    public static void main(String argv[]) 
    { 
        Animal tableAnimal[] = new Animal[2]; 
        int iAnimal; 
 
        tableAnimal[0] = new Vache(1); 
        tableAnimal[1] = new Animal(2); 
 
        while (Animal.getNombreAnimauxVivants() > 0) 
        { 
            for (iAnimal = 0; iAnimal < 2; iAnimal++) 
            { 
                if (tableAnimal[iAnimal].getVivant()) 
                { 
                    tableAnimal[iAnimal].crier(); 
          ...

Classes abstraites

1. Définition

Une classe abstraite ne peut être instanciée.

Exemple


public class TestAbstract 
{ 
   public static void main(String argv[]) 
   { 
      A a; 
      a = new A(); 
   } 
}
 


public abstract class A 
{ 
}
 
images/02064a.png

S’il est impossible d’instancier une classe abstraite, on ne peut l’utiliser autrement que par l’intermédiaire de classes héritières.

Ainsi, dans le TP Animal, on sent bien qu’une instance de la classe Animal est artificielle. Quel cri lui faire pousser ? Définir la classe Animal en abstract a l’avantage d’empêcher ces instanciations artificielles. Mais il y a d’autres avantages... Voyons-les sur notre exemple...

2. Exemple du TP Animal

a. Suppression de la propriété ageMaximum de la classe Animal

Dans le TP Animal, certaines propriétés et méthodes de la classe Animal sont artificielles.

Exemples

  • ageMaximum : fixer un ageMaximum pour tous les animaux est illogique. Il est plus judicieux de le définir pour chaque classe héritière de Animal.

  • crier() : la méthode crier() n’a guère de sens dans la classe Animal.

Dans la classe Animal, supprimons la propriété ageMaximum :

images/02064b.png

Aussitôt, une erreur de compilation se produit sur la méthode getAgeMaximum()...

Interfaces

1. Présentation

Une interface est une classe abstraite dont toutes les méthodes sont abstraites. 

Une interface peut aussi avoir des propriétés de classe constantes (static final), mais c’est plus rare. Elles peuvent même, depuis Java SE 8, proposer du code par défaut pour les méthodes.

2. Exemple d’interfaces


public interface Formidable 
{ 
    public void methodeFormidable(); 
}
 


public interface Admirable 
{ 
    public void methodeAdmirable1(); 
    public void methodeAdmirable2(); 
}
 

Il n’est pas nécessaire de mettre le mot-clé abstract aux méthodes d’une interface.

3. Implémentation d’interfaces

Une classe peut hériter d’une interface comme elle peut hériter d’une autre classe. Elle utilise pour cela le mot-clé implements. On dit que la classe implémente une interface.

La classe qui implémente une interface doit redéfinir toutes les méthodes de l’interface. À défaut, c’est une classe abstraite.

Exemple


public class ClasseFille implements Formidable, Admirable 
{ 
    public void methodeFormidable() 
    { 
        System.out.println("methodeFormidable()"); 
    } 
 
    public...

Travail pratique : surfaces comparables

1. Objectif

Il s’agit ce concevoir et développer une application avec utilisation des classes abstraites et des interfaces.

2. Sujet

Reprendre l’application TestComparableTableau de la section précédente, qui permet de trier des tableaux contenant des références d’objets de type Comparable (qui implémentent l’interface Comparable).

Écrivez le code nécessaire pour trier des objets représentant des figures géométriques (cercles, rectangles, triangles) par ordre de surface croissante, en utilisant sans modification la classe TriBulleTableau.

Exemple de résultat voulu :

images/02066a.png

La classe principale de l’application est la suivante :


import utilitairesMG.divers.TriBulleTableau; 
 
public class TestSurfaceComparable 
{ 
    public static void main(String argv[]) 
    { 
        Figure tabFigures[] = 
        { 
            new Triangle(6, 2), 
            new Cercle(4), 
            new Rectangle(7, 9), 
            new Triangle(6, 17), 
            new Cercle(3), 
            new Triangle(6, 7), 
        ...

La visibilité

Toutes les classes de cet ouvrage sont déclarées public. C’est une bonne pratique. Une classe publique peut être utilisée dans toute autre classe. Quand on omet le mot-clé public dans la déclaration d’une classe, elle n’est utilisable (visible) que par les classes du même package.

Le programme source d’une classe publique Xxx doit être dans un fichier appelé Xxx.java. Il ne peut donc y avoir qu’une classe publique par fichier source. C’est une obligation qui facilite l’organisation des fichiers et des classes.

Toutes les propriétés de cet ouvrage sont déclarées private. Presque toutes les méthodes sont déclarées public. C’est un choix de programmation. Il est possible de déclarer n’importe quel membre d’une classe (propriété, méthode, classe interne) en public et private.

Un membre private n’est utilisable que dans la classe qui le déclare.

Un membre public est utilisable dans n’importe quelle classe.

Le mot-clé protected permet d’utiliser un membre dans la classe qui le déclare, dans les classes héritières, et dans les classes du même package.

L’absence de mot-clé (souvent un oubli) déclare un membre de package, visible dans toutes les classes du même package.

1. Visibilité...