【问题标题】:Implicit super constructor Person() is undefined. Must explicitly invoke another constructor隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数
【发布时间】:2015-10-25 21:49:07
【问题描述】:

我在尝试为第二个类创建构造函数时收到该错误。我需要为第二类使用与第一类相同的参数吗?

class Person {
    private String name;
    private String gender;
    private int phone;

    protected Person(String n, String g, int p)
            {name = n; gender = g; phone = p;} 
    public String toString(){return name +" "+gender+" "+phone;}
}


class Student extends Person { 
      private String subject;
      private int sNumber; 
      protected Student(String s, int sn){subject = s; sNumber = sn;} 
}


class Lecturer extends Person { 
  private String Department;
  private int staffNo;
  public Lecturer(String d, int stfNo){Department = d; staffNo = stfNo;}   
}   

【问题讨论】:

    标签: java class object


    【解决方案1】:

    每个扩展类首先调用超级构造函数。在您的 Person 类中,您只定义了一个非默认构造函数,因此没有默认构造函数。

    要么在Person 中提供默认构造函数(不带任何参数的构造函数),要么使用super(name, gender, phone) 显式调用超级构造函数

    【讨论】:

      【解决方案2】:

      编译后,您的编译器将添加 super() 作为您的子构造函数的第一行,以搜索父非 arg 构造函数。

      由于你的父类已经有一个 using 参数,所以在编译时不会创建默认的 no arg 构造函数。

      两种解决方案:

      1. 添加super(string,string,int),为其提供正确的参数作为您孩子构造函数的第一行

      2. 创建一个不带参数的Person() 构造函数,以便super() 在编译时找到要调用的内容。

      【讨论】:

        【解决方案3】:

        如果一个类扩展了另一个类,它必须调用该扩展类的构造函数。

        由于您为Person 指定了构造函数,因此您需要在StudentLecturer 中调用它作为第一条语句:

        protected Student(String s, int sn, String n, String g, int p)
        {
            super(n, g, p);
            subject = s;
            sNumber = sn;
        }
        

        您之前可能没有看到此错误,因为编译器会自动添加super(); 作为第一条语句。由于此构造函数不存在(您指定了自己的构造函数),因此这不起作用。

        如果你不调用超类的构造函数,你永远不会初始化它。

        【讨论】:

          猜你喜欢
          • 2014-06-17
          • 2020-09-29
          • 2014-11-06
          • 2023-04-08
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-02
          相关资源
          最近更新 更多