我有一个关于重载的问题equals
的Java方法。 在我的书中,我有下面的例子:
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
秒。
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
。 您不能访问name
或age
使用obj
,这是一个Object
。 对于恩,下面的代码会生成编译时错误 :
this.name.equals(obj.name)
我不明白为什么,为什么要参考投射到狗参考。 如果引用类型不是狗,我们返回false。 为什么所有铸造它的麻烦?
因为虽然参考的是Dog
它不意味着它是相同的狗。 另一只狗的名字可能不一样的Dog
。 为了比较的name
和age
其他的Dog
与你的Dog
,它必须先投。
我认为,您的演示类缺少的hashCode()方法。 两个对象只能等于如果它们对一个重写的hashCode()调用是相等的。 (相同的整数值)。
我敢肯定,你既需要保证这个等式。