web-dev-qa-db-fra.com

Est-il inutile de mettre super () dans le constructeur?

Celui-ci n'est-il pas automatiquement mis par le compilateur si je ne le mets pas dans le constructeur d'une sous-classe?

Cela signifie que je n'ai même pas besoin de m'en soucier? Dans certains articles, ils l'ont publié.

Et si j'ai un constructeur avec des arguments, s'agira-t-il du constructeur ou faut-il un constructeur sans liste d'arguments?

152
ajsie

Tout d'abord une terminologie:

  • constructeur sans argument: un constructeur sans paramètre;
  • Constructeur no-args accessible: un constructeur no-args de la superclasse visible par la sous-classe. Cela signifie qu'il est public ou protégé ou, si les deux classes sont dans le même package, son accès. et
  • Constructeur par défaut: le constructeur public no-args ajouté par le compilateur lorsqu'il n'y a pas de constructeur explicite dans la classe.

Donc, toutes les classes ont au moins un constructeur.

Les constructeurs de sous-classes peuvent spécifier en premier lieu le constructeur de la superclasse à invoquer avant l'exécution du code dans le constructeur de la sous-classe.

Si le constructeur de la sous-classe ne spécifie pas le constructeur de la superclasse à invoquer, le compilateur appellera automatiquement le constructeur no-args accessible de la superclasse.

Si la superclasse n'a pas de constructeur no-arg ou n'est pas accessible, le fait de ne pas spécifier le constructeur de la superclasse à appeler (dans le constructeur de la sous-classe) est une erreur du compilateur, de sorte qu'il doit être spécifié.

Par exemple:

public class Base { }
public class Derived extends Base { }

Cela convient car si vous n’ajoutez aucun constructeur de manière explicite Java place un constructeur public par défaut pour vous.

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

Aussi très bien.

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Ce qui précède est une erreur de compilation car Base n’a pas de constructeur par défaut.

public class Base { private Base() { } }
public class Derived extends Base { }

C'est également une erreur car le constructeur no-args de Base est privé.

212
cletus

Si le constructeur de la super classe n'a pas d'argument Java l'appelle automatiquement pour vous. S'il comporte des arguments, vous obtiendrez une erreur.

src: http://Java.Sun.com/docs/books/tutorial/Java/IandI/super.html

50
lemon

L'appel du super constructeur sans arguments n'est qu'un gaspillage d'espace écran et de temps de programmation. Le compilateur génère exactement le même code, que vous l'écriviez ou non.

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

Mise à jour (décembre 2018):

L'écriture d'un super() explicite facilite la navigation dans le code source de l'EDI.

Depuis décembre 2018, ni Eclipse, ni IntelliJ ne permettent de naviguer confortablement du constructeur de la classe dérivée au constructeur de la classe de base.

20
Roland Illig

Le constructeur parent par défaut est appelé à partir du constructeur enfant par défaut, même si vous ne l'appelez pas.

Principale

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

UNE

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

Impressions

A
B
6
Yan Khonski

Tout constructeur de classe appelle toujours "super ()" s’il n’est pas appelé explicitement super ([arguments]), nous gardons seulement à l’esprit l’accès du constructeur de super classe lors de la programmation ... sans extension de classe spécifique, extension automatique de Java.lang Classe d'objet

0