Java 实际对象类型和对象引用之间的继承关系

Java 实际对象类型和对象引用之间的继承关系,java,oop,inheritance,Java,Oop,Inheritance,例如,我创建了如下对象: BankAccount b = new BankAccount(); // let's pretend this is a SavingsAccount b.addInterest(); BankAccount b=new SavingsAccount() 现在让我们假设我想访问一个方法addInterest(),它位于我必须执行的SavingsAccount类中:((SavingsAccount)b) 我的问题是,为什么我必须投下b来保存saccount?b的实际对

例如,我创建了如下对象:

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

现在让我们假设我想访问一个方法
addInterest()
,它位于我必须执行的
SavingsAccount
类中:
((SavingsAccount)b)

我的问题是,为什么我必须投下
b
来保存saccount?
b
的实际对象引用是否已经是
SavingsAccount
类的实例?
BankAccount
如何影响对象本身?我真的很困惑什么类才是真正被实例化的,以及
BankAccount
SavingsAccount
如何帮助对象
b


谢谢你的帮助。多谢各位

如果您有一个
BankAccount
类型变量,它可以有一个
SavingsAccount
或任何其他类型的
BankAccount
,并且只有
SavingsAccount
具有方法
addInterest()
。如果不必强制转换,则可以编写如下代码:

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

那是行不通的。为了防止这种情况发生,编译器必须拒绝调用未在变量类型中定义的方法的程序。

如果您有
BankAccount
类型变量,它可能有
SavingsAccount
或任何其他类型的
BankAccount
,并且只有
SavingsAccount
有方法
addInterest()
。如果不必强制转换,则可以编写如下代码:

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

那是行不通的。为了防止这种情况发生,编译器必须拒绝调用变量类型中未定义的方法的程序。

答案很简单:将b定义为BankAccount类型的对象,而不是SavingsAccount。若方法addInterest()仅在SavingsAccount中定义,则无法在BankAccount实例上调用它


但是,您的SavingsAccount扩展(或实现)了BankAccount,因此您可以在b中存储对BankAccount类型的SavingsAccount的引用,因为SavingsAccount也是一个BankAccount。

答案很简单:您将b定义为BankAccount类型的对象,而不是SavingsAccount。若方法addInterest()仅在SavingsAccount中定义,则无法在BankAccount实例上调用它


但是,您的SavingsAccount扩展(或实现)BankAccount,因此您可以将对SavingsAccount的引用存储在b中,b类型为BankAccount,因为SavingsAccount也是一个BankAccount。

了解声明的类型和运行时类型之间的差异,以及在编译时如何解析方法调用。了解声明的类型和运行时类型之间的差异,以及方法调用的方式调用在编译时解析。