重载Object类的equals()方法

时间:2015-12-29 20:19:40

标签: java

当我学习java时,我发现如果我的类的实例具有可比性,我应该重写equals()(在类Object中定义)方法,以确定我的类中的两个对象是否有意义相等.Probaby是一个属性实例可以用来比较 对于传递给equals()方法的leagal override参数,必须是Object类型。例如。

class Moof {
      private int moofValue;
      Moof(int val) {
        moofValue = val;
      }

      public int getMoofValue() {
        return moofValue;
      }

      public boolean equals(Object o) {      // Line-1
        if ((o instanceof Moof) && (((Moof)o).getMoofValue()
             == this.moofValue)) {
          return true;
        } else {
           return false;
        }
      }

我称之为

        Moof one = new Moof(8);
        Moof two = new Moof(8);
        if (one.equals(two)) {
          System.out.println("one and two are equal");
        }

如果我使用public boolean equals(Moof o),则在第1行,它将不再是重写方法&成为一个重载的方法。但它会改变任何预期的功能吗?为什么建议使用Object作为equals中的参数,使用正在比较对象的类本身会有什么危害吗? 我可以想到的一个原因是,如果有人称之为one.equals((Object)two))它会调用对象的等于方法而不是我们的等于。但是为什么有人会这样称呼呢?

1 个答案:

答案 0 :(得分:2)

所有的收藏品都会这样称呼它。假设你有一个Moofs列表。该列表是一个通用类。它甚至不知道它存储的对象的类型。因此,如果您尝试测试列表中是否包含moof,您将调用

list.contains(moof)

该列表将调用moof.equals(theObjectStoredAtIndex0)moof.equals(theObjectStoredAtIndex1)等,直到找到相同的列表。列表唯一知道theObjectStoredAtIndex0的是它是Object类型。因此需要equals()将Object作为参数。

即使你可能会这样做。假设Moof实现了Baz,而Maaf也实现了Baz。并且假设你想测试baz1是否等于baz2。你会做

if (baz1.equals(baz2))

编译器不知道baz1和baz2的具体类型。它只知道它们都是Object的实例,因此以多态方式调用Moof.equals(Object)方法。