2014-04-15 126 views
0

比如我創建這樣一個對象:繼承關係

BankAccount b = new SavingsAccount();

現在讓我們說,我想訪問的方法addInterest()是在SavingsAccount我必須做的類:((SavingsAccount)b).addInterest();

我有這個問題,爲什麼我必須投b SavingsAccount? b的實際對象引用是否已經是SavingsAccount類的實例? BankAccount如何影響對象本身?我真的很困惑,究竟是什麼類正在實例化,以及如何BankAccountSavingsAccount都能夠幫助使對象b有效。

我很感激任何幫助。謝謝。

+2

閱讀聲明類型和運行時類型之間的差異以及編譯時如何解析方法調用。 –

回答

3

如果你有一個BankAccount類型的變量,它可能有一個SavingsAccount或任何其他種類的BankAccount在裏面,只有SavingsAccount有方法addInterest()。如果你不需要投射,那麼你可以寫一些這樣的代碼:

BankAccount b = new BankAccount(); // let's pretend this is a SavingsAccount 
b.addInterest(); 

這是行不通的。爲了防止這種情況,編譯器必須拒絕調用未在變量類型中定義的方法的程序。

1

答案很簡單:您將b定義爲BankAccount類型的對象,而不是SavingsAccount。如果方法addInterest()僅在SavingsAccount中定義,則無法在BankAccount實例上調用它。

但是,您的SavingsAccount擴展(或實現)BankAccount,因此您可以將引用存儲在BankAccount中的SavingsAccount中,因爲SavingsAccount也是BankAccount。