public class Coordinate {
public int headX, headY;
Coordinate(int headX, int headY) {
this.headX = headX;
this.headY = headY;
}
public boolean equals(Coordinate c) {
if(this.headX == c.headX && this.headY == c.headY) {
return true;
} else {
return false;
}
}
说明:Coordinate 是一个坐标类,重写equals方法的原因是要比较蛇身是否到达了记录下来的蛇头的转弯点,于是自己重写了equals方法,但是发现没有效果,即使x,y的值一样,返回的也是false。
为了进一步熟悉equals方法,于是自己又先写了下面一个验证的程序:
public class TestEquals {
public static void main(String[] args) {
Dog d1 = new Dog(1);
Dog d2 = new Dog(1);
System.out.println(d1 == d2);
System.out.println(d1.equals(d2));
}
}
class Dog {
int weight;
Dog(int weight) {
this.weight = weight;
}
public boolean equals(Dog d) {
if(this.weight == d.weight) {
return true;
} else {
return false;
}
}
}
当然结果是一样的,为了进一步验证,于是就进一步重写了hashCode()方法:
public int hashCode() {
return 0;
}
因为有时候优先比较的是hashCode码。但是结果还是不行。我只好找回原来看过的马士兵老师的视频教程,才发现自己对这个重写很不熟悉,正确的写法应该是:
public class Coordinate {
public int headX, headY;
Coordinate(int headX, int headY) {
this.headX = headX;
this.headY = headY;
}
public int hashCode() {
return 0;
}
public boolean equals(Object obj) {
if(obj == null) {
return false;
} else {
if(obj instanceof Coordinate) {
Coordinate coo = (Coordinate)obj;
if(this.headX == coo.headX && this.headY == coo.headY) {
return true;
} else {
return false;
}
}
}
return false;
}
}
因为其传递的是Object类型,因此首先必要的是判断他是否为空,然后再判断他是不是自己要的类型:
obj instanceof Coordinate;
如果是则还要首先将其强制转换成自己要的类型。
Coordinate coo = (Coordinate)obj;
接着再进行判断,这样一来程序就正确了。
。。。。。。
剩下就是那个hashCode方法的重写了,这里没有重写hashCode()方法也是行的,所以不太清楚到底什么时候要重写该方法。尚有待考究。。。。。。
下面是网上某个博客找到的资料:
equals方法是Object的重要方法。重写遵循一下原则: