使用SuperClass / Inheritance / Constructor问题

时间:2012-02-28 14:08:22

标签: java

我正在做一个小项目。将有一个用于预订的主要抽象类,以及两个子类,一个用于酒店预订,另一个用于航班预订,两个子类都从抽象类继承方法,例如用户的名称/地址等。

在尝试为新酒店预订创建构造函数时,我遇到了使用super()函数从抽象类继承方法/变量的问题。

错误:

Constructor in class booking can not be applied to given types.

这是我的代码:

import java.util.Scanner;


abstract class Booking{


  private String fname;
  private String lname;
  private int HouseNo;
  private String Street;
  private String Postcode;


  Scanner in = new Scanner(System.in);


  //Parameterized Constructor
  Booking(String FirstName, String Lastname, int Housenumber, String thestreet, String 
  thePostcode)                       

  {
   fname = FirstName;
   lname = Lastname;
   HouseNo = Housenumber;
   Street = thestreet;
   thePostcode = Postcode;
   }




   //Acessor Methods below
   String getfname()
  {
 fname = "sds";
 return fname;
 }

 void setFname(String FirstName)
 {
fname = FirstName;
}

 String getlname()
 {
 return lname;
 }

 void setLname(String LastName)
 {
 lname = LastName;
 }

 int getHouseNo()
 {
 return HouseNo;
 }

 void setHouseNo(int HouseNumber)
 {
 HouseNo = HouseNumber;
 }

String getStreet()
 {
 return Street;
 }

 void setStreet(String StreetName)
 {
 Street = StreetName;
 }

String getPostcode()
 {
 return Postcode;
 }

 void setPostcode(String ThePostcode)
   {
 Postcode = ThePostcode;
 }


abstract public String Verification();
{
}

import java.util.Scanner;

class Hotel extends Booking{



Scanner in = new Scanner(System.in);

private String TheVerification;
private int guests;
private String Roomtype;

Hotel(){
    super();
    TheVerification = Verification();
    guests = 0;
    Roomtype = Roomtype();
}

public String Verification(){
    System.out.println("Please provide your car reg as verification");
    TheVerification = in.next();
    return TheVerification;

}

public String Roomtype(){   
    System.out.println("Would you like a Premiun or Regular room?");
    Roomtype = in.next();
    return Roomtype;
}



public void print(){
    System.out.println("Roomtype" + Roomtype);

}


}

4 个答案:

答案 0 :(得分:3)

您收到此错误的原因是Booking中没有默认构造函数。当你从继承类的构造函数中调用super时,必须有一个适当的构造函数来调用。

所以,当你这样做时:

Hotel() {
   super();
}

该构造函数正在Booking中寻找这样的构造函数:

Booking() { 
   ...
}

但是,Booking只有这个构造函数:

Booking(String FirstName, String Lastname, int Housenumber, String thestreet, String 
  thePostcode) {
    fname = FirstName;
    lname = Lastname;
    HouseNo = Housenumber;
    Street = thestreet;
    thePostcode = Postcode;
 }

因此,您需要在Booking中创建默认构造函数或更改Hotel构造函数以传递参数,如下所示:

Hotel(String FirstName, String Lastname, int Housenumber, String thestreet, String 
  thePostcode) {
      super(FirstName, Lastname, Housenumber, thestreet, thePostcode);
      ...
 }

但是,我认为您应该重新考虑您的班级层次结构。 Hotel真的是Booking的子类,还是Hotel包含许多Booking个实例?

答案 1 :(得分:2)

你试图在基类上调用一个非arg ctor,但是不存在。一旦你用args定义了一个ctor,默认的no-arg ctor就会“消失”。要么为Booking提供一个no-arg ctor,要么用子类中的参数调用一个。


Java方法通常以小写字母开头;我建议遵循约定来提高可读性。参数和非静态最终属性也应以小写字母开头。

答案 2 :(得分:1)

您的类Booking只有一个带有一些参数的构造函数。您的类Hotel尝试调用没有任何参数(super())的构造函数,而这些参数根本就不存在。

您需要向Booking添加非arg构造函数,或者让Hotel的构造函数调用super(...)来提供正确的值(和类型)值。通常,您的子类构造函数将具有与超类构造函数相似,相同或更多的参数,具体取决于子类的原因。

答案 3 :(得分:1)

您正在调用未定义的构造函数:

super();

将致电

Booking()

但是由于您已经定义了参数化构造函数,因此该构造函数不存在。您必须在Booking中创建默认构造函数或从子类

调用参数构造函数