Abstraction Java expliquée : Simplifier le code et améliorer la lisibilité
L'abstraction, c'est traiter des idées plutôt que des événements. Exemple : pour envoyer un e-mail, vous tapez le contenu, l'adresse, cliquez "envoyer". Les détails complexes (protocoles, serveurs) sont cachés.
En POO, l'abstraction cache les détails d'implémentation, n'expose que la fonctionnalité. L'utilisateur sait quoi l'objet fait, pas comment.
En Java : classes abstraites et interfaces.
Classe abstraite
Classe déclarée avec le mot-clé abstract.
- Peut contenir des méthodes abstraites (sans corps) ou non
- Si au moins une méthode abstraite → la classe doit être abstraite
- Ne peut pas être instanciée directement
- Pour l'utiliser : hériter et implémenter les méthodes abstraites
- Toutes les méthodes abstraites doivent être implémentées (sauf si la sous-classe est aussi abstraite)
Exemple : classe abstraite Employee
public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Construction Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Dans Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Envoi chèque à " + name + " " + address);
}
// autres méthodes et constructeur...
}
Tentative d'instanciation :
Employee e = new Employee("George W.", "Houston, TX", 43); // ERREUR
Erreur : Employee is abstract; cannot be instantiated
Hériter d'une classe abstraite
public class Salary extends Employee {
private double salary;
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
setSalary(salary);
}
@Override
public void mailCheck() {
System.out.println("Dans mailCheck de Salary");
System.out.println("Envoi chèque à " + getName() + " avec salaire " + salary);
}
@Override
public double computePay() {
System.out.println("Calcul paie pour " + getName());
return salary / 52;
}
// getters/setters...
}
On ne peut pas instancier Employee, mais on peut instancier Salary et accéder à tous les membres d'Employee :
public class AbstractDemo {
public static void main(String[] args) {
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Appel mailCheck via Salary --");
s.mailCheck();
System.out.println("\nAppel mailCheck via Employee --");
e.mailCheck();
}
}
Résultat :
Construction Employee
Construction Employee
Appel mailCheck via Salary --
Dans mailCheck de Salary
Envoi chèque à Mohd Mohtashim avec salaire 3600.0
Appel mailCheck via Employee --
Dans mailCheck de Salary
Envoi chèque à John Adams avec salaire 2400.0
Méthodes abstraites
Méthode déclarée sans implémentation, à charge des sous-classes.
- Mot-clé
abstractavant le type de retour - Signature seulement, pas de corps (point-virgule au lieu d'accolades)
Exemple
public abstract class Employee {
private String name;
private String address;
private int number;
public abstract double computePay(); // méthode abstraite
// reste de la classe...
}
Conséquences :
- La classe doit être déclarée
abstract - Toute classe concrète héritant doit implémenter la méthode (ou être abstraite elle-même)
Note : Finalement, une classe concrète doit implémenter la méthode, sinon on a une hiérarchie de classes abstraites non instanciables.
Implémentation dans Salary
public class Salary extends Employee {
private double salary;
@Override
public double computePay() {
System.out.println("Calcul paie pour " + getName());
return salary / 52;
}
// reste...
}
Java
- Comprendre le mot-clé final en Java : variables, méthodes et classes
- L'opérateur instanceof en Java : guide complet
- Classes et méthodes abstraites en Java : guide complet
- Comprendre les classes imbriquées statiques en Java : utilisation, différences et exemples
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Le pattern Singleton en Java expliqué : implémentation et utilisation sûre
- Maîtriser la réflexion Java : inspection des classes, méthodes et champs à l'exécution
- Maîtriser Java ObjectOutputStream : Sérialisation, méthodes et exemples pratiques
- Maîtriser les génériques Java : Construire du code réutilisable et type-safe