5

可能重复:
从 Equals 方法返回 false 而不覆盖

我的一位同事今天问了我一个问题,如下所述

编写 TestEquals 类(自定义或用户定义的类),以便代码中的以下 sop 打印false

public class Puzzle3 {
  public static void main(String[] args) {
    TestEquals testEquals = new TestEquals();
    System.out.println(testEquals.equals(testEquals));
  }
}

注意:您不能覆盖 equals 方法。

我想了很多,但如果不覆盖 equals 就找不到解决方案。有人知道怎么做吗?

4

5 回答 5

17

利用

public boolean equals(TestEquals equals) {
    return false
}

要覆盖等于,您需要输入参数为对象类型,因此上述代码片段理论上不会覆盖对象方法中的等于

于 2012-08-30T18:47:15.173 回答
11

编辑:显然其他人首先在另一个线程上提出了这个想法,但我将把它留在这里,因为这段代码要简单得多。


class TestEquals {

  static {
    System.setOut(new PrintStream(new FilterOutputStream(System.out) {
      public void write(byte[] buf, int pos, int len) throws IOException {
        if (len >= 4 && buf[pos] == 't') {
          out.write(new byte[] {
              (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e'
            });
          out.write(buf, pos + 4, len - 4);
        } else {
          out.write(buf, pos, len);
        }
      }
    }));
  }
}

这种可怕的equalshack不会覆盖或TestEquals重载System.out与. (假设默认编码不是超级奇特的东西。)'t'"false"

于 2012-08-30T18:56:57.727 回答
1

如上所述,您可以编写如下方法:

public boolean equals(TestEquals e) {
    return false;
}

此外,如果TestEquals可以扩展一些其他对象:

public TestEquals extends Something {
}

public Something {
    @Override public boolean equals(Object o) {
        return false;
    }
}
于 2012-08-30T18:51:24.893 回答
0

我不知道为什么有人想这样做。但是您可以创建一个方法,如下所示:

public boolean equals(SuperEquals equals) { return false; }

但不是SuperEquals的任何超类在哪里。TestEqualsObject

于 2012-08-30T18:47:19.083 回答
-1

在我的 iPad 上...策略应该类似于每次执行 get 时都会修改 aun 属性。如果通过 equals 上的 getter 访问该属性,这将起作用。您提到 equals 不能被覆盖,因此该属性应该是私有的,并且值的修改发生在读取值之前和之后,以确保它无论是 equals 的第一部分还是第二部分都有效。

类似的东西(对不起任何语法错误):

public class TestEquals{

 private int id;

 public int getId(){
    int temp;
    id++;
    temp=id;
    id++;
    return temp;
 }
}
于 2012-08-30T19:02:06.000 回答