web-dev-qa-db-fra.com

Différence entre un constructeur no-arg et un constructeur par défaut en Java

En fait, je ne peux pas comprendre quelle est la différence entre un constructeur sans argument et un constructeur par défaut.

import javax.swing.*;

public class Test extends JFrame {
   public Test() {
     super();
     this.setSize(200,200);
     this.setVisible(true);
   }
   public static void main(Sting[] arg) {
       Test cFrame = new Test();
   }
}

Est-ce que cela appelle le constructeur par défaut de cette classe lors de la création d'un objet Test appelé cFrame?

17
amila isura

Le constructeur default est un constructeur no-args que le compilateur Java insère en votre nom; il contient un appel default à super(); (pas supper()), qui correspond au comportement par défaut. Si vous implémentez un constructeur, vous ne recevez plus de constructeur par défaut.

JLS-8.8.9. Constructeur par défaut dit (en partie),

Si une classe ne contient aucune déclaration de constructeur, un constructeur par défaut ne contenant aucun paramètre formel et aucune clause throws est déclaré implicitement.

Si la classe en cours de déclaration est la classe primordiale Object, le constructeur par défaut a un corps vide. Sinon, le constructeur par défaut appelle simplement le constructeur de la superclasse sans arguments. 

22
Elliott Frisch

le default constructor est un constructeur que le compilateur Java ajoute à votre code si aucun constructeur explicite n'est disponible . Le constructeur par défaut appelle le constructeur de la super classe sans argument.

Si vous avez ajouté votre propre constructeur (que ce soit sans paramètres ou avec des paramètres), le compilateur n’ajoutera pas le constructeur par défaut dans ce cas.

7
Abhishek

Qu'est-ce qu'un constructeur par défaut?

C'est un constructeur ajouté par le compilateur si vous n'avez pas défini de constructeur.

Si votre classe a déjà un constructeur, le compilateur n'ajoutera pas le constructeur par défaut.

Donc, dans votre cas, vous avez le constructeur,

public Test(){
     super();
     this.setSize(200,200);
     this.setVisible(true);
   }

Il n’ya donc pas de constructeur par défaut à appeler par la machine virtuelle Java.

5
Code Geek

La réponse est non. La variable de référence cFrame appellera le constructeur non arg, Test (), pas le constructeur par défaut. Bien que le constructeur Test () recherche et appelle ensuite le constructeur non-arg de la classe JFrame (parent), etc., chaque classe doit avoir au moins un constructeur. S'il n'est pas déclaré explicitement, le compilateur Java fournit un constructeur non paramétré, c'est-à-dire un constructeur par défaut. Ce constructeur par défaut appelle le constructeur non paramétré de sa classe parent. Il initialise les variables de classe à leurs valeurs par défaut.

Par exemple:

Class Base {}

Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables

Alors que le constructeur non-arg est défini par un programmeur uniquement. Il peut aussi initialiser les variables. Un autre point à ajouter ici est que l’appel super () est ajouté automatiquement par le compilateur Java, s’il ne trouve pas super () dans la classe dérivée.

Par exemple:

Class Base {

int y;
    public Base() {
    }
    public int getY() {
    return y;
    }

}

public class Derived extends Base {
 private int x;

 public Derived() { //super() will be automatically used
 }

 public int getX() {
 return x;
 }

 public void setX(int x) {
 this.x = x;
 }
}

Derived d = new Derived();
 System.out.println("Base x value => " + d.getX());

System.out.println("Base y value => " + d.getY());

Result:

Base x value => 0 // Default value to its primitive datatype(In this case: int)

Base y value => 0
2
blueberry

La réponse à votre question est non. Java ne fournira pas de constructeur par défaut si vous écrivez n'importe quel type de constructeur en classe. 

Une différence entre eux est que le corps du constructeur par défaut sera toujours vide alors que nous pouvons insérer notre propre code dans le constructeur no-arg.

0
Raman Keswani