在Java中遇到多态时如何处理equals

时间:2016-02-24 20:53:19

标签: java polymorphism

我遇到问题,我感到困惑。 这样的事情:

class animal and 
class cat extends animal

现在假设我已经在动物和猫身上覆盖了equals方法。

请参阅:

cat a = new cat("white","Tom")   //cat has specific property name    
cat b = new cat("black","Jim")    
a.equals(b)                      //return false    
animal c = (animal)a             //animal has no name property

c.equals(a)a.equals(c)都返回true

这很奇怪,因为你不能说动物是猫。

我了解到Java中的强制转换不会改变对象的类。所以c.getClass()仍然会回猫。但有什么可以做到这一点?在比较动物与猫时,我想要一个假。

由于

4 个答案:

答案 0 :(得分:2)

Java没有比较引用变量类型;它正在比较他们引用的对象。在您的情况下,Animal aCat c都是Cat。此外,它们都引用完全相同的对象

答案 1 :(得分:0)

您可能希望覆盖超类中的equals方法以实现所需的equals操作。 (即比较包含名称和颜色的字符串)

答案 2 :(得分:0)

在您的密码中:

cat a = new cat("white","Tom")   
cat b = new cat("black","Jim")    
a.equals(b)                       
animal c = (animal)a 

您可以将其视为:

cat a =新猫("白色","汤姆");

+------------+
| white, tom | <--- a (Cat)
+------------+

cat b =新猫(&#34;黑&#34;,&#34;吉姆&#34;);

+------------+
| black, jim | <--- b (Cat)
+------------+

动物c =(动物)a;

+------------+
| white, tom | <--- a (Cat)
+------------+ <--- c (Animal)
  

c.equals(a)和a.equals(c)都返回true

由于ac指的是同一个对象,无论你如何投射,它都将是真的。将其转换为Animal仅仅是告诉编译器&#34;嘿,将此Cat视为动物&#34; (但它仍然指的是同一种动物,因此equals方法总是给你真实的。)

如果您没有覆盖类Object中的equals方法,则默认实现如下所示:

public boolean equals(Object obj) {
    return (this == obj);
}

如果您想通过比较Cat的namecolor来覆盖它,您可以执行以下操作:

public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if(!(obj instanceof Cat))
        return false;
    Cat c = Cat(obj);
    return (this.getName().equals(c.getName()) && this.getColor().equals(c.getColor()));
}

答案 3 :(得分:0)

日常用语:

你问java动物c是否与动物相同。
a.equals(c) Java说因为它是同一种动物。你没有问过Java是否所有的动物都是猫。你问Java这个Animal是不是猫。答案是肯定的,因为它是一只猫(从一开始就是这样)。

如果您创建动物并将其与猫进行比较

Animal a = new Animal();
Cat c = new Cat();
a.equals(c);//This might give you false

你可能会弄错,因为这个动物可能并不总是猫。