Ява. Неявный super constructor Employee () не определен. Необходимо явно вызвать другой конструктор [duplicate]

этот вопрос уже есть ответ здесь:

Привет я новичок в Java, я получаю эту ошибку в своем производственном рабочем классе. Мой конструктор Production worker говорит явно вызвать другой конструктор. Я не знаю, что делать?.

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

6 ответов


любой конструктор для любого класса, как вы знаете, создает объект. Таким образом, конструктор должен содержать правильный код инициализации для своего класса. Но если у вас есть какой-то класс, который расширяет другой (назовем его "родительским"), то конструктор для класса не может содержать весь код, необходимый для инициализации по определению (например, вы не можете определить частные поля родителя). Вот почему конструктор класса должен вызывать конструктор своего родителя. Если вы не вызываете его явно затем вызывается родительский конструктор по умолчанию (который не имеет никакого параметра).

таким образом, в вашем случае вы можете реализовать конструктор по умолчанию в parent или напрямую вызвать любой конструктор в классе.


как уже упоминалось, вы должны предоставить конструктор по умолчанию public Employee(){} в своем Employee класса.

происходит то, что компилятор автоматически предоставляет конструктор без аргументов по умолчанию для любого класса без конструкторов. Если ваш класс не имеет явного суперкласса, тогда он имеет неявный суперкласс Object, который имеет конструктор без аргументов. В этом случае вы объявляете конструктор в своем классе вы должны также укажите конструктор без аргументов.

сказав, что Employee класс должен выглядеть так:

ваш сотрудник класс

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

вот учебник Java Oracle -предоставление конструкторов для ваших классов глава. Пройдите через него и вы будете иметь четкое представление о том, что происходит.


ProductionWorker выходит Employee, таким образом, говорится, что он имеет все возможности сотрудника. Для этого Java автоматически помещает super(); вызов в первой строке каждого конструктора, вы можете поместить его вручную, но обычно это не требуется. В вашем случае это is необходимо, потому что вызов super(); невозможно разместить автоматически из-за того, что конструктор сотрудника имеет параметры.

вы должны определить конструктор по умолчанию в ваш Employee класс, или позвонить super('Erkan', 21, new Date()); в первой строке конструктора в ProductionWorker.


явный вызов конструктора родительского класса требуется в любое время, когда родительский класс не имеет конструктора без аргумента. Можно добавить конструктор без параметров родительского класса или явно вызвать конструктор родительского класса в дочернем классе.


недавно была эта проблема в моей лаборатории comp. Все просто, и Эркан ответил правильно. Просто положите super("the name of your subclass") Итак, в отношении вашей проблемы -->super("ProductionWorker); Как первой строкой subclass' конструктор.


эта проблема также может возникнуть, когда у вас нет конструктора тут звонок супер.

так это будет работать:

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

но это не так:

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

    super(....)
  }

Причина 2-й пример не удается, потому что Java пытается implicitely вызов

super(name,number,date)

как первая строка в вашем конструкторе.... Таким образом, java не видит, что у вас есть вызов super, продолжающийся позже в конструкторе. Это по существу пытается сделать это:

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

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

    super(....)
  }

таким образом, решение довольно простое... Просто не ставьте код перед своим супер call ; -) Если вам нужно инициализировать что-то перед вызовом super, сделайте это в другом конструкторе, а затем вызовите старый конструктор... Как в этом примере вытащил из этого поста StackOverflow:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}