Java 等于返回false
可能重复:Java 等于返回false,java,Java,可能重复: 我的一位同事今天问了我一个问题,如下所述 编写TestEquals类(自定义或用户定义类),以便代码中的以下s.o.p打印false public class Puzzle3 { public static void main(String[] args) { TestEquals testEquals = new TestEquals(); System.out.println(testEquals.equals(testEquals)); } } 注意
我的一位同事今天问了我一个问题,如下所述 编写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就找不到解决方案。有人知道怎么做吗?使用
public boolean equals(TestEquals equals) {
return false
}
要覆盖equals,您需要输入参数的类型为object,因此上述代码段理论上不是覆盖object方法中的equals,我不知道为什么会有人想这样做。但您可以创建如下所示的方法:
public boolean equals(SuperEquals equals) { return false; }
如果
SuperEquals
是TestEquals
的任何超类,但不是上面提到的Object
,您可以编写如下方法:
public boolean equals(TestEquals e) {
return false;
}
此外,如果TestEquals
可以扩展其他对象:
public TestEquals extends Something {
}
public Something {
@Override public boolean equals(Object o) {
return false;
}
}
编辑:显然是在另一个线程中首先想到这个想法的,但我将把它留在这里,因为这段代码要简单得多
这种可怕的黑客攻击不会覆盖或重载与
equals
有关的任何内容,但是创建TestEquals
实例的行为会导致加载包装系统的类。out
,因此以't'
开头的任何后续打印都会导致错误
打印,而不是前4个字节。(假设默认编码不是超奇异的。)在我的iPad上……策略应该类似于让aun属性在每次使用它时都会被修改。如果该属性是通过getter On equals访问的,这将起作用。您提到equals不能被重写,因此属性应该是私有的,并且在读取值之前和之后对值进行修改,以确保无论它是equals的第一部分还是第二部分都有效
类似于(抱歉出现语法错误):
这不是家庭作业?允许超载吗?重复的得到了两张反对票,接受的答案只有四张赞成票。“是什么让这个问题这次变得更好了?”马巴我也这么想。最初的问题(不是这一个)措辞相当严厉,没有介绍。我想人们对那种事情很敏感。一旦这个问题被否决,访问它的人就会减少,因此答案的得票率也会下降。@maba这很奇怪。看起来他们俩在同一个班。也许人们在接近周末的时候感觉更亲切了……如果你愿意,它还可以返回一个
字符串。@DuncanJones好的一点是我没有想到+1会指出+1是为了跳出框框思考。第一个签入Object.equals(Object obj)是如果(this==obj)返回true
。
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);
}
}
}));
}
}
public class TestEquals{
private int id;
public int getId(){
int temp;
id++;
temp=id;
id++;
return temp;
}
}