我正在阅读如何在Java中正确覆盖equals,并遇到了这个示例。我的第一个想法是它会通过反身属性,但显然它没有。
由于这一行基本上返回false:if(this != tc) return true;
但是没有检查相同的实例tc1,所以tc1.equals(tc1),它不会传递引用tc1的副本,这意味着它们都指向同一个TestClass对象,因此这个和tc1实际上是指向同一个对象吗?
class TestClass {
int someVar;
TestClass(int i) {
someVar=i;
}
public boolean equals(Object tc) {
if (tc instanceof TestClass && this.someVar == ((TestClass) tc).someVar) {
if (this != tc) {
return true;
} else {
return false;
}
}
return false;
}
public int hashCode() {
return 1;
}
}
public class HashDemo {
public static void main(String []args) {
TestClass tc1 = new TestClass(20);
System.out.println(tc1.equals(tc1));
}
}
答案 0 :(得分:3)
我认为你已经转了一些if语句。
此处的常规等于方法看起来像这样。
public boolean equals(Object that){
if (this == that) {
return true;
}
if (that instanceof TestClass && this.someVar == ((TestClass) that).someVar ) {
return true;
}
return false;
}
答案 1 :(得分:-2)
这显然不是覆盖equals方法的正确方法,但它允许您指出" =="之间的差异。和#34;等于"对象
两个引用之间的平等是用" =="运营商。 equals方法用于通过值测试egality,这就是为什么你可以根据你的功能需要覆盖它。
关于您的代码: