2016-04-10 42 views
-3

我已经实现了一个类点,我想看看类的对象是否相等或不使用==运算符。我研究并找到了几个解决方案,告诉我重写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)...

+2

这是因为'equals'和'=='测试了不同的东西。 'equals'测试相等性(可以用每个类的自定义方式定义),'=='测试标识(不能)。 –

+2

事实上 - 你不能在Java中重载运算符。 –

+0

在这个论坛上有很多关于如何重写equals方法的问题,以便使用==运算符为您自己的自定义类定义相等的方法,然后不会比较地址,而是使用重写的equals方法的实现。 – Maxincredible52

回答

0

运营商==equals方法不以任何方式相互连接。您可以(也应该)重写equals方法来实现逻辑等式的检查。

==运营商将始终执行检查参考相等。这样你可以检查两个对象是否不仅仅意味着同一个事物,而是实际上是同一个对象。这是设计。

1

====运算符只是对象的比较引用。你不能重载这个操作符。

你可以阅读官方java tutorial

+0

如果他们可以阅读这个答案,你的观点是什么?只是标记为重复。 – Savior

+0

@Pillar,我在回答后添加此链接。我将它标记为重复。 – IntFloat

0

==比较对象的引用。该运算符的完整规范是here