2013-12-09 67 views
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方法書不能被應用到給定的類型;

要求:無參數

發現:整數

原因:實際的和正式的參數列表長度

不同的編譯器爲什麼抱怨? Method Overload/Overriding編譯器的哪條規則正在應用?

您的迴應將被讚賞!

回答

7

hotelHotel類型,它沒有book(int)方法。

如果你想打電話book(int)你需要改變(或CAST)hotel的類型Test

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

您正在使用重載,這是一個編譯時多態性。所以當編譯器看到 hotel.book(2);它預計酒店版本的書本方法(記住它的編譯時間)。由於酒店版本的book方法不包含任何參數,因此它將此調用視爲無效,因此也是錯誤。

1

您正在使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)

超類的對象只能調用被子類覆蓋的子類的方法。

1

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); 

如何過ideall,你應該聲明/ defning這種方法Hotel

1

這裏我們實際上是使用父級酒店refernce或子類對象。 但書(int)只在子類中,所以我們不能使用父親引用。 如果在酒店類中有方法書(int),那麼它是okey,並且子類方法將覆蓋酒店類。

要麼 1.Test t = new test(); t.book(2); 2.hotel class class have book(int)method then Hotel t = new Test(); t.book(2) 這兩種情況下的子類方法都會起作用,而在第二種情況下,子類覆蓋父類書的方法

相關問題