使用equals方法铸造
我有一个关于在Java中覆盖equals
方法的问题。在我的书中,我下面举个例子:使用equals方法铸造
public class Dog{
private String name;
private int age;
public boolean equals(Object obj) {
if(!(obj instanceof Dog)) return false;
Dog other = (Dog) obj; ---> confused here
if(this.name.equals(other.name) && (this.age == other.age) {
return true;
}
else {
return false;
}
}
}
我不明白,为什么,为什么要参考投射到Dog
参考。如果该参考不是Dog
类型,我们将返回false。为什么所有的麻烦与铸造它?
obj
的声明类型是Object
,所以您必须强制它告诉编译器它是一个Dog
。
虽然在逻辑上它不能在代码中的任何地方,编译器不知道什么关于逻辑 - 它只知道类型。
因为你正在定义你自己的平等参数,你必须确保他们是同一个班级。也就是说,除非您将它们与==
进行比较,否则您需要比较对象中的某个值。要比较对象中的值,它们需要是相同的类型!
例如,假设您有两个Dog
s。
Dog dog1 = new Dog("Fido");
Dog dog2 = new Dog("Rover");
如果你想测试,如果他们有相同的名字,因为我敢肯定你知道,你不能使用:
if(dog1 == dog2)
所以你重写equals方法。但是,因为您压倒了它,所以必须具有相同的方法签名。方法签名由方法的名称以及它的参数的数量和类型定义。这意味着如果你想覆盖它,它需要有一个Object
类型的参数。因此:
if(dog1.equals(dog2))
你需要将它转换为使用您正在使用得到从狗的name
值任何方法,然后比较这些值的原因。
了一份关于你的类设计
在面向对象编程的约定,当然在Java中,是有Accessor
和Mutator
方法来获取和改变一个类变量。那就是:
dog1.name; ----> dog1.getName();
其中getName()
样子:
public String getName()
{
return name;
}
要覆盖equals方法通过value
不reference
检查平等..
也就是说你想两只狗如果相等他们有相同name
和age
不,如果他们是由同一人拥有(即不,如果他们引用是等价的)
没有投你不能访问狗的name
和age
成员
对于JVM是不是很明显该obj是狗,所以你必须明确演员。
因为方法参数obj
是Object
类的实例。因此在方法体中,您需要将obj
重新转换回Dog
类型。
属性name
和age
仅特定于Dog
。您不能通过使用obj
访问name
或age
,这是一个Object
。对于恩,下面的代码将产生编译时错误:
this.name.equals(obj.name)
我不明白,为什么,为什么要参考投射到狗参考。如果该参考文献不属于类型,我们将返回false。为什么所有的麻烦与铸造它?
因为虽然参考是Dog
它并不意味着它是相同的狗。其他狗的名字可能与您的Dog
不一样。为了将其他Dog
的name
和age
与您的Dog
进行比较,必须首先进行施工。
我认为你的演示类缺少一个hashCode()方法。如果两个对象对被重写的hashCode()的调用相等,则它们只能相等。 (相同的整数值)。
我很确定你需要两者来保证这个等式。
不要忘记obj == null。和你的问题没有关系,但你可以返回this.name.equals(other.name)&&(this.age == other.age) – ssedano 2013-05-11 13:15:12
由于这个Equals只接受一个参数,所以这是一个重写Dog类这相当于期待Dog类型的对象。如果你传递另一种类型的对象,那么总是会返回false,这是极限编程的一部分,它确保避免任何预期的运行时间故障。 – 2013-05-11 13:19:45
如果你可以提出如何在没有强制转换的情况下编写代码,记住'obj'的编译时类型是'Object',那么回答这个问题会更简单。 – 2013-05-11 13:20:24