Académique Documents
Professionnel Documents
Culture Documents
Une classe abstraite est quasiment identique à une classe normale. Cela dit, elle a tout
de même une particularité : vous ne pouvez pas l'instancier !
C’est une classe qu’on ne peut pas directement instancier car certaines de ses méthodes ne sont
pas implémentées. Une classe abstraite peut donc contenir des variables, des méthodes
implémentées et des signatures de méthode à implémenter
Imaginons que nous ayons une classe A déclarée abstraite. Voici un code qui ne
compilera pas :
Nous avons bien notre classe mère Animal et nos animaux qui en héritent. Vu que notre
classe Animal est public, qu'est censé faire un objet Animal ? Quel est son poids, sa couleur,
que mange-t-il ?
c. Généralisation de l’exemple :
Nous voyons bien que notre classe Animal est déclarée abstraite et que nos classes filles
héritent de celle-ci. De plus, nos classes filles ne redéfinissent que deux méthodes sur quatre, on en
conclut donc que ces deux méthodes doivent être abstraites. Nous ajouterons deux constructeurs à nos
classes filles : un par défaut et un autre comprenant les deux paramètres d'initialisation. À cela, nous
ajouterons aussi les accesseurs d'usage. Mais il est possible aussi de faire autrement. Vu les animaux
présents, nous aurions pu faire une sous-classe Carnivore, ou encore
« AnimalDomestique» et « AnimalSauvage»… Ici, nous allons nous contenter de faire deux sous-
classes : « Canin » et « Félin », qui hériteront d'Animal et dont nos objets eux-mêmes hériteront.
Animal.java
Felin.java
Canin.java
Chien.java
public Chien(){
void crier() {
System.out.println("J'aboie sans raison !");
}
}
Loup.java
public Loup(){
void crier() {
System.out.println("Je hurle à la Lune en faisant ouhouh !");
}
}
Lion.java :
public Lion(){
void crier() {
System.out.println("Je rugis dans la savane !");
}
}
Tigre.java :
public Tigre(){
}
public Tigre(String couleur, int poids){
this.couleur = couleur;
this.poids = poids;
}
void crier() {
System.out.println("Je grogne très fort !");
}
}
Chat .java
public Chat(){
}
public Chat(String couleur, int poids){
this.couleur = couleur;
this.poids = poids;
}
void crier() {
System.out.println("Je miaule sur les toits !");
}
}
Programmme main() :
Une interface est un type, au même titre qu’une classe, mais abstrait et qui donc ne peut
être instancié (par appel à new plus constructeur). Une interface décrit un ensemble de
signatures de méthodes, sans implémentation, qui doivent être implémentées dans toutes les
classes qui implémentent l’interface. L’utilité du concept d’interface réside dans le
regroupement de plusieurs classes, tel que chacune implémente un ensemble commun de
méthodes, sous un même type. Une interface possède les caractéristiques suivantes :
a. Exemple : L'architecture que nous avons développée avec les classes abstraites forme une
bonne base. Mais, que se passerait-il si on ajoute une contrainte qui dit que nos chiens
devront apprendre à faire de nouvelles choses telles que :
• faire le beau ;
• faire des câlins ;
Dans ce cas vous allez vous rendre compte que vous obtiendrez des lions, des tigres, des loups
et des chats qui auront la possibilité de faire le beau ? c’est bon pour le chat mais pas possible pour les
autres.
2ème solution : Ajouter ces méthodes dans les classes « Chien » et « Chat ».
C’est possible comme solution mais si vous faites cela, adieu au polymorphisme !.
Mais dans ce cas on va faire de l’héritage multiple qui est déjà interdit par java !!!
La solution consiste donc à développer un nouveau supertype et s'en servir dans nos classes
« Chien » et « Chat ». Ceci est possible grâce aux interfaces.
En fait, les interfaces permettent de créer un nouveau supertype ; on peut même en ajouter
autant que l'on le veut dans une seule classe ! Quant à l'utilisation de nos objets, la convention
est toute trouvée. Pourquoi ? Parce qu'une interface n'est rien d'autre qu'une classe 100 %
abstraite.
Vu qu'une interface est une classe 100 % abstraite, il ne reste qu'à y ajouter des méthodes
abstraites, mais sans le mot clé abstract. Voici des exemples :
public interface I{
public void A();
public String B();
}
}
Et pour faire en sorte qu'une classe utilise une interface, il suffit d'utiliser le mot clé implements.
Ce qui nous donnerait :
Nous allons créer l'interface domestique pour ensuite l'implémenter dans nos objets Chiens et
chats.
Sous NetBeans, vous pouvez faire File > New > Interface :
public Chien(){
}
public Chien(String couleur, int poids){
this.couleur = couleur;
this.poids = poids;
}
void crier() {
System.out.println("J'aboie sans raison !");
}
public Chat(){
}
public Chat(String couleur, int poids){
this.couleur = couleur;
this.poids = poids;
}
void crier() {
System.out.println("Je miaule sur les toits !");
}
Remarque : L'ordre des déclarations est primordial. Vous devez mettre l'expression d'héritage
avant l'expression d'implémentation, sinon votre code ne compilera pas.
Voici un code que vous pouvez utiliser pour tester le polymorphisme de notre implémentation :
}
}
Objectif atteint ! Nous sommes parvenus à définir deux superclasses afin de les utiliser comme
supertypes et de jouir pleinement du polymorphisme.
Annexe :
Exemple de classe abstraite : Classe Object
En Java, la racine de l’arbre d’héritage des classes est la classe java.lang.Object. Toutes
les classes héritent de la classe Object :