首页 文章

为何编译器显示错误

提问于
浏览
2

以下是代码

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 回答

  • 1

    hotel 的类型为 Hotel ,其中 doesn't have book(int) 方法 .

    如果你想调用 book(int) ,你需要将 hotel 的类型更改(或强制转换)为 Test

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

    您正在使用重载,这是一个编译时多态 . 所以当编译器看到hotel.book(2);它期望酒店的书籍方法版本(记住它的编译时间) . 由于酒店版本的book方法不包含任何参数,因此它认为此调用无效,因此错误 .

  • 1

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

    Test 的对象无法使用 Test 的方法 . 如果您使用:

    Hotel hotel = new Hotel();
    hotel.book();
    

    那么没关系,因为使用 book(int) ,你应该创建一个 Test 的对象 .

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

    由于 Test 有一个方法 book(int) ,它没有覆盖超类方法 . 因此,您应该创建 Test 的对象以访问 book(int) .

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

  • 7

    这里我们实际上是使用父类酒店引用的子类对象 . 但是书(int)只在子类中,所以我们不能使用父引用 . 如果在酒店类中有方法书(int),则它是okey,子类方法将覆盖酒店类 .

    要么1.Test t = new test(); t.book(2); 2.hotel class class有book(int)方法然后Hotel t = new Test(); t.book(2)两种情况下的子类方法都可以工作,而在第二种情况下,子类覆盖父类的方法

  • 1

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

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

    我们不会有错误 . 可以从jls:15.12.2. Compile-Time Step 2: Determine Method Signature部分解释该行为 .

  • 1

    Hotal 不知道方法 public void book(int size) ,对于调用,您使用的是 Hotel 的引用 .

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

    作为快速解决方案,您可以尝试这样的事情,

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

    要么

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

    无论如何,你应该在 Hotel 类中声明/定义这个方法

相关问题