我已经实现了一个类点,我想看看类的对象是否相等或不使用==运算符。我研究并找到了几个解决方案,告诉我重写Object的equals方法。我读了,但==运营商仍然无法正常工作。如果我使用p1.equals(p2)它虽然工作。谁能告诉我我做错了什么?我甚至试图重写hashCode方法,即使我不打算在容器中使用Point。==运算符无法与覆盖等于方法
实施点:
public final class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (!(other instanceof Point)) {
return false;
}
Point that = (Point) other;
return this.x == that.x && this.y == that.y;
}
@Override
public int hashCode() {
return x + y; //just for testing, equal objects should return same hash?
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
我的测试类:
public class Test {
public static void main(String[] args) {
Point p1 = new Point(1,2);
Point p2 = new Point(1,2);
if(p1.equals(p2)) {
System.out.println("equal");
} else {
System.out.println("not equal");
}
if(p1 == p2) {
System.out.println("equal");
} else {
System.out.println("not equal");
}
System.out.println(p1);
}
}
输出为:
equal
not equal
(1,2)
所以重写toString方法似乎工作,但是这不会是唯一的事情工作是==运营商本身。我试图添加一个sout重写的equals方法,它只会显示它的消息时,我直接执行等于方法由p2.equals(p2)...
这是因为'equals'和'=='测试了不同的东西。 'equals'测试相等性(可以用每个类的自定义方式定义),'=='测试标识(不能)。 –
事实上 - 你不能在Java中重载运算符。 –
在这个论坛上有很多关于如何重写equals方法的问题,以便使用==运算符为您自己的自定义类定义相等的方法,然后不会比较地址,而是使用重写的equals方法的实现。 – Maxincredible52