Java - 扩展类

时间:2013-10-21 18:07:49

标签: java inheritance

我有一个Meeting类,我想创建一个扩展Meeting的BusinessMeeting类。

这是我的会议课程:

public class Meeting {

private String name;
private String location;
private int start, stop;

public Meeting(String name, String location, int start, int stop) {

    this.name = name;

    this.location = location;

    this.start = start;

    this.stop = stop;

}

这是我的BusinessMeeting类:

public class BusinessMeeting extends Meeting {

    public BusinessMeeting() {

        super();

    }

}

在我的BusinessMeeting课程中,我收到错误:

构造函数类会议中的会议不能应用于给定类型;   required:String,String,int,int   发现:没有参数

我不确定为什么我收到该错误消息。 BusinessMeeting类不应该继承Meeting类中的所有变量吗?

7 个答案:

答案 0 :(得分:5)

您创建的构造函数接受4个参数,您可以在没有任何参数的情况下调用它。 如果您希望在没有参数的情况下初始化它 - 将空构造函数添加到Meeting

 public Meeting(){}

答案 1 :(得分:5)

public class Meeting {
    public Meeting(String name, String location, int start, int stop) {

        this.name = name;

        this.location = location;

        this.start = start;

        this.stop = stop;

    }
}

现在说您希望使用BusinessMeeting扩展businessId课程。

public class BusinessMeeting {
    private Integer businessId;

    public BusinessMeeting(String name, String location, int start, int stop, int business) {
        // because super calls one of the super class constructors(you can overload constructors), you need to pass the parameters required.
        super(name, location, start, stop);
        businessId = business;
    }
}

答案 2 :(得分:2)

您正在使用空参数调用超类构造函数:

public BusinessMeeting() {
        super();   
    }

但是你的超类有构造函数:Meeting(String, String, int, int)

使用 super(),将调用超类无参数构造函数(如果存在)。使用 super(参数列表),将调用具有匹配参数列表的超类构造函数。因此,您必须向Meeting例如public Meeting(){}添加一个带有空参数的构造函数,或者您需要调用super(String, String, int, int)

public class Meeting {
// your variable declaration
   public Meeting(String name, String location, int start, int stop) {
    // your assignment 
   }
   public Meeting(){}
}

public class BusinessMeeting extends Meeting {
    public BusinessMeeting()
    {
      // super(); un-comment if you need to check by commenting below
       super("name", "loc", 1, -1);
    }
}

结帐:Using the Keyword super

答案 3 :(得分:1)

通过声明构造函数,您的Meeting类没有0参数构造函数,这是您尝试使用super();调用的函数。您需要调用与超类中可用构造函数匹配的超级构造函数。

要解决此问题,请将0参数构造函数添加到Meeting类,或调用您已有的4参数构造函数。

答案 4 :(得分:1)

正如alfasin所说,你已经创建了一个构造函数。 standard表示如果没有定义其他构造函数,则创建此构造函数。如果要调用super()

,则必须自己创建无参数构造函数

答案 5 :(得分:1)

是和否。这取决于你如何声明变量。

子类无法访问超类中的私有变量。通常,您将受保护的getter和setter-Methods添加到超类中。可以在子类中使用这些方法来访问变量。 (有时候草率的方式是将变量声明为受保护的)

  

子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。 Java Inheritance Webpage

但是关于你提到的错误: 您正在呼叫super()。这意味着您正在调用超类的默认构造函数。由于您在超类中编写了自己的构造函数,因此没有默认构造函数。只有在未定义构造函数时才会创建后者。

因此,当调用超类的构造函数时 - 你的情况是四个参数 - 你必须通过super()传递这些参数,如下所示:

super("a name", "a location", 0, 1)

答案 6 :(得分:0)

您应该在会议课程中添加带有空参数的构造函数,或者您可以在BussinessMeeting类中调用super(name,location,start,stop)而不是super()