Java. Implicit super constructor Employee () is undefined. Debe invocar explícitamente a otro constructor [duplicate]


Esta pregunta ya tiene una respuesta aquí:

Hola soy nuevo en Java, estoy recibiendo este error en mi clase production worker. Mi constructor de Production worker dice explícitamente invocar a otro constructor. No se que hacer?.

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;
      }
}
Author: user659658, 2011-03-30

6 answers

Cualquier constructor para cualquier clase como usted sabe crea un objeto. Por lo tanto, el constructor debe contener el código de inicialización adecuado para su clase. Pero si tiene alguna clase que extiende otra (llamémosla "padre"), entonces el constructor de la clase no puede contener todo el código necesario para la inicialización por definición (por ejemplo, no puede definir campos privados del padre). Es por eso que el constructor de la clase tiene que llamar al constructor de su padre. Si no lo llamas explícitamente luego se llama al constructor padre predeterminado (que no tiene ningún parámetro).

Así que, en su caso, puede implementar el constructor predeterminado en padre o llamar directamente a cualquier constructor de la clase.

 28
Author: xappymah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:13:39

Como otros ya han mencionado, debe proporcionar un constructor predeterminado public Employee(){} en su clase Employee.

Lo que sucede es que el compilador proporciona automáticamente un constructor predeterminado sin argumento para cualquier clase sin constructores. Si su clase no tiene una superclase explícita , entonces tiene una superclase implícita de Object, que tiene un constructor sin argumento. En este caso usted está declarando un constructor en su clase Employee por lo tanto usted debe proporcionar también el constructor sin argumento.

Habiendo dicho que Employee la clase debería verse así:

Su empleado de clase

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

Aquí está el tutorial de Java Oracle - Proporcionando Constructores para Sus Clases capítulo. Repásalo y tendrás una idea más clara de lo que está pasando.

 9
Author: Bartzilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-13 09:26:10

ProductionWorker extiende Employee, por lo que se dice que tiene todas las capacidades de un Empleado. Para lograr esto, Java coloca automáticamente una llamada super(); en la primera línea de cada constructor, puede colocarla manualmente, pero generalmente no es necesario. En su caso, es necesario porque la llamada a super(); no se puede colocar automáticamente debido al hecho de que el constructor del empleado tiene parámetros.

Necesita definir un constructor predeterminado en su clase Employee, o llamar super('Erkan', 21, new Date()); en la primera línea del constructor en ProductionWorker.

 3
Author: Erkan Haspulat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:25:35

Se requiere una llamada explícita a un constructor de clase padre cada vez que la clase padre carece de un constructor sin argumento. Puede agregar un constructor sin argumento a la clase padre o llamar explícitamente al constructor de clase padre en su clase hija.

 2
Author: Isaac Truett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-30 15:17:58

Tuve este problema recientemente en mi laboratorio de borrador. Es simple y Erkan respondió correctamente. Simplemente ponga super("the name of your subclass") So en relación con su problema > > super("ProductionWorker); como la primera línea de su constructor subclass'.

 0
Author: Brent Ivey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-23 01:34:54

Este problema también puede surgir cuando no tiene su constructor inmediatamente llamar a super.

Así que esto funcionará:

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

Pero esto no:

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

    super(....)
  }

La razón por la que el 2do ejemplo falla es porque java está tratando de llamar implícitamente a

super(name,number,date)

Como la primera línea en su constructor.... Así que Java no ve que tienes una llamada a super pasando más adelante en el constructor. Esencialmente trata de hacer esto:

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

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

    super(....)
  }

Así que la solución es bastante sencillo... Simplemente no pongas código antes de tu llamada super; -) Si necesitas inicializar algo antes de la llamada a super, hazlo en otro constructor, y luego llama al constructor antiguo... Como en este ejemplo extraído de este post de StackOverflow :

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}
 0
Author: Brad Parks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:47