Подтвердить что ты не робот

Ява. Неявный суперструктор Employee() - undefined. Должен явно ссылаться на другой конструктор

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

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

Ответ 1

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

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

Ответ 2

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

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

Сказав, что класс Employee должен выглядеть следующим образом:

Ваш класс 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 - Предоставление конструкторов для ваших классов. Пройдите через него, и у вас будет более четкое представление о том, что происходит.

Ответ 3

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

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

Ответ 4

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

Ответ 5

В последнее время эта проблема возникла в моей компьютерной лаборатории. Это просто, и Эркан ответил правильно. Просто поместите super("the name of your subclass") Итак, по отношению к вашей проблеме → super("ProductionWorker); в качестве первой строки вашего конструктора subclass'.

Ответ 6

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

Итак, это сработает:

  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(....)
  }

Причина неудачи второго примера заключается в том, что java пытается неявно вызывать

super(name,number,date)

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

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

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

    super(....)
  }

Итак, решение довольно просто... Просто не кладите код перед супервызовом;-) Если вам нужно что-то инициализировать перед вызовом super, сделайте это в другом конструкторе, а затем вызовите старый конструктор... Как в этом примере fooobar.com/info/690/...:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

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