等于返回false

时间:2012-08-30 18:41:53

标签: java

  

可能重复:
  Returning false from Equals methods without Overriding

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

编写TestEquals类(自定义或用户定义的类),以便代码中的下面的s.o.p打印false

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

注意:您无法覆盖equals方法。

我想了很多,但没有超越equals就找不到解决方案。有人知道如何做到这一点吗?

5 个答案:

答案 0 :(得分:17)

使用

public boolean equals(TestEquals equals) {
    return false
}

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

答案 1 :(得分:11)

编辑:显然someone else首先在另一个线程上得出了这个想法,但我会把它留在这里,因为这段代码非常简单。


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);
        }
      }
    }));
  }
}

这个可怕的黑客不会覆盖或重载与equals有关的任何内容,但创建TestEquals实例的行为会导致类加载包裹System.out以便随后的任何内容以't'开头的打印将导致打印"false"而不是前4个字节。 (假设默认编码不是超级异国情调。)

答案 2 :(得分:1)

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

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

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

public TestEquals extends Something {
}

public Something {
    @Override public boolean equals(Object o) {
        return false;
    }
}

答案 3 :(得分:0)

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

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

其中SuperEqualsTestEquals但不是Object的任何超类。

答案 4 :(得分:-1)

在我的iPad上...策略应该类似于每次进行上传时都会修改aun属性。如果通过等号上的getter访问该属性,这将有效。你提到equals不能被覆盖所以属性应该是私有的,并且值的修改发生在读取值之前和之后,以确保它无论是否是equals的第一部分或第二部分都可以工作。 / p>

有点像(抱歉任何语法错误):

public class TestEquals{

 private int id;

 public int getId(){
    int temp;
    id++;
    temp=id;
    id++;
    return temp;
 }
}