如何在Java中修复/实现equals方法?

时间:2019-01-26 07:29:01

标签: java object instance equals

我正在尝试在Java中实现equals方法的扩展。问题是,由于某种原因,它给出了错误的响应。

  public class Cordes{

  private static double x;
  private static double y;

  public Cordes(double x, double y) {
      this.x = x;
      this.y = y;
  }
  public boolean equals(Object somethingelse) {
      if (this == somethingelse) {
          return true;
      }   
      if (somethingelse instanceof Cordes) {
          Cordes theother = (Cordes) somethingelse;
          return (this.x == theother.x)  && (this.y == theother.y);
      }
          return false;
  }

public static void main(String[] args) {
    Cordes p = new Cordes(2.0, 4.0);
    Cordes p2 = new Cordes(3.0, 4.0);
    System.out.println(p.equals(p2));
}

因此,即使它显然应该是错误的,也是如此。我不确定在这里尝试什么,代码的第一部分尝试匹配内存地址,该地址应该为false。另一个if语句尝试查看它是否属于类的一部分,如果是,它将尝试查看这些坐标是否相等,并应返回false。

除此之外,我还有一个小问题:当我们在“ somethingelse”上投射Cordes时,这实际上是什么意思,不是其他对象已经成为对象,为什么我们必须对其进行投射,以及为什么?该操作是否使我们能够进入“ theother.x / theother.y”。

谢谢!

5 个答案:

答案 0 :(得分:3)

您将成员变量声明为静态:

  private static double x;
  private static double y;

这意味着它们被Cordes的所有实例共享。当您构造第二个时,它会更改两个值。如果从这两行中删除static,就可以了。

答案 1 :(得分:1)

从x和y中删除staticstatic变量对于这些类的所有实例都是相同的。

private double x;
  private double y;

答案 2 :(得分:1)

这两个字段不应为static

private static double x;
private static double y;

这些变量应该是instance变量,因为您正在创建不同的对象并进行比较。删除static修饰符,它应该可以工作。

答案 3 :(得分:1)

通过声明xy为静态:

private static double x;
private static double y;

将其设为类变量而不是实例变量,这意味着所有实例都具有相同的xy值。
这就是为什么equals对于Cordes的每个实例都为真的原因。 要修复,请删除静态修饰符。

编辑:关于另一个问题:您正在将Object类型的参数传递给equals。您将其强制转换为Cordes,这意味着告诉编译器不仅是Object,而且是类型为Cordes的对象,可以将其视为一个对象。

答案 4 :(得分:1)

您已将x和y声明为静态变量。因此,当您使用x = 3.0创建对象p2时,它将自动更改对象p的先前x值。

因此只需从

删除静态关键字
private static double x;
private static double y;

您将获得理想的结果。