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);
AsTest
有一个方法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);