Java 重写equals()方法

Java 重写equals()方法,java,class,object,overriding,downcast,Java,Class,Object,Overriding,Downcast,及 我对那些代码有问题。我有两个问题。首先,在第一个示例中,我知道equals()没有被重写。在main方法中,我创建了circle1和circle2对象,其声明的类型是对象。然后我们调用equals()方法,但equals()方法只接受声明类型为Circle的参数。怎么可能呢?代码正在运行,没有任何问题 第二,当我试图运行代码时,我在控制台中得到了第一个示例的“false”,第二个示例的“true”。你能解释一下这些代码背后的逻辑吗?我们要证明什么?当我将equals()方法的签名从一个圆更改

我对那些代码有问题。我有两个问题。首先,在第一个示例中,我知道equals()没有被重写。在main方法中,我创建了circle1和circle2对象,其声明的类型是对象。然后我们调用equals()方法,但equals()方法只接受声明类型为Circle的参数。怎么可能呢?代码正在运行,没有任何问题


第二,当我试图运行代码时,我在控制台中得到了第一个示例的“false”,第二个示例的“true”。你能解释一下这些代码背后的逻辑吗?我们要证明什么?当我将equals()方法的签名从一个圆更改为一个对象圆时,发生了什么变化?

第一个方法甚至没有调用您的方法,因为您将对象类型作为引用传递,而该引用与您的方法签名不匹配,而是使用对象的equals

你可以试着理解:

  class Deneme{
     public static void main(String[] args) {

       Object circle1 = new Circle();
       Object circle2 = new Circle();
       System.out.println(circle1.equals(circle2));

      }
 }

  class Circle{
     double radius;
       @Override
       public boolean equals(Object circle) {
         return this.radius == ((Circle)circle).radius;
      }
  }

第一种方法甚至没有调用您的方法,因为您将对象类型作为引用传递,该引用与您的方法签名不匹配,而是使用对象的equals

你可以试着理解:

  class Deneme{
     public static void main(String[] args) {

       Object circle1 = new Circle();
       Object circle2 = new Circle();
       System.out.println(circle1.equals(circle2));

      }
 }

  class Circle{
     double radius;
       @Override
       public boolean equals(Object circle) {
         return this.radius == ((Circle)circle).radius;
      }
  }

在第一个示例中,您方法,
对于重写,必须保存equals方法的原始签名,如第二个示例中所示。

在第一个示例中,您该方法,
对于重写,必须保存equals方法的原始签名,如第二个示例所示。

重写equals时,请尝试以下操作。有必要检查空值和不正确的类型,以防止
NPE的
引发异常

class Circle{
    double radius;

    public boolean equals(Circle circle) {
        System.out.println("This is not getting invoked");
        return this.radius == circle.radius;
    }
}

要记住的要点是,equals方法的类型是
对象
,而不是您的
类类型

,当重写equals时,请尝试以下操作。有必要检查空值和不正确的类型,以防止
NPE的
引发异常

class Circle{
    double radius;

    public boolean equals(Circle circle) {
        System.out.println("This is not getting invoked");
        return this.radius == circle.radius;
    }
}


要记住的要点是equals方法的类型是
Object
,不是您的
类类型

仅供参考-按照惯例,您应该始终以大写字母开始类名,并使用@Override注释。如果使用对象的默认方法子类化或执行某些操作,您通常会覆盖@Override注释。您必须传递一个对象,并检查它的类型以及它是否是圆类本身中的
。Joshua Bloch,《高效Java》一书是很好的参考资料。另外,当你定义circle1和circle2时——它们是对象——为什么不把它们也定义为一个圆呢?你还需要理解重写和重载之间的区别!当方法签名相同(参数和返回值)时进行重写-因为您没有相同的入站参数类型-您正在做的是重载方法签名。谢谢,我编辑了。实际上我知道重写和重载的区别。此示例摘自Y.Daniel Liang的java书籍。我不明白为什么第一个示例在控制台上键入“false”。现在我知道了为什么.FYI-按照惯例,您应该总是以大写字母开始类名,并使用@Override注释。如果使用对象的默认方法子类化或执行某些操作,您通常会覆盖@Override注释。您必须传递一个对象,并检查它的类型,以及它是否是圆类本身中的
this
。Joshua Bloch,《高效Java》一书是很好的参考资料。另外,当你定义circle1和circle2时——它们是对象——为什么不把它们也定义为一个圆呢?你还需要理解重写和重载之间的区别!当方法签名相同(参数和返回值)时进行重写-因为您没有相同的入站参数类型-您正在做的是重载方法签名。谢谢,我编辑了。实际上我知道重写和重载的区别。此示例摘自Y.Daniel Liang的java书籍。我不明白为什么第一个示例在控制台上键入“false”。现在我知道为什么了。@WJS的问题应该有答案。把代码贴在评论里,我就上钩了。坦率地说,我认为在发表评论和提交答案之间只有一线之隔。我想,我已经超出了我的门槛,可以举一个例子来说明answerequals需要向它传递一个对象——这可能就是为什么其他人对你投了反对票!(顺便说一句,我不是!)因为当你检查等式时,你也应该检查它是圆的
实例,以及
这个
是的,我读到了。这只是为了回答为什么OP的代码不起作用。同意所有最佳实践谢谢您的回答@dhrubajyotigogi@WJS问题应该有答案。把代码贴在评论里,我就上钩了。坦率地说,我认为在发表评论和提交答案之间只有一线之隔。我想,我已经超出了我的门槛,可以举一个例子来说明answerequals需要向它传递一个对象——这可能就是为什么其他人对你投了反对票!(顺便说一句,我不是!)因为当你检查等式时,你也应该检查它是圆的
实例,以及
这个
是的,我读到了。这只是为了回答为什么OP的代码不起作用。同意所有最佳实践谢谢您的回答@dhrubajyotigogi。现在也添加@Override!如果重写equals,还必须重写
hashCode
。@user85421如果
Circle
的子类重写
equals
以更改语义,则会破坏对称性<代码>实例of
是正确的选择。哈希代码已修复。谢谢无论是否在equals中使用
instanceof
,Java13的强大功能仍然使用它,即使是非final类。如果他们改变它,可能会破坏现有的实现。JavaDoc for hashCode通常会说您应该覆盖它,这听起来不像是一个命令。现在也添加@override!如果重写equals,还必须重写hashCode