27

您好,我是 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;
      }
}
4

6 回答 6

31

如您所知,任何类的任何构造函数都会创建一个对象。因此,构造函数应该包含其类的正确初始化代码。但是,如果您有某个类扩展了另一个类(我们称其为“父类”),则该类的构造函数不能包含定义初始化所需的所有代码(例如,您不能定义父类的私有字段)。这就是为什么类的构造函数必须调用其父类的构造函数。如果您没有显式调用它,则调用默认的父构造函数(没有任何参数)。

因此,在您的情况下,您可以在父级中实现默认构造函数,也可以直接调用类中的任何构造函数。

于 2011-03-30T15:13:39.790 回答
9

正如其他人已经提到的,您需要public Employee(){}Employee类中提供默认构造函数。

发生的情况是编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。如果你的类没有显式超类,那么它有一个隐式超类Object,它确实有一个无参数的构造函数。在这种情况下,您在类中声明了一个构造函数,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 教程 -为您的类提供构造函数一章。通过它,您将对正在发生的事情有更清晰的了解。

于 2011-03-30T15:38:34.133 回答
3

ProductionWorkerextends Employee,因此据说它具有 Employee 的所有功能。为了实现这一点,Java 会自动super();在每个构造函数的第一行调用,您可以手动调用,但通常没有必要。在您的情况下,这super();必要的,因为由于 Employee 的构造函数具有参数,因此无法自动调用 to 。

你要么需要在你的Employee类中定义一个默认构造函数,要么super('Erkan', 21, new Date());在 ProductionWorker 的构造函数的第一行调用。

于 2011-03-30T15:12:40.120 回答
2

每当父类缺少无参数构造函数时,都需要显式调用父类构造函数。您可以向父类添加无参数构造函数,也可以在子类中显式调用父类构造函数。

于 2011-03-30T15:17:58.963 回答
1

当你没有让你的构造函数立即调用 super时,也会出现这个问题。

所以这将起作用:

  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没有看到你在构造函数的后面调用了super。它基本上试图这样做:

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

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

    super(....)
  }

所以解决方案很简单......只是不要在你的super调用之前放置代码;-) 如果你需要在调用 super 之前初始化某些东西,在另一个构造函数中执行它,然后调用旧的构造函数......就像在这个 StackOverflow 帖子中提取的示例中:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}
于 2013-05-24T14:10:20.623 回答
0

最近在我的comp实验室遇到了这个问题。这很简单,Erkan回答正确。只需将super("the name of your subclass")So 与您的问题相关 ->super("ProductionWorker);作为subclass'构造函数的第一行。

于 2013-02-23T01:15:20.433 回答