Comment empêcher l'héritage en Java à l'aide du mot-clé final

Alors que l'un des points forts de Java est le concept d'héritage, dans lequel une classe peut dériver d'une autre, il est parfois souhaitable d'empêcher l'héritage par une autre classe. Pour éviter l'héritage, utilisez le mot clé "final" lors de la création de la classe.

Par exemple, si une classe est susceptible d'être utilisée par d'autres programmeurs, vous souhaiterez peut-être empêcher l'héritage si des sous-classes créées peuvent causer des problèmes. Un exemple typique est la classe String. Si nous voulions créer une sous-classe String:

public class MyString étend String 

Nous serions confrontés à cette erreur:

 ne peut pas hériter de java.lang.String final 

Les concepteurs de la classe String ont réalisé que ce n'était pas un candidat à l'héritage et ont empêché son extension.

Pourquoi empêcher l'héritage?

La principale raison pour empêcher l'héritage est de s'assurer que le comportement d'une classe n'est pas corrompu par une sous-classe.

Supposons que nous ayons un compte de classe et une sous-classe qui le prolonge, OverdraftAccount. Le compte de classe a une méthode getBalance ():

 public double getBalance ()


 retourner this.balance;

  

À ce stade de notre discussion, la sous-classe OverdraftAccount n'a pas remplacé cette méthode.

(Remarque: Pour une autre discussion sur l'utilisation de ces classes Account et OverdraftAccount, voyez comment une sous-classe peut être traitée comme une superclasse).

Créons une instance pour chacune des classes Account et OverdraftAccount:

 Compte bobsAccount = nouveau compte (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = new OverdraftAccount (15.05,500,0,05);

 jimsAccount.depositMoney (50);

 // crée un tableau d'objets Account

 // nous pouvons inclure jimsAccount parce que nous 

 // je veux seulement le traiter comme un objet Account

 Compte [] accounts = bobsAccount, jimsAccount;

 

 // pour chaque compte du tableau, affiche le solde

 pour (Compte a: comptes)

 

 System.out.printf ("Le solde est% .2f% n", a.getBalance ());

 

 La sortie est:

 Le solde est de 60,00

 Le solde est de 65,05 

Tout semble fonctionner comme prévu, ici. Mais que se passe-t-il si OverdraftAccount remplace la méthode getBalance ()? Rien ne l'empêche de faire quelque chose comme ça:

 classe publique OverdraftAccount étend le compte 

 

 double découvert privé Limite;

 double découvert privé;

 

 // le reste de la définition de classe n'est pas inclus

 

 public double getBalance ()

 

 retour 25,00;

 

  

Si l'exemple de code ci-dessus est à nouveau exécuté, la sortie sera différente car leLe comportement de getBalance () dans la classe OverdraftAccount est appelé pour jimsAccount: