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

问题描述 投票:0回答:5

这个问题在这里已有答案:

我正在尝试在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));
}

所以这是真的,尽管它显然应该是假的。我不知道在这里尝试什么,代码的第一部分尝试匹配内存地址,这应该是假的。另一个if语句试图查看它是否是我们类的一部分,如果是,它将尝试查看这些坐标是否相等而应该返回false。

除此之外,我还有一个小问题:当我们在“somethingelse”上施放Cordes时,这实际意味着什么,不是其他对象已经是对象,为什么我们必须抛出它,为什么这个动作让我们去“theother.x / theother.y”。

提前致谢!

java object instance equals
5个回答
3
投票

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

  private static double x;
  private static double y;

这意味着它们由Cordes的所有实例共享。构造第二个时,它会更改两者的值。如果从这两行中删除static,它应该没问题。


1
投票

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

private double x;
  private double y;

1
投票

这两个字段不应该是static

private static double x;
private static double y;

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


1
投票

通过声明xy静态:

private static double x;
private static double y;

你使它成为一个类变量而不是一个实例变量,这意味着所有实例都具有相同的xy值。 这就是为什么equals适用于Cordes的每个实例。 要修复删除静态修改器。

编辑:至于附带问题:您正在将Object类型的参数传递给equals。你把它投射到Cordes,意思是告诉编译器不仅是Object而且是Cordes类型的对象,可以像对待一样对待。


1
投票

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

所以只需删除静态关键字

private static double x;
private static double y;

您将获得所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.