Java 超类/继承/构造函数问题的使用

Java 超类/继承/构造函数问题的使用,java,Java,我在做一个小项目。将有一个用于预订的主抽象类和两个子类,一个用于酒店预订,另一个用于航班预订,这两个子类都继承了抽象类的方法,例如用户的名称/地址等 在尝试为新的酒店预订创建构造函数时,我遇到了使用super()函数从抽象类继承方法/变量的问题 错误: Constructor in class booking can not be applied to given types. 这是我的代码: import java.util.Scanner; abstract class Booking

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

在尝试为新的酒店预订创建构造函数时,我遇到了使用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();
{
}


您试图调用基类上的无参数构造函数,但不存在。一旦您使用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()调用没有任何用处,您不必从超类中专门调用构造函数。你没有试过吗?我想让子类的构造函数使用超类方法。。还是我找错树了。埃森