以下是代码
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中的方法书不能应用于给定的类型; required:找不到参数:int reason:实际和形式参数列表的长度不同
Why compiler is complaining? which rule of Method Overloading/Overriding compiler is applying?
您的回复将得到赞赏!
6 回答
hotel
的类型为Hotel
,其中 doesn't havebook(int)
方法 .如果你想调用
book(int)
,你需要将hotel
的类型更改(或强制转换)为Test
您正在使用重载,这是一个编译时多态 . 所以当编译器看到hotel.book(2);它期望酒店的书籍方法版本(记住它的编译时间) . 由于酒店版本的book方法不包含任何参数,因此它认为此调用无效,因此错误 .
您正在使
Hotel
的对象不是Test
并调用函数book(int)
,这是Test
中描述的方法 .Test
的对象无法使用Test
的方法 . 如果您使用:那么没关系,因为使用
book(int)
,你应该创建一个Test
的对象 .由于
Test
有一个方法book(int)
,它没有覆盖超类方法 . 因此,您应该创建Test
的对象以访问book(int)
.这里我们实际上是使用父类酒店引用的子类对象 . 但是书(int)只在子类中,所以我们不能使用父引用 . 如果在酒店类中有方法书(int),则它是okey,子类方法将覆盖酒店类 .
要么1.Test t = new test(); t.book(2); 2.hotel class class有book(int)方法然后Hotel t = new Test(); t.book(2)两种情况下的子类方法都可以工作,而在第二种情况下,子类覆盖父类的方法
因为编译器看到
hotel
的类型为Hotel
而Hotel
没有book(int)
的函数:但是如果我们将它转换为Test
并在其上调用book(int)
:我们不会有错误 . 可以从jls:15.12.2. Compile-Time Step 2: Determine Method Signature部分解释该行为 .
类
Hotal
不知道方法public void book(int size)
,对于调用,您使用的是Hotel
的引用 .运行时多态性只不过是为实现基类/接口的所有人定义 Contract . 这使得对象能够在不知道其确切类型的情况下彼此交互 . 在你的情况下,基类没有
book(int)
的 Contract ,这是子类的自有属性 .作为快速解决方案,您可以尝试这样的事情,
要么
无论如何,你应该在
Hotel
类中声明/定义这个方法