Java Language Appeler le constructeur parent


Exemple

Disons que vous avez une classe Parent et une classe Enfant. Pour construire une instance Child, vous devez toujours exécuter un constructeur Parent au sein même du constructeur Child. Nous pouvons sélectionner le constructeur Parent que nous voulons en appelant explicitement super(...) avec les arguments appropriés dans notre première déclaration de constructeur Child. Cela vous fait gagner du temps en réutilisant le constructeur de la classe Parent au lieu de réécrire le même code dans le constructeur de la classe Child.

Sans super(...) méthode:

(implicitement, la version no-args super() est appelée de manière invisible)

class Parent {
    private String name;
    private int age;
    
    public Parent() {} // necessary because we call super() without arguments
    
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
    public Child() {
        // compiler implicitly calls super() here
        name = "John";
        age = 42;
    }
}

Avec la méthode super() :

class Parent {
    private String name;
    private int age;
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

class Child extends Parent {
    public Child() {
        super("John", 42);   // explicit super-call
    }
}

Remarque: Les appels à un autre constructeur (chaînage) ou au super constructeur DOIVENT être la première instruction à l'intérieur du constructeur.

Si vous appelez explicitement le constructeur super(...) , un constructeur parent correspondant doit exister (c'est simple, n'est-ce pas?).

Si vous n'appelez aucun constructeur super(...) explicitement, votre classe parent doit avoir un constructeur no-args - et ceci peut être écrit explicitement ou créé par défaut par le compilateur si la classe parente ne fournit pas n'importe quel constructeur.

class Parent{
    public Parent(String tName, int tAge) {}
}

class Child extends Parent{
    public Child(){}
}

La classe Parent n'a pas de constructeur par défaut, le compilateur ne peut donc pas ajouter de super dans le constructeur Child. Ce code ne sera pas compilé. Vous devez changer les constructeurs pour les adapter des deux côtés, ou écrire votre propre super appel, comme ça:

class Child extends Parent{
    public Child(){
          super("",0);
    }
}