【问题标题】: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】:

    hotelHotel 类型,没有 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) 两种情况下子类方法都可以工作,第二种情况下子类覆盖父类书本方法

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案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 类中声明/定义此方法

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-06
                • 2017-01-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多