Cela fonctionne bien lorsque les constructeurs ne sont pas définis, mais donne des erreurs si je définis un constructeur paramétré et non pas un constructeur par défaut et ne transmettant aucune valeur lors de la création d'un objet. Je pensais que les constructeurs étaient prédéfinis.
Pourquoi dois-je définir un constructeur par défaut si j'ai défini un constructeur paramétré? Le constructeur par défaut n'est-il pas prédéfini?
Un constructeur par défaut (sans argument) est automatiquement créé niquement lorsque vous ne définissez aucun constructeur vous-même.
Si vous avez besoin de deux constructeurs, un avec des arguments et un sans, vous devez définir manuellement les deux.
Bien que toutes les réponses ci-dessus soient correctes, il est un peu difficile pour les nouveaux arrivants de l'envelopper dans leur tête. Je vais essayer de répondre à nouveau à la question des nouveaux arrivants.
Le problème auquel Ayush était confronté était d'essayer d'instancier un Object
pour une classe via un constructeur sans argument. Cette classe a cependant un ou plusieurs constructeurs paramétrés et cela se traduit par une erreur de temps de compilation.
Par exemple, créons une classe Student
avec un seul constructeur paramétré et essayons de l'instancier via le constructeur no-arg.
public class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo) {
this.name = name;
this.rollNo = rollNo;
}
public static void main(String[] args) {
// The line below will cause a compile error.
Student s = new Student();
// Error will be "The constuctor Student() is undefined"
}
}
Woha! Mais lorsque nous supprimons le constructeur public Student(String name, int rollNo)
tous ensemble, l'erreur disparaît et le code se compile.
La raison derrière cette anomalie apparente réside dans le fait que Java ne nous fournit que le constructeur par défaut (no-arg) lorsque nous ne définissons aucun constructeur pour cette classe par nous-mêmes.
Par exemple, la classe suivante est fournie avec un constructeur par défaut:
public class Student {
private String name;
private int rollNo;
}
devient:
public class Student {
private String name;
private int rollNo;
//Default constructor added by Java.
public Student() {
super();
}
}
En d'autres termes, au moment où nous définissons un constructeur paramétré, nous devons définir également un constructeur sans argument si nous voulons instancier l'objet de cette classe via un constructeur sans arg.
En cas d'héritage également, une sous-classe sans constructeur; est fourni avec un constructeur par défaut. Ce constructeur par défaut fourni par Java comme ci-dessus appelle le constructeur sans argument de la super classe. S'il n'en trouve pas, il générera une erreur.
Donc oui, c'est toujours un bon choix pour définir un constructeur sans argument/par défaut.
Réf: Oracle Java Tutorial
Un constructeur sans argument est automatiquement inséré pour vous, si vous n'en écrivez pas. Cela signifie que si vous écrivez un constructeur avec certains paramètres, ce sera le seul constructeur que vous avez, vous devez donc passer des valeurs pour ces paramètres pour en créer une instance.
C'est exactement le comportement attendu.
Java génère automatiquement une valeur par défaut (pas de constructeur d'arguments) pour les classes qui n'ont pas de constructeur.
Si vous définissez un autre constructeur (avec des arguments), le constructeur par défaut ne sera pas généré. Si vous en voulez toujours un, vous devez le définir vous-même.
Chaque fois que votre classe est conforme, si le compilateur ne trouve aucun constructeur valide dans la classe (par défaut, paramétré) seulement alors il remplacera le constructeur par défaut généré automatiquement pour votre classe.
Vous devez l'avoir remarqué, vous pouvez créer des objets sans aucun constructeur par défaut défini dans votre classe, vient le concept de constructeur par défaut généré automatiquement. Comme à chaque création d'objet, le constructeur par défaut est appelé.
Mais, si vous définissez le constructeur paramétré dans votre classe, cela signifie que vous limitez les objets à avoir ces paramètres
Exemple: chaque employé doit avoir un identifiant.
Donc, à ce moment-là, le compilateur n'y insérera aucun constructeur par défaut car il y a un constructeur valide dans une classe. Si vous avez également besoin d'un constructeur par défaut, vous devez définir vous-même.
Il y a aussi un cas curieux où vous devez définir un constructeur sans argument. Comme l'autre l'a écrit, si vous ne spécifiez pas le constructeur par défaut - Java le fera pour vous. Il est bon de comprendre à quoi ressemble le constructeur "généré par défaut par Java". En fait, il appelle constructeur de la super classe et c'est très bien. Imaginons maintenant un cas. Vous créez la classe Vehicle:
public class Vehicle {
private String name;
private String engine;
public Vehicle(String name, String engine) {
this.name = name;
this.engine = engine;
}
public String makeNoise(){
return "Noiseee";
}
}
Comme nous pouvons le voir, la classe Vehicle n'a qu'un seul constructeur défini à 2 arguments. Créons maintenant la classe Car qui hérite de la classe Vehicle:
public class Car extends Vehicle {
@Override
public String makeNoise() {
return "Wrrrrrrr....";
} }
Peut-être que cela semble étrange, mais une seule raison pour laquelle il ne compilerait pas est le fait que Java ne peut pas créer le constructeur par défaut pour la classe Car qui appelle la super classe Vehicle. La classe Vehicle n'a pas de constructeur d'argument et il ne peut pas être généré automatiquement tant que le constructeur 2 arg existe déjà.
Je sais que c'est un cas très rare, mais je l'ai trouvé intéressant à savoir.