Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Les classes abstraites et l'héritage en java

Par Alan TOUSSAINT Publié le 10/05/2019 à 17:39:59 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Introduction

Dans cet article nous allons voir les classes abstraite en java, leur définition, leurs cas d'usages ainsi que quelques exemples d'implémentations. Ici, nous allons partir du principe que vous avez de bonnes bases en programmation, c'est à dire que vous savez ce qu'est la POO (Programmation Orienté Objet), que vous savez donc construire une classe, que la notion d'instanciation et de déclaration d'objets vous est familier et que vous avez déjà une idée de ce qu'est la notion d'héritage. Si ce n'est pas le cas je vous invite à vous renseigner par vous-même, c'est très important en informatique, surtout dans un domaine qui évolue aussi vite que la programmation.


    

Les classes abstraites qu'est-ce que c'est ?

Les classes abstraites, sont une notion essentiel de la programmation orienté objet (POO), elles sont quasiments identiques aux classes que vous avez l'habitude de coder, à la différence près que vous ne pouvez les instanciers. Oui oui, vous avez bien lu, une classe que vous ne pouvez pas instancier ! Cela signifie que vous ne pourrez pas créer d'objets directement à partir du modèle de cette classe. Mais alors, vous allez me demander, à quoi peut bien servir une classe qu'on ne peut instancier ? La réponse est très simple. C'est pour des raisons de productivité et de scalabilité. En effet, en programmation on est toujours à la recherche de nouvelles méthodes afin de simplifier l'écriture du code, son organisation et sa maintenance. C'est pour répondre à ces besoins que la POO à été créé, et c'est pour les mêmes raisons qu'on a créé les classes abstraites. En fait, il s'agit ni plus ni moins qu'une "classe mère", c'est à dire, une classe qui va servir de modèle à une autre classe, on parle ici de notion d'héritage. L'interêt est d'avoir un jeu de données structuré et beaucoup plus clair à maintenir et à agrandir, faire des héritages ne changera pas vraiment l'expérience de l'utilisateur mais changera pour sûr l'expérience du développeur ainsi que de ceux qui vont maintenir le code plus tard. Dans la notion d'héritage, toutes les classes filles vont hériter des attributs et des méthodes de la classe mère et vont pouvoir les surcharger afin d'avoir leur propre fonctionnement et leur propre jeu de données, ainsi les classes ont leurs propres spécificités mais sont toutes constuites autour de mêmes modèles qui permettent de les catégoriser. Une classe abstraite est donc dans la notion d'héritage une classe mère mais qu'on ne peut pas instancier. C'est toujours flou ? Voyons un exemple un peu plus parlant ci-dessous.


    

Un exemple de classe abtraite

Contexte

Imaginons maintenant que nous créons un programme permettant de gérer différents animaux, oui l'exemple est bateau mais a le mérite d'être facile à comprendre. Dans ce programme il y aura des chiens, des cochons des tigres ect.. Tous ces animaux ont un point commun... Ils sont tous des animaux (merci captain obvious) ! Et qui dit point commun dit donc héritage. Les classes chien, cochon et tigre vont donc hériter d'une même classe que l'on nommera Animal et vont hériter des mêmes propriétés et méthodes. En effet, ces animaux ont tous un identifiant, un poid, ainsi que pourquoi pas une couleur et un sexe. Ces animaux peuvent, en plus, tous se déplacer et crier.

Cas pratique

Ici la classe déclaré dans le code comme "abstract" sera la classe Animal, elle sera la classe mère et n'aura donc pas besoin d'être instancié, elle servira de modèle pour ses classes filles qui hériteront de ses propriétés identifiant, poid, sexe, couleur et de ses méthodes seDeplacer() et crier(). Une classe abstraite se déclare comme une classe normale à quelques petites différences près :

                abstract class Animal{
				protected String id;
				protected float poids;
				protected boolean sexe;
				protected String couleur;
				
				abstract void crier();
				abstract void seDeplacer();
				}
            

Comme vous pouvez le constater, une classe abstract se déclare presque comme les classes que vous avez l'habitude de manipuler sauf qu'elles se déclarent avec le mot clé "abstract". De plus ses méthodes n'ont pas de corps, car celui-ci va être propre à chaque classe fille et donc surchargées par celles-ci, tout comme le contenu de ses propriétés. A noter qu'il ne faut pas oublier le point-virgule à la fin de la déclaration de chaque méthodes. Il est bon de préciser aussi que les propriétés se déclarent avec le mot clé protected ou public afin de les rendre accéssibles aux classes enfants. Et dans ces classes enfants nous auront donc :

                public class Chien extends Animal{
				protected String id;
				protected float poids;
				protected boolean sexe;
				protected String couleur;
				
				abstract void crier(){
					System.out.println("Whouf !");
				}
				
				abstract void seDeplacer(){
					System.out.println("Je cours à 20 km/h !");
				}
				}
            
                public class Cochon extends Animal{
				protected String id;
				protected float poids;
				protected boolean sexe;
				protected String couleur;
				
				abstract void crier(){
					System.out.println("Groin !");
				}
				
				abstract void seDeplacer(){
					System.out.println("Je cours à 10 km/h !");
				}
				}
            
                public class Tigre extends Animal{
				protected String id;
				protected float poids;
				protected boolean sexe;
				protected String couleur;
				
				abstract void crier(){
					System.out.println("Grrr !");
				}
				
				abstract void seDeplacer(){
					System.out.println("Je cours à 60 km/h !");
				}
				}
            

Ainsi, les méthodes sont surchargées lors de l'instanciation des classes enfants alors que les propriétés sont valorisées lors de l'instanciation des objets comme avec n'importe quelle classe. Attention, je n'ai pas mis les accesseurs, les propriétes de ces classes ne seront donc pas accéssibles en dehors de celles-ci. Dans cet exemple, nous aurions encore pus créer d'autres sous-classes abstract à la classe abstract mère afin de créer des sous catégories comme "vertébré" et "invertébré" afin d'encore mieux organiser les données dans le code. Mais pour des raisons de compréhension, il est préférable de partir sur un exemple simple. Il est toutefois important de savoir que cela est possible.


    

Conclusion

Vous savez donc maintenant à quoi sert fonctionnellement parlant une classe abstract et vous savez l'implémenter dans un code java. À vous de jouer maintenant !

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels