2.1. Java 2 et la programmation
orientée objet ( POO )



Plan de ce chapitre:   ...........retour au plan général
Rappels des fondements de  la POO
 

1. Les classes Java : des nouveaux types

    1.1 Déclaration d'une classe
    1.2 Une classe est un type Java
    1.3 Toutes les classes ont le même ancêtre - héritage
    1.4 Encapsulation des classes
    1.5 Exemple de classe intégrée dans une autre classe
    1.6 Exemple de classe inclue dans un package
    1.7 Méthodes abstraites
    1.8 Classe abstraite,  Interface


2. Les objets : des références

    2.1 Modèle de la référence et machine Java

    2.2 Les constructeurs d'objets
    2.3 Utilisation du constructeur d'objet par défaut
    2.4 Utilisation d'un constructeur d'objet personnalisé
    2.5 Le mot clef this


3. Variables et méthodes

    3.1 Variables dans une classe en général
    3.2 Variables et méthodes d'instance
    3.3 Variables et méthodes de classe - static
    3.4 Surcharge et polymorphisme
    3.5 Le mot clef super
    3.6 Modification de visibilité
    3.7 Interfaces Java




Nous proposons des comparaisons entre les syntaxes Delphi et Java lorsque les définitions sont semblables.

1. Les classes : des nouveaux types
 

•    Une classe abstraite est une classe qui ne peut pas être instanciée.
•    Une classe abstraite peut contenir des méthodes déjà implémentées.
•    Une classe abstraite peut contenir des méthodes non implémentées.
•    Une classe abstraite est héritable.
•    On peut contsruire une hiérarchie de classes abstraites.
•    Pour pouvoir construire un objet à partir d'une classe abstraite, il faut dériver une classe non abstraite en une classe implémentant toutes les méthodes non implémentées.
Delphi
Java
Vehicule = class
  public

      procedure Demarrer; virtual; abstract;
      procedure RépartirPassagers; virtual;
      procedure PériodicitéMaintenance; virtual;
 end;

abstract class ClasseA  {
  public abstract void Demarrer( );
  public void RépartirPassagers( );
  public void PériodicitéMaintenance( );
  }

Une classe abstract ne peut pas être instanciée directement, seule une classe dérivée (sous-classe) qui redéfinit obligatoirement toutes les méthodes abstract de la classe mère peut être instanciée. 


  •    La classe Véhicule est abstraite, car la méthode Démarrer est abstraite et sert de "modèle" aux futurs classes dérivant de Véhicule, c'est dans les classes voiture, voilier et croiseur que l'on implémente le comportement précis du genre de démarrage.

•    Notons au passage que dans la hiérarchie précédente, les classes vehicule Terrestre et Marin héritent de la classe Véhicule, mais n'implémentent pas la méthode abstraite Démarrer, ce sont donc par construction des classes abstraites elles aussi.

class  Croiseur  extends  Marin 

 public void  Demarrer ( )  {   …   
 public void  RépartirPassagers ( )  {   …    }
}


Code Java
Explication

La classe ManyConstr possède 2 constructeurs :

Le premier :  ManyConstr (String s)

Le second : ManyConstr (char c, String s)

Grâce à l’instruction this(s), le second constructeur appelle le premier sur la variable s, puis concatène le caractère char c au champ String ch.



La méthode main instancie un objet de classe ManyConstr avec le second constructeur et affiche le contenu du champ String ch. De l’objet ;

Résultat de l’exécution :

   chaine//x


3.7 Interfaces Java
 


Vocabulaire et concepts :
 
  • Une interface est un contrat, elle peut contenir des propriétés, des méthodes et des événements mais ne doit contenir aucun champ ou attribut
  • Une interface ne peut pas contenir des méthodes déjà implémentées.
  • Une interface doit contenir des méthodes non implémentées.
  • Une interface est héritable.
  • On peut contsruire une hiérarchie d'interfaces.
  • Pour pouvoir construire un objet à partir d'une interface, il faut définir une classe non abstraite implémentant toutes les méthodes de l'interface.
 

Une classe peut implémenter plusieurs interfaces. Dans ce cas nous avons une excellente alternative à l'héritage multiple.

Lorsque l'on crée une interface, on fournit un ensemble de définitions et de comportements qui ne devraient plus être modifiés. Cette attitude de constance dans les définitions, protège les applications écrites pour utiliser cette interface.

Les variables de types interface respectent les mêmes règles de transtypage que les variables de types classe. 

Les objets de type classe clA peuvent être transtypés et reférencés par des variables d'interface IntfA dans la mesure où la classe clA implémente l’interface IntfA. (cf. polymorphisme d'objet)
 

Si vous voulez utiliser la notion d'interface pour fournir un polymorphisme à une famille de classes, elles doivent toutes implémenter cette interface, comme dans l'exemple ci-dessous.

Exemple :

l'interface Véhicule  définissant 3 méthodes (abstraites) Démarrer, RépartirPassagers de répartition des passagers à bord du véhicule (fonction de la forme, du nombre de places, du personnel chargé de s'occuper de faire fonctionner le véhicule...), et PériodicitéMaintenance renvoyant la périodicité de la maintenance obligatoire du véhicule (fonction du nombre de km ou miles parcourus, du nombre d'heures d'activités,...)

Soit l'interface Véhicule définissant ces 3 méthodes :

Soient les deux classes Véhicule terrestre et Véhicule marin, qui implémentent partiellemnt chacune l'interface Véhicule , ainsi que trois classes voiture, voilier et croiseur héritant de ces deux classes :

Dans cette vision de la hiérarchie on a supposé que les classes abstraites Véhicule terrestre et Véhicule marin savent comment  répartir leur éventuels passagers et quand effectuer une maintenance du véhicule.

Les classes voiture, voilier et croiseur , n'ont plus qu'à implémenter chacune son propre comportement de démarrage.

Syntaxe de l'interface en Delphi et en Java (C# est semblable à Java) :
 
Delphi Java 
Vehicule = Interface
      procedure Demarrer; 
      procedure RépartirPassagers; 
      procedure PériodicitéMaintenance; 
end;
Interface Vehicule  {
  void Demarrer( );
  void RépartirPassagers( );
  void PériodicitéMaintenance( );
}



Utilisation pratique des interfaces

Quelques conseils prodigués par des développeurs professionnels (microsoft, Borland) :

Exemple de hiérarchie à partir d'une interface


Dans cet exemple :

Les méthodes RépartirPassagers, PériodicitéMaintenance et Demarrer sont implantées comme des méthodes à liaison dynamique afin de laisser la possibilité pour des classes enfants de surcharger ces méthodes.

Soit l'écriture en Java de cet exemple :
Java 
interface IVehicule{
       void Demarrer( ); 
       void RépartirPassager( ); 
       void PériodicitéMaintenance( ); 
   }

    abstract class Terrestre  implements IVehicule {
       public void RépartirPassager( ){..........};
       public void PériodicitéMaintenance( ){..........}; 
   }

    class Voiture extends Terrestre {
       public void Demarrer( ){..........}; 
   }

    abstract class Marin implements IVehicule {
       public void RépartirPassager( ){..........};
       public void PériodicitéMaintenance( ){..........}; 
   }
 
    class Voilier extends Marin {
       public void Demarrer( ){..........}; 
   }
    class Croiseur extends Marin {
       public void Demarrer( ){..........}; 
   }