我遇到问题,我感到困惑。 这样的事情:
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()
仍然会回猫。但有什么可以做到这一点?在比较动物与猫时,我想要一个假。
由于
答案 0 :(得分:2)
Java没有比较引用变量类型;它正在比较他们引用的对象。在您的情况下,Animal a
和Cat 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
由于a
和c
指的是同一个对象,无论你如何投射,它都将是真的。将其转换为Animal
仅仅是告诉编译器&#34;嘿,将此Cat视为动物&#34; (但它仍然指的是同一种动物,因此equals方法总是给你真实的。)
如果您没有覆盖类Object
中的equals方法,则默认实现如下所示:
public boolean equals(Object obj) {
return (this == obj);
}
如果您想通过比较Cat的name
和color
来覆盖它,您可以执行以下操作:
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
你可能会弄错,因为这个动物可能并不总是猫。