java Equals方法中的自反性

java Equals方法中的自反性,java,reference,equals,Java,Reference,Equals,我正在阅读如何在Java中正确重写equals,并在本示例中运行。我的第一个想法是它会通过反射属性,但显然它不会 它基本上返回false,因为这一行:if(this!=tc)返回true 但是,如果不检查同一个实例tc1,那么tc1.equals(tc1)会不会传递引用tc1的副本,这意味着它们都指向同一个TestClass对象,因此this和tc1本质上指向同一个对象 class TestClass { int someVar; TestClass(int i) {

我正在阅读如何在Java中正确重写equals,并在本示例中运行。我的第一个想法是它会通过反射属性,但显然它不会

它基本上返回false,因为这一行:
if(this!=tc)返回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”之间的差异

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

关于您的代码:

  • tc1==tc1->TRUE
  • tc1.等于(tc1)->FALSE

    • 我想你的一些if声明已经扭转了

      这里的传统方法看起来像这样

      public boolean equals(Object that){
         if (this == that) {
            return true;
         }
      
         if (that instanceof TestClass && this.someVar == ((TestClass) that).someVar ) {
           return true;
         }
      
         return false;
      }
      

      所以,如果它们不相等,那么它们是相等的吗?某个东西怎么能从一行代码中“返回false”
      。。。返回true?不确定您的意思,由于这行代码“if(this!=tc)return true;”@Sotirios,感谢您的注意,因此该代码确实返回false。我实际上是想让这个例子做一些不同的事情,我将调整这个例子。@user1529412这不仅仅是if条件,它返回false是因为紧接着是else条件。如果您使用
      equals
      方法将对象与自身进行比较,它将返回false,因为在这种情况下,您显式测试将返回false。