1. Abstraction Avancée

Classes abstraites

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

  1. Function<T,R> : Transforme un type T en R
Function<String, Integer> stringToInt = s -> Integer.parseInt(s);
System.out.println(stringToInt.apply("42")); // 42

  1. Predicate<T> : Test booléen sur un objet
Predicate<String> estVide = s -> s.isEmpty();
System.out.println(estVide.test("")); // true

  1. Consumer<T> : Opération sans retour
Consumer<String> logger = msg -> System.out.println("[LOG] " + msg);
logger.accept("Démarrage réussi");

  1. Supplier<T> : Fournit des objets
Supplier<Double> random = () -> Math.random();
System.out.println(random.get()); // 0.548813...


3. Polymorphisme Appliqué