java 中的自反 属性 等于方法

Reflexive property in java Equals method

我正在阅读有关如何将 Java 和 运行 中的等号正确覆盖到此示例中的信息。我的第一个想法是它会通过自反 属性,但显然它不会。

它基本上 returns 错误,因为这一行:if(this != tc) return true;

但是没有检查同一个实例 tc1,所以 tc1.equals(tc1),它不会传递引用 tc1 的副本吗,这意味着它们都指向同一个 TestClass 对象,因此this 和 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));
    }    
}

这显然不是重写 equals 方法的正确方法,但它可以让您指出“==”和 "equals" 在 Objects

上的区别

两个引用之间的相等性是通过“==”运算符完成的。 equals 方法用于通过值来测试平等性,这就是为什么您可以根据您的功能需要覆盖它。

关于您的代码:

  • tc1 == tc1 -> 真
  • tc1.equals(tc1) -> 错误

我想你的一些 if 语句已经转过来了。

这里的常规 equals 方法看起来像这样。

public boolean equals(Object that){
   if (this == that) {
      return true;
   }

   if (that instanceof TestClass && this.someVar == ((TestClass) that).someVar ) {
     return true;
   }

   return false;
}