Java 超类/继承/构造函数问题的使用
我在做一个小项目。将有一个用于预订的主抽象类和两个子类,一个用于酒店预订,另一个用于航班预订,这两个子类都继承了抽象类的方法,例如用户的名称/地址等 在尝试为新的酒店预订创建构造函数时,我遇到了使用super()函数从抽象类继承方法/变量的问题 错误:Java 超类/继承/构造函数问题的使用,java,Java,我在做一个小项目。将有一个用于预订的主抽象类和两个子类,一个用于酒店预订,另一个用于航班预订,这两个子类都继承了抽象类的方法,例如用户的名称/地址等 在尝试为新的酒店预订创建构造函数时,我遇到了使用super()函数从抽象类继承方法/变量的问题 错误: Constructor in class booking can not be applied to given types. 这是我的代码: import java.util.Scanner; abstract class Booking
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();
{
}
您试图调用基类上的无参数构造函数,但不存在。一旦您使用args定义了一个ctor,默认的no arg ctor就会“消失”。为
预订
提供一个无参数的ctor,或者使用子类中的参数调用该ctor
Java方法通常以小写字母开头;我建议遵循惯例以提高可读性。参数和非静态最终属性也应该以小写开头。您试图在基类上调用一个无参数的构造函数,但不存在。一旦您使用args定义了一个ctor,默认的no arg ctor就会“消失”。为
预订
提供一个无参数的ctor,或者使用子类中的参数调用该ctor
Java方法通常以小写字母开头;我建议遵循惯例以提高可读性。参数和非静态最终属性也应该以小写开头。您的类
Booking
只有一个构造函数,它接受一些参数。您的类Hotel
尝试在没有任何参数(super()
)的情况下调用构造函数,该参数根本不存在
您需要将非arg构造函数添加到
Booking
,或者让Hotel
的构造函数调用super(…)
提供正确数量(和类型)的值。通常,子类构造函数的参数与超级类构造函数的参数相似、相同或更多,这取决于子类的原因。您的类只有一个构造函数,它只接受几个参数。您的类Hotel
尝试在没有任何参数(super()
)的情况下调用构造函数,该参数根本不存在
您需要将非arg构造函数添加到Booking
,或者让Hotel
的构造函数调用super(…)
提供正确数量(和类型)的值。通常,子类构造函数的参数与超级类构造函数的参数相似、相同或更多,这取决于子类化的原因。您正在调用尚未定义的构造函数:
super();
将呼叫
Booking()
但该构造函数不存在,因为您已经定义了参数化构造函数。您必须在预订时创建默认构造函数,或从您正在调用的子类调用参数化构造函数,以调用尚未定义的构造函数:
super();
将呼叫
Booking()
但该构造函数不存在,因为您已经定义了参数化构造函数。您必须在预订时创建默认构造函数,或从子类调用参数化构造函数。出现此错误的原因是,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);
...
}
然而,我认为您应该重新考虑您的类层次结构。酒店
是否真的是预订
的子类,或者酒店
是否应该包含许多预订
实例?出现此错误的原因是预订
中没有默认构造函数。当您从继承类的构造函数调用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
实例?您不必从超类中专门调用构造函数。你没有试过吗?我想让子类的构造函数使用超类方法。。还是我找错树了。基本上,在程序交互中,用户将使用酒店端的构造器,输入所需的所有元素。对我来说,拥有抽象类的想法是防止事情被写两次,而使用一个抽象类是项目的一个要求。(基本上创建一个包括X、Y、Z在内的程序)如果我用错误的方式解决了这个问题,请说出来,我只能从错误中吸取教训。@Catalin什么?如果您提供自己的ctor,超级ctor将如何命名?并尽量避免那些丑陋的文字游戏。改用此
。示例:this.firstName=firstName
。当调用来自Hotel的构造函数时,在那里发生的第一件事是调用Booking类(super())中的构造函数。因此,构造函数中的super()调用没有任何用处,您不必从超类中专门调用构造函数。你没有试过吗?我想让子类的构造函数使用超类方法。。还是我找错树了。埃森