Java 为什么编译器显示错误

Java 为什么编译器显示错误,java,polymorphism,overloading,overriding,Java,Polymorphism,Overloading,Overriding,下面是代码 class Hotel { public int bookings; public void book() { bookings++; } } public class Test extends Hotel{ public void book() { bookings--; } public void book(int size) { book(); super.book(); bookings += size; } pu

下面是代码

class Hotel {
 public int bookings;
 public void book() {
    bookings++;
 }
}

public class Test extends Hotel{
 public void book() {
    bookings--;
 }

 public void book(int size) {
    book();
    super.book();
    bookings += size;
 }

 public static void main(String... args) {
   Hotel hotel = new Test();
   hotel.book(2);  // Compiler show error
    System.out.print(hotel.bookings);
 }        
}       
Erorr:类javaapplication1中的方法书。Hotel不能应用于给定类型

必需:无参数

找到:int

原因:实际参数列表和正式参数列表长度不同

编译器为什么抱怨?正在应用哪个方法重载/重写编译器规则?


感谢您的回复

hotel
属于
hotel
类型,而没有
book(int)
方法

如果您想调用
book(int)
您需要将
hotel
的类型更改为
Test

   Test hotel = new Test();
   hotel.book(2);  // No error

因为编译器看到
hotel
的类型是
hotel
,而
hotel
没有
book(int)
的函数:但是如果我们将其强制转换为
Test
并在其上调用
book(int)

((Test)hotel).book(2);

我们不会有错误。该行为可以从第节中解释。

您正在使用重载,这是一种编译时多态性。所以当编译器看到 酒店预订(2);
它需要酒店版本的book方法(记住它的编译时间)。由于hotel版本的book方法不包含任何参数,因此它认为此调用无效,因此出现错误

您正在使
Hotel
的对象不是
Test
并调用函数
book(int)
,这是
Test
中描述的方法

测试方法
不适用于
酒店
的对象。如果您使用:

Hotel hotel = new Hotel();
hotel.book();
那么,使用
book(int)
就可以了,您应该已经创建了
Test
的对象

Test hotel = new Test();
hotel.book(2);
As
Test
有一个方法
book(int)
,它不重写超类方法。因此,您应该创建一个
Test
对象,以便访问
book(int)

超类的对象只能调用被子类重写的子类的方法


Class
Hotal
不知道方法
公共作废簿(int-size)
,调用时使用
Hotel
的参考

运行时多态性只是为实现基类/接口的所有人定义一个契约。这使对象能够在不知道其确切类型的情况下彼此交互。在您的情况下,基类没有
book(int)
的契约,这是子类自己的属性

作为快速解决方案,你可以试试这样的东西

 if(hotel instanceof  Test){
       ((Test)hotel).book(2);  // Compiler show error
   }


无论如何,您应该在
Hotel
class

中声明/定义此方法。在这里,我们实际使用的是子类对象的父类hotels引用。 但是book(int)只在子类中,所以我们不能使用父引用。 如果hotel类中有一个方法书(int),那么它是OK的,子类方法将重写hotel类

或者 1.试验t=新试验(); t、 书籍(2); 2.酒店类有预订(int)方法吗 酒店t=新测试(); t、 书籍(2) 在这两种情况下,子类方法都可以工作,在第二种情况下,子类重写父类book方法

  Test hotel = new Test();
   test.book(2);