我正在做一个小项目。将有一个用于预订的主要抽象类,以及两个子类,一个用于酒店预订,另一个用于航班预订,两个子类都从抽象类继承方法,例如用户的名称/地址等。
在尝试为新酒店预订创建构造函数时,我遇到了使用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);
}
}
答案 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中创建默认构造函数或从子类
调用参数构造函数