向下转换和向上转换对象以及动态方法绑定

时间:2016-08-17 14:40:11

标签: java

当我account1.equals(account2)时,我必须将equals()方法中的account2转发回其子类引用BankAccount compareAccount = (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;
    }
}

1 个答案:

答案 0 :(得分:0)

原因是只调用BankAccount的equals方法。因此,这种方法可以自然地访问所有类的成员。

中调用BankAccount的等于方法
Object account1 = new BankAccount(300.22, 122222);
Object account2 = new BankAccount(333.10, 23432434);
if(account1.equals(account2)) { … }

因为方法总是虚拟的,所以调用实例类型equalsaccount1)的BankAccount方法 - 而不是声明的类型(Object)。

但是,您应该考虑重新考虑您的设计。搜索有关如何编写equals的说明。 特别是,只有在确定参数为BankAccount或至少BankAccount为assignable from对象的类之后,才将参数强制转换为instanceof BankAccount