Java. Implicite super constructeur Employé() n'est pas défini. Doit explicitement invoquer un autre constructeur [dupliquer]

cette question a déjà une réponse ici:

  • erreur Java implicite: le super constructeur n'est pas défini pour le constructeur par défaut 10 réponses

Bonjour je suis nouveau en Java, je reçois cette erreur dans ma classe d'ouvrier de production. Mon constructeur D'ouvriers dit explicitement invoquer un autre constructeur. Je ne sais pas quoi faire?.

import java.util.Date;

public class Employee
{
      private String name, number;
      private Date date;

      public Employee(String name, String number, Date date)
      {
            setName(name);
            setNumber(number);
            setDate(date);
      }

      public void setName(String n)
      {
            name = n;
      }
      public void setNumber(String n)
      {
            number = n;
            // you can check the format here for correctness
      }
      public void setDate(Date d)
      {
            date = d;
      }

      public String getName()
      {
            return name;
      }
      public String getNumber()
      {
            return number;
      }
      public Date getDate()
      {
            return date;
      }
}



public class ProductionWorker extends Employee
{
      private int shift;
      private double hourlyrate;
       // error is here (Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor).
      public ProductionWorker(int shift, double hourlyrate)
      {
            setShift(shift);
            setHourlyPayRate(hourlyrate);
      }

      public void setShift(int s)
      {
            shift = s;
      }
      public void setHourlyPayRate(double rate)
      {
            hourlyrate = rate;
      }

      public int getShift()
      {
            return shift;
      }
      public double getHourlyPayRate()
      {
            return hourlyrate;
      }
}
25
demandé sur user659658 2011-03-30 19:05:07

6 réponses

N'importe quel constructeur pour n'importe quelle classe comme vous le savez crée un objet. Ainsi, le constructeur doit contenir le code d'initialisation approprié pour sa classe. Mais si vous avez une classe qui étend une autre (appelons-la" parent") alors le constructeur pour la classe ne peut pas contenir tout le code nécessaire pour l'initialisation par définition (par exemple, vous ne pouvez pas définir les champs privés du parent). C'est pourquoi, le constructeur de la classe doit appeler le constructeur de son parent. Si vous ne l'appelez pas explicitement alors le constructeur parent par défaut est appelé (ce qui est sans aucun paramètre).

ainsi, dans votre cas, vous pouvez implémenter le constructeur par défaut dans parent ou appeler directement n'importe quel constructeur dans la classe.

28
répondu xappymah 2011-03-30 15:13:39

comme d'autres l'ont déjà mentionné, vous devez fournir un constructeur par défaut public Employee(){} dans votre classe Employee .

ce qui se passe, c'est que le compilateur fournit automatiquement un constructeur par défaut sans argument pour toute classe sans constructeur. Si votre classe n'a pas explicite superclass , alors il a une superclass implicite de Object , qui a un constructeur sans argument . Dans ce si vous déclarez un constructeur dans votre classe Employee donc vous devez fournir également le constructeur sans argument.

ayant dit que la classe Employee devrait ressembler à ceci:

employé de votre catégorie

import java.util.Date;

public class Employee
{
      private String name, number;
      private Date date;

      public Employee(){} // No-argument Constructor

      public Employee(String name, String number, Date date)
      {
            setName(name);
            setNumber(number);
            setDate(date);
      }

      public void setName(String n)
      {
            name = n;
      }
      public void setNumber(String n)
      {
            number = n;
            // you can check the format here for correctness
      }
      public void setDate(Date d)
      {
            date = d;
      }

      public String getName()
      {
            return name;
      }
      public String getNumber()
      {
            return number;
      }
      public Date getDate()
      {
            return date;
      }
}

voici le tutoriel Java Oracle - fournissant des constructeurs pour vos Classes chapitre. Passer par elle et vous aurez une idée plus claire de ce que va sur.

9
répondu Bartzilla 2012-10-13 09:26:10

ProductionWorker s'étend Employee , on dit donc qu'il a toutes les capacités d'un employé. Pour ce faire, Java place automatiquement un appel super(); dans la première ligne de chaque constructeur, vous pouvez le mettre manuellement, mais habituellement ce n'est pas nécessaire. Dans votre cas, il est nécessaire parce que l'appel à super(); ne peut pas être placé automatiquement en raison du fait que le constructeur de L'employé a des paramètres.

You soit besoin de définir un constructeur par défaut dans votre classe Employee , soit appeler super('Erkan', 21, new Date()); dans la première ligne du constructeur dans ProductionWorker.

3
répondu Erkan Haspulat 2011-03-30 15:25:35

un appel explicite à un constructeur de classe parent est requis chaque fois que la classe parent n'a pas de constructeur sans argument. Vous pouvez soit ajouter un constructeur sans argument à la classe parent, soit explicitement appeler le constructeur de la classe parent dans votre classe enfant.

2
répondu Isaac Truett 2011-03-30 15:17:58

a eu ce problème récemment dans mon laboratoire. C'est simple et Erkan a bien répondu. Il suffit de mettre super("the name of your subclass") donc en relation avec votre problème --> super("ProductionWorker); comme première ligne de votre constructeur subclass' .

0
répondu Brent Ivey 2013-02-23 01:34:54

ce problème peut également apparaître lorsque vous n'avez pas votre constructeur immédiatement appeler super.

donc ça va marcher:

  public Employee(String name, String number, Date date)
  {
    super(....)
  }

Mais ce ne sera pas:

  public Employee(String name, String number, Date date)
  {
    // an example of *any* code running before you call super.
    if (number < 5)
    {
       number++;
    }

    super(....)
  }

la raison pour laquelle le deuxième exemple échoue est que java essaie d'appeler implicitement

super(name,number,date)

comme première ligne de votre constructeur.... Donc java ne voit pas que tu as un appel à super going plus tard dans le constructeur. Il tente essentiellement de le faire:

  public Employee(String name, String number, Date date)
  {
    super(name, number, date);

    if (number < 5)
    {
       number++;
    }

    super(....)
  }

donc la solution est assez facile... Il suffit de ne pas mettre le code avant votre appel super ; -) si vous avez besoin d'initialiser quelque chose avant l'appel à super, le faire dans un autre constructeur, puis appeler l'ancien constructeur... Comme dans cet exemple tiré de ce poteau de débordement :

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}
0
répondu Brad Parks 2017-05-23 12:17:47