爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]

Posted

技术标签:

【中文标题】爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]【英文标题】:Java. Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor [duplicate] 【发布时间】:2011-07-26 04:18:11 【问题描述】:

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

【问题讨论】:

在您的 Employee 类中放置一个默认构造函数。 public Employee() 【参考方案1】:

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

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

【讨论】:

像这样的默认构造函数 public Employee(String hourlyrate, String shift) shift = "";每小时费率 = ""; 不,默认构造函数是指没有参数的构造函数,例如public Employee() 我这样做了,但仍然得到同样的错误。 不,“默认构造函数”是一个不带任何参数的构造函数:public Employee() /* Code here */ 构造函数不创建对象,它们只是初始化它们。【参考方案2】:

正如其他人已经提到的,您需要在 Employee 类中提供默认构造函数 public 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 教程 - Providing Constructors for Your Classes 章节。通过它,您将对正在发生的事情有更清晰的了解。

【讨论】:

【参考方案3】:

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

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

【讨论】:

与参数类型无关。需要显式调用父类构造函数,因为父类没有无参数构造函数。 其他人回答错了,你不需要像public Employee();这样的默认构造函数,你只需要调用你的超类的构造函数。在其子项的构造函数中。像这样:public ProductionWorker(int shift, double hourlyrate) super(name, number, date); setShift(shift); setHourlyPayRate(hourlyrate); 【参考方案4】:

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

【讨论】:

【参考方案5】:

当你没有让你的构造函数立即调用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 之前初始化某些内容,请在另一个构造函数中进行,然后调用旧的构造函数......就像在这个例子中pulled from this *** post:

public class Foo

    private int x;

    public Foo()
    
        this(1);
    

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java错误:默认构造函数未定义隐式超级构造函数

java 中使用jmx对tomcat实时监控默认的构造方法无法处理的异常类型的隐式超级构造函数抛出异常

如何在 Python 中调用超级构造函数?

为啥在声明子类的对象时会调用超类的构造函数? (爪哇)

Minecraft 修改块构造器错误

我定义了一个非拷贝构造函数;复制构造函数是不是仍会被隐式定义?