当我执行account1.equals(account2)
时,我必须在equals()
方法中将account2向下转换回其子类引用BankAccountcompareAccount = (BankAccount)obj;
,以便我可以访问子类字段。一旦我向下转换它,我就可以执行 compareAccount.accountAmount
现在我的问题
但是,在此脚本中,我不需要向下转换 account1 对象即可在 equals()
方法中使用其字段。我想既然我已经将它向上转换为对象 Object account1 = new BankAccount(300.22, 122222)
我将无法看到它的字段,因此,this.accountAmount
将无法工作,直到我向下转换回子类。 那这是为什么呢,为什么account1不需要向下转型呢?
public class BankAccountDemo
{
public static void main(String[] args)
{
Object account1 = new BankAccount(300.22, 122222);
Object account2 = new BankAccount(333.10, 23432434);
if(account1.equals(account2))
{
System.out.println("The objects are equals");
}
else
{
System.out.println("These objects are not equal");
}
}
}
对象类别
public class BankAccount
{
private double accountAmount;
private int accountNumber;
public BankAccount(double accountAmount, int accountNumber)
{
this.accountAmount = accountAmount;
this.accountNumber = accountNumber;
}
@Override
public boolean equals(Object obj)
{
BankAccount compareAccount = (BankAccount)obj;
boolean result;
if (this.accountAmount == compareAccount.accountAmount && this.accountNumber == compareAccount.accountNumber)
{
result = true;
}
else
{
result = false;
}
return result;
}
}
最佳答案
原因是简单地调用了 BankAccount
的 equals 方法。因此,这个方法自然可以访问类的所有成员。
调用了BankAccount
的equals方法
Object account1 = new BankAccount(300.22, 122222);
Object account2 = new BankAccount(333.10, 23432434);
if(account1.equals(account2)) { … }
因为方法始终是虚拟的,因此会调用实例类型 account1
(BankAccount
) 的 equals
方法 - 而不是声明的类型 (Object
)。
但是,您应该考虑重新考虑您的设计。搜索如何编写 equals
的说明。
特别是,只有在确保参数是 instanceof BankAccount
或至少 BankAccount 是 assignable from 后,才将参数强制转换为 BankAccount
。对象的类。
关于java - 向下转型和向上转型对象以及动态方法绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38999717/