6.16 OOP This et Super

Cliquez içi pour plus de vidéos disponibles sur notre chaine youtube !

Les mots-clés this et super permettent de désigner explicitement les membres d'une classe en programmation orientée objet. Ils sont indispensables dès que l'on travaille avec l'héritage et les constructeurs.

Le mot-clé this

this désigne l'objet courant, c'est-à-dire l'instance dans laquelle le code s'exécute. Il sert à accéder aux variables d'instance et aux méthodes de la classe actuelle. Il devient obligatoire lorsqu'un paramètre porte le même nom qu'un champ, pour lever l'ambiguïté :

public class Personne {
    private String nom;

    public void setNom(String nom) {
        this.nom = nom;  // this.nom = le champ ; nom = le parametre
    }
}

this est couramment utilisé dans les constructeurs et les setters. Dans un getter sans paramètre, il est facultatif. On ne peut jamais l'employer dans un contexte statique (méthode ou bloc static), car il n'y a alors aucune instance.

Le mot-clé super

super désigne la classe parente. Il sert à appeler une méthode de la classe mère, notamment lorsque la sous-classe redéfinit une méthode portant le même nom. Sans super, l'appel deviendrait récursif et bouclerait indéfiniment :

@Override
public void afficher() {
    super.afficher();  // appelle la version de la classe parente
    System.out.println("Detail supplementaire");
}

this() et super() : le chaînage de constructeurs

Avec des parenthèses, ces mots-clés deviennent des appels de constructeur. this(...) appelle un autre constructeur surchargé de la même classe ; super(...) appelle un constructeur de la classe parente. Dans les deux cas, l'appel doit être la première instruction du constructeur, et un même constructeur ne peut pas contenir à la fois this() et super().

public class Rectangle {
    private int largeur, hauteur;

    public Rectangle() {
        this(0, 0);  // delegue au constructeur ci-dessous
    }

    public Rectangle(int largeur, int hauteur) {
        this.largeur = largeur;
        this.hauteur = hauteur;
    }
}

Ce mécanisme, appelé chaînage de constructeurs, évite la duplication de code : un seul constructeur fait le vrai travail d'initialisation, les autres se contentent de l'appeler. Si vous n'écrivez pas d'appel explicite, le compilateur insère automatiquement un super() sans argument vers le constructeur par défaut de la classe parente.