可能重复:
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就找不到解决方案。有人知道如何做到这一点吗?
答案 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; }
其中SuperEquals
是TestEquals
但不是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;
}
}