En fait, il existe une règle pour qu'une classe soit considérée comme abstraite. Elle doit être déclarée avec le mot clé
abstract.
Voici un exemple illustrant mes dires :
Classe déclarée abstraite :
Code : Java
Une telle classe peut avoir le même contenu qu'une classe normale. Ses enfants pourront utiliser tous ses éléments déclarés (attributs et méthodes)
public. Cependant, ce type de classe permet de définir des méthodes abstraites. Ces méthodes ont une particularité ; elles n'ont pas de corps !
En voici un exemple :
Code : Java | abstract class Animal{
abstract void manger();//une méthode abstraite
}
|
Vous voyez pourquoi on dit "
méthode abstraite", difficile de voir ce que cette méthode sait faire...
Retenez bien qu'une méthode abstraite n'est composée que de l'entête de la méthode suivie d'un point-virgule : ;
Jusque-là ça va, mais concrètement, à quoi ça sert ?
Tout d'abord, vous devez savoir qu'une méthode abstraite ne peut exister que dans une classe abstraite. Si dans une classe, vous avez une méthode déclarée abstraite, vous
DEVEZ DÉCLARER CETTE CLASSE COMME ETANT ABSTRAITE.
Maintenant voyons à quoi cela peut servir. Vous avez vu les avantages de l'héritage et du polymorphisme. Dans ce cas, nos classes enfants hériteront aussi des classes abstraites mais, vu que celles-ci n'ont pas de corps, nos classes enfants seront
OBLIGÉES de redéfinir ces méthodes !
De ce fait, nos classes enfants auront des méthodes polymorphes en leur sein et donc, la covariance des variables repointe le bout de son nez...

La covariance appliquée aux classes abstraites donne ceci :
Code : Java | public class Test{
public static void main(String args[]){
Animal loup = new Loup();
Animal chien = new Chien();
loup.manger();
chien.crier();
}
}
|
Attends ! Tu nous as dit qu'on ne pouvait instancier de classe abstraites ?
Et je maintiens mes dires. Ici, nous n'avons pas instancié notre classe abstraite. Nous avons instancié un objet
Loup que nous avons mis dans un objet de type
Animal : il en va de même pour l'instanciation de la classe
Chien.
Vous devez vous rappeler que l'instance se crée avec le mot clé new. En aucun cas le fait de déclarer une variable d'un type de classe donnée (ici, Animal) est une instanciation ! Ici nous instancions un Loup et un Chien.
Vous pouvez aussi utiliser une variable de type
Object comme référence pour un objet
Loup, un objet
Chien...
Vous savez déjà que ce code fonctionne :
Code : Java | public class Test{
public static void main(String[] args){
Object obj = new Loup();
}
}
|
Par contre, ceci pose problème :
Code : Java | public class Test{
public static void main(String[] args){
Object obj = new Loup();
Loup l = obj;//Problème de référence
}
}
|
Eh oui ! Vous essayez ici de mettre une référence de type
Object dans une référence de type
Loup . Pour avertir la JVM que la référence que vous voulez mettre dans votre objet de type
Loup est un
Loup, vous devez utiliser le transtypage !
Revoyons notre code :
Code : Java | public class Test{
public static void main(String[] args){
Object obj = new Loup();
Loup l = (Loup)obj;//Vous prévenez la JVM que la référence que vous passez est de type Loup
}
}
|
Vous pourrez bien évidemment instancier directement un objet
Loup, un objet
Chien ou tout autre.
À présent, étoffons nos classes et notre diagramme avant d'avoir un code qui fonctionne bien !
