java - 向下转型和向上转型对象以及动态方法绑定(bind)

标签 java

当我执行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/

相关文章:

java - AWS EBS快照,有没有办法知道EBS当前是否正在写入

java - 为 Spring 的 spring-azure-starter-storage 配置 HTTPS 连接

java - 收集一段时间内每个月的天数

java - 如何获得转换文本的边界框(java)?

java - 如何在 netbeans 中创建 package-info.java 文件?

java - 删除重复项,同时保持并行列表同步

java - TypeError : jQuery. 大气未定义 Packed.js:2261

java - 链表实现不形成链接(java)

java - Java8-Streams 中的 GroupingBy

java - Jdo(datanucleus)integer_idx列和数据绑定(bind)