Le code suivant donne une erreur de compilation: erreur: p> J'essayais de faire des choses différentes et j'ai constaté que l'ajout Un type de retour au constructeur parent s'est débarrassé de l'erreur !!! p> J'ai lu que les constructeurs ne doivent pas avoir de type de retour, ce qui n'est clairement pas correct tout le temps . Donc, ma question est quand devrions-nous avoir du type de retour pour le constructeur? P> p>
11 Réponses :
constructeur ne doit pas avoir de type de retour. Par définition, si une méthode a un type de retour, ce n'est pas un constructeur. P>
Les déclarations de constructeur JLS 8.8 H3>
Un constructeur est utilisé dans la création d'un objet qui est une instance d'une classe. [Le nom doit correspondre au nom de la classe, mais], à tous les autres égards, la déclaration du constructeur ressemble à une déclaration de méthode qui n'a pas de type de résultat. P> blockQquote>
sur les constructeurs par défaut h3>
L'extrait suivant donne une erreur de compilation: p>
xxx pré> La raison n'est pas à cause de un type de retour dans un constructeur, mais car depuis que vous n'avez pas fourni aucun em> constructeur pour
enfant code>, un em> constructeur em> est automatiquement créé pour vous par le compilateur. Toutefois, ce constructeur par défaut tente d'appeler le constructeur par défaut de la superclasseParent code>, qui ne em> pas em> a un constructeur par défaut. c'est fort> la source fo l'erreur de compilation. p>Voici la spécification du constructeur par défaut: P>
Constructeur par défaut JLS 8.8.9 a> h3>
Si une classe ne contient pas de déclarations de constructeur, un constructeur défaut em> qui ne prend aucun paramètre est automatiquement fourni: p>
- Si la classe étant déclarée est la classe primordiale
objet code>, puis le constructeur par défaut a un corps vide. LI>- Sinon, le constructeur par défaut ne prend aucun paramètre et invoque simplement le constructeur de superclasse sans arguments. LI> ul> blockquote>
Ce qui suit est une solution simple: p>
xxx pré>
sur des méthodes ayant le même nom que le constructeur h3>
ce qui suit Snippet est em> compilé: p>
xxx pré> Il n'y a en fait pas de constructeur explicite dans l'extrait ci-dessus. Ce que vous avez est une méthode régulière qui a le même nom que la classe. Cela est autorisé, mais découragé: p>
Les déclarations de méthode JLS 8.4 H3>
a
classe code> peut déclarer une méthode avec le même nom que leClasse Code> ou un champ, membreClasse code> ou membreinterface< / code> de la classe, mais cela est découragé comme une question de style em>. p> blockQuote>Vous constaterez que si vous créez un
nouveau parent () code> ou unnouvel enfant () code>,"Yipppee !!!" < / code> pas em> est imprimé sur la sortie standard. La méthode n'est pas invoquée à la création car elle n'est pas un constructeur. P> h3>
Il n'y a pas de type. Parent n'a tout simplement pas eu de constructeur de no-arg, ce qui rend un enfant vide (étend le parent) classe impossible. Je suppose que l'erreur a déclaré qu'aucun constructeur par défaut ne pouvait être trouvé dans le parent, ou d'autres :)
constructeurs
dans Case 1 Strong> La classe enfant n'a pas de constructeur, le compilateur ajoute un constructeur par défaut pour vous et ajoute également un appel au constructeur de Superclass. Donc, votre classe enfant ressemble effectivement à: dans Case 2 Strong> La classe parent parent n'a pas de constructeur p> super () code> recherche un constructeur d'arguments zéro dans la classe de base, car il n'y a pas de tel constructeur que vous obtenez L'erreur. p> par parent (int x) {} code> est class parent {
parent() {
super(); // calls Object class ctor.
}
int parent(int x) {} // not a ctor.
}
class child extends parent {
child() {
super();
}
}
Le Super Constructor implicite () est indéfini pour le constructeur par défaut. Doit définir un constructeur explicite p> blockQuote>
- Lorsque vous ajoutez un type de retour, ce n'est plus un constructeur, c'est une méthode, et ce qui précède ne s'applique pas Li> ul>
Dans le futur, lisez d'abord les messages d'erreur et essayez de raisonner (ou de trouver) ce qu'il implique. p>
@Bozho: Vous le faites paraître comme si c'était un petit vote de baisse - c'était une erreur assez grave, imo. (Et changer "avec les mêmes arguments" "qui appelle ce superconstructeur" est à peine "un mauvais mot" de toute façon.)
@Bozho: il n'a pas été réparé lorsque je chargé i> it :)
Bien sûr, le bowvote a été mérité initialement, je n'ai pas dit que ce n'était pas :)
@Bozho: Pas explicitement - mais la forme originale de votre commentaire: "J'ai réparé le mauvais mot" l'impliquait à peu près, imo.
Essayez de le changer à:
class parent
{
parent(int a){}
}
class child extends parent
{
child(int a){
super(a);
}
}
Tout ce que vous avez fait en ajoutant que l'INT est de transformer le "constructeur" en une méthode qui a une visibilité par défaut, puis parce que vous n'avez pas spécifié de constructeur, il suffira d'ajouter un constructeur par défaut pour vous au moment de la compilation. < p> Si vous voulez que cela compilait, vous devrez spécifier un constructeur par défaut, ce qui est la recherche de la classe enfant, telle que: p>
Techniquement, vous n'avez pas ajouté de type de retour au constructeur, mais vous avez changé le constructeur en une méthode qui vient d'être du même nom que la classe. Ce que vous devriez avoir fait était appeler Votre code pour c'est-à-dire qui est, il essaie d'appeler un constructeur zéro argument dans super (int) code>, donc: enfant code> essaie implicitement de le faire: < / p> parent code>, qui ne peut évidemment pas être fait car il n'a qu'un constructeur, qui prend un argument int code>. p> p>
1) Il est préférable de commencer les cours avec une lettre majuscule et des méthodes avec une lettre de cas lowr.
2) Lorsque vous ne créez pas de constructeur pour une classe, il dispose d'un constructeur vide par défaut. p>
3) Lors de l'hérité d'une classe, vous devez remplacer au moins un de ses constructeurs, et si vous ne le spécifiez pas, vous héritez automatiquement le constructeur vide. P>
Le code que vous avez soumis travailler si l'enfant avait un constructeur appelant Cela fonctionnera. p> La classe enfant vide se comporte comme s'il était écrit comme si ceci: p> super (int i) code>, si la classe mère n'avait pas de constructeur (il aurait le constructeur vide par défaut) ou si la classe mère a spécifiquement mis en œuvre le constructeur vide. p> public class Child {
public Child() {
super();
}
}
déjà répondu par CODADICD, mais deux commentaires. Par les classes de convention de code Java Code devrait commencer par les majuscules (il souhaitait également ajouter le modificateur). Si vous avez une erreur de compilation, mettez-le, tous difficiles le cas ici était clair sans elle. P>
constructeurs n'a pas de type de retour p>
Constructeurs n'a pas de type de retour.Constructeur renvoie une instance du type.Constructeur doit avoir le même nom que celui de la classe. P>
Vous manquez un
modificateur d'accès public code>, non?Il est probablement plus facile d'y penser comme ceci: s'il a un type de retour, ce n'est pas un constructeur, c'est une méthode.
Les constructeurs n'ont pas besoin d'être publics, ils peuvent avoir un modificateur d'accès valide
@Richard - True, mais l'extrait de code dans la question n'a pas de modificateurs d'accès.
À l'avenir, ne jamais dire "une erreur de compilation", dites simplement "une erreur de compilation avec le message" YABBA DABBA "". Vous ne devriez pas ignorer le message, il indique quelque chose à propos de la cause du problème.
En fait, les gars, il y a du mérite à la question après tout. Voter pour rouvrir. Désolé j'étais trop hâte là-bas.
Vous pouvez penser à un constructeur comme ayant un type de retour du nom de la classe actuelle, mais n'a aucun nom de méthode, si cela vous facilite la tâche.