使用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。为什么所有的麻烦与铸造它?

+0

不要忘记obj == null。和你的问题没有关系,但你可以返回this.name.equals(other.name)&&(this.age == other.age) – ssedano 2013-05-11 13:15:12

+0

由于这个Equals只接受一个参数,所以这是一个重写Dog类这相当于期待Dog类型的对象。如果你传递另一种类型的对象,那么总是会返回false,这是极限编程的一部分,它确保避免任何预期的运行时间故障。 – 2013-05-11 13:19:45

+2

如果你可以提出如何在没有强制转换的情况下编写代码,记住'obj'的编译时类型是'Object',那么回答这个问题会更简单。 – 2013-05-11 13:20:24

obj的声明类型是Object,所以您必须强制它告诉编译器它是一个Dog

虽然在逻辑上它不能在代码中的任何地方,编译器不知道什么关于逻辑 - 它只知道类型。

+0

真相被告知,编译器*可能在这种简单的情况下知道它。 – 2013-05-11 13:34:03

+1

@MarkoTopolnik编译器可以做很多事情,但是可以在某处绘制线...... – Bohemian 2013-05-11 13:35:10

+2

事实上,不同的语言绘制线条的方式不同。例如在锡兰,演员[不需要](http://ceylon-lang.org/documentation/1.0/tour/types/)。 – meriton 2013-05-11 13:38:32

因为你正在定义你自己的平等参数,你必须确保他们是同一个班级。也就是说,除非您将它们与==进行比较,否则您需要比较对象中的某个值。要比较对象中的值,它们需要是相同的类型!

例如,假设您有两个Dog s。

Dog dog1 = new Dog("Fido"); 
Dog dog2 = new Dog("Rover"); 

如果你想测试,如果他们有相同的名字,因为我敢肯定你知道,你不能使用:

if(dog1 == dog2) 

所以你重写equals方法。但是,因为您压倒了它,所以必须具有相同的方法签名。方法签名由方法的名称以及它的参数的数量和类型定义。这意味着如果你想覆盖它,它需要有一个Object类型的参数。因此:

if(dog1.equals(dog2)) 

你需要将它转换为使用您正在使用得到从狗的name值任何方法,然后比较这些值的原因。

了一份关于你的类设计

在面向对象编程的约定,当然在Java中,是有AccessorMutator方法来获取和改变一个类变量。那就是:

dog1.name; ----> dog1.getName(); 

其中getName()样子:

public String getName() 
{ 
    return name; 
} 

要覆盖equals方法通过valuereference检查平等..

也就是说你想两只狗如果相等他们有相同nameage,如果他们是由同一人拥有(即不,如果他们引用是等价的)


没有投你不能访问狗的nameage成员

对于JVM是不是很明显该obj是狗,所以你必须明确演员。

因为方法参数objObject类的实例。因此在方法体中,您需要将obj重新转换回Dog类型。

属性nameage仅特定于Dog。您不能通过使用obj访问nameage,这是一个Object。对于恩,下面的代码将产生编译时错误

this.name.equals(obj.name) 

我不明白,为什么,为什么要参考投射到狗参考。如果该参考文献不属于类型,我们将返回false。为什么所有的麻烦与铸造它?

因为虽然参考是Dog它并不意味着它是相同的狗。其他狗的名字可能与您的Dog不一样。为了将其他Dognameage与您的Dog进行比较,必须首先进行施工。

我认为你的演示类缺少一个hashCode()方法。如果两个对象对被重写的hashCode()的调用相等,则它们只能相等。 (相同的整数值)。

我很确定你需要两者来保证这个等式。