【问题标题】:Why compiler showing error为什么编译器显示错误
【发布时间】:2013-12-09 09:54:51
【问题描述】:
以下是代码
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);
}
}
错误:类 javaapplication1.Hotel 中的方法书无法应用于给定类型;
必填:无参数
找到:int
原因:实际参数列表和形式参数列表的长度不同
为什么编译器会报错?方法重载/覆盖编译器的哪个规则适用?
您的回复将不胜感激!!!
【问题讨论】:
标签:
java
polymorphism
overloading
overriding
【解决方案1】:
hotel 是 Hotel 类型,没有 book(int) 方法。
如果您想调用book(int),您需要将hotel 的类型更改(或转换)为Test
Test hotel = new Test();
hotel.book(2); // No error
【解决方案2】:
您正在使用重载,这是一种编译时多态性。所以当编译器看到
酒店.book(2);
它需要 Hotel 的 book 方法版本(记住它的编译时间)。由于酒店的 book 方法版本不包含任何参数,它认为这个调用是无效的,因此是错误的。
【解决方案3】:
您正在创建Hotel 的对象而不是Test 并调用函数book(int),这是Test 中描述的方法。
Test 的方法不适用于Hotel 的对象。如果你使用:
Hotel hotel = new Hotel();
hotel.book();
那么没关系,使用book(int),你应该创建一个Test的对象。
Test hotel = new Test();
hotel.book(2);
因为Test 有一个方法book(int),它不会覆盖超类方法。因此,您应该创建一个Test 的对象才能访问book(int)。
父类的对象只能调用被子类覆盖的子类的方法。
【解决方案4】:
这里我们实际上是使用父类酒店引用子类对象。
但是 book(int) 只在子类中,所以我们不能使用父引用。
如果酒店类中有方法 book(int) 则没问题,子类方法将覆盖酒店类。
要么
1.测试t=新测试();
t.book(2);
2.hotel类类有book(int)方法然后
酒店 t=new Test();
t.book(2)
两种情况下子类方法都可以工作,第二种情况下子类覆盖父类书本方法
【解决方案6】:
类 Hotal 不知道方法 public void book(int size) ,并且对于调用,您使用的是 Hotel 的引用。
运行时多态性只不过是为所有实现基类/接口的人定义一个契约。这使对象能够在不知道其确切类型的情况下相互交互。在您的情况下,基类没有book(int) 的合同,这是子类的自己的财产。
作为快速修复,您可以尝试这样的事情,
if(hotel instanceof Test){
((Test)hotel).book(2); // Compiler show error
}
或
Test hotel = new Test();
test.book(2);
无论多么理想,您都应该在 Hotel 类中声明/定义此方法