11
votes

Pouvons-nous avoir un type de retour pour un constructeur en Java?

Le code suivant donne une erreur de compilation: xxx

erreur: xxx

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 !!! xxx

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?


7 commentaires

Vous manquez un modificateur d'accès public , 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.


11 Réponses :


19
votes

sur constructeur ne pas avoir de type de retour

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.

Les déclarations de constructeur JLS 8.8

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.

sur les constructeurs par défaut

L'extrait suivant donne une erreur de compilation: xxx

La raison n'est pas à cause de un type de retour dans un constructeur, mais car depuis que vous n'avez pas fourni aucun constructeur pour enfant , un constructeur est automatiquement créé pour vous par le compilateur. Toutefois, ce constructeur par défaut tente d'appeler le constructeur par défaut de la superclasse Parent , qui ne pas a un constructeur par défaut. c'est la source fo l'erreur de compilation.

Voici la spécification du constructeur par défaut:

Constructeur par défaut JLS 8.8.9

Si une classe ne contient pas de déclarations de constructeur, un constructeur défaut qui ne prend aucun paramètre est automatiquement fourni:


1 commentaires

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 :)



2
votes

constructeurs ne sont pas ont un type de retour. Les constructeurs sont appelés à créer une instance du type. Essentiellement ce qui est "retourné" d'un constructeur est une instance de ce type prêt à être utilisé.


0 commentaires

29
votes

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 à: xxx pré>

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>

dans Case 2 Strong> La classe parent parent n'a pas de constructeur p>

par parent (int x) {} code> est pas fort> un constructeur car il a un type de retour. C'est juste une méthode qui a le nom de la classe. La classe enfant n'a pas également de constructeur. Donc, le compilateur ajoute un constructeur par défaut pour enfant et parent et ajoute également appel au constructeur Super Class: P>

class parent {
 parent() {
  super(); // calls Object class ctor.
 }
  int parent(int x) {} // not a ctor.
}

class child extends parent {
 child() {
  super();
 }
}


0 commentaires

5
votes
  • Lorsque vous étendez une classe qui n'a pas de constructeur par défaut, vous devez fournir un constructeur qui appelle ce superconstructeur - c'est pourquoi l'erreur de compilation, qui est:

    Le Super Constructor implicite () est indéfini pour le constructeur par défaut. Doit définir un constructeur explicite

    • 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

      Dans le futur, lisez d'abord les messages d'erreur et essayez de raisonner (ou de trouver) ce qu'il implique.


4 commentaires

@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é 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.



1
votes

Essayez de le changer à:

class parent 
{
parent(int a){}
}

class child extends parent
{
  child(int a){
    super(a);
  }
}


0 commentaires

0
votes

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: xxx


0 commentaires

1
votes

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 super (int) , donc: xxx

Votre code pour enfant essaie implicitement de le faire: < / p> xxx

c'est-à-dire qui est, il essaie d'appeler un constructeur zéro argument dans parent , qui ne peut évidemment pas être fait car il n'a qu'un constructeur, qui prend un argument int .


0 commentaires

0
votes

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 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>

Cela fonctionnera. p> xxx pré>

La classe enfant vide se comporte comme s'il était écrit comme si ceci: p>

public class Child {
    public Child() {
        super();
    }
}


0 commentaires

1
votes

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.


0 commentaires

2
votes

constructeurs n'a pas de type de retour


0 commentaires

0
votes

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.


0 commentaires