1. Abstraction Avancée
Classes abstraites
- Utilité : Créer un contrat partiel pour les sous-classes.
- Caractéristiques :
- Peuvent contenir des méthodes implémentées et abstraites
- Permettent de factoriser du code commun
abstract class Oiseau {
protected String couleur;
public Oiseau(String c) { this.couleur = c; }
abstract void chanter(); // Obligatoire pour les sous-classes
void voler() { // Méthode commune à tous
System.out.println("Je vole avec mes ailes");
}
}
class Aigle extends Oiseau {
Aigle(String c) { super(c); }
@Override
void chanter() {
System.out.println("Crii crii!");
}
}
Interfaces vs Classes abstraites
Critère |
Interface |
Classe Abstraite |
Implémentation |
Méthodes abstraites seulement |
Méthodes concrètes et abstraites |
Héritage multiple |
Oui |
Non |
Constructeurs |
Non autorisés |
Autorisés |
Variables |
Static final seulement |
Tous types |
2. Interfaces Fonctionnelles Détaillées
Types courants
- Function<T,R> : Transforme un type T en R
Function<String, Integer> stringToInt = s -> Integer.parseInt(s);
System.out.println(stringToInt.apply("42")); // 42
- Predicate<T> : Test booléen sur un objet
Predicate<String> estVide = s -> s.isEmpty();
System.out.println(estVide.test("")); // true
- Consumer<T> : Opération sans retour
Consumer<String> logger = msg -> System.out.println("[LOG] " + msg);
logger.accept("Démarrage réussi");
- Supplier<T> : Fournit des objets
Supplier<Double> random = () -> Math.random();
System.out.println(random.get()); // 0.548813...
3. Polymorphisme Appliqué