2014-04-15 114 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。