为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解

我们还是写一个案例,来探讨它的作用。

写三个类,一个是子类Child.class,一个是父类Person.class,一个是测试类Test.class

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第1张图片

Person父类很简单,就一个属性code;

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第2张图片

Child子类也很简单,继承了父类之后,自己也是定义了一个属性name;

Test类:

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第3张图片

创建了两个Child,属性code是不一样的,一个是c1,一个是c2,但是name是相同的,都是“小毛孩”,然后我们现在也没有在子类Child类上加注解@EqualsAndHashCode(callSuper = true),我们看看运行结果是如何,通过运行结果来分析。

运行结果:

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第4张图片

第一个== 是false,我相信大家都懂,因为new了两个对象,就会在堆中创建出两个地址不同的对象;

第二个equlas是true,我相信大家是有点疑问的,equals比较的是两个对象的内容值,但是现在这两个对象的内容

一个child1的code是c1,name是“小毛孩”;

一个child2的code是c2,name是“小毛孩”;

那么他们的内容值是不同的,为什么最终结果还是true呢?

原因可能就是和注解EqualsAndHashCode(callSuper = true)有关吗,我们先不着急下结论,我们现在先在子类Child的类上加上这个注解试试。

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第5张图片

看到没有,@Data注解下面也不会有提示曲线了。

我们再次点击运行。看看运行结果。

运行结果:

为什么需要在bean上使用@EqualsAndHashCode(callSuper = true)这个注解_第6张图片

结果变了,都是false了。所以原因就是这个注解搞的鬼。

注解EqualsAndHashCode(callSuper = true)的作用就是,如果你没在子类的类上加上的话,那么它是会忽略父类继承过来的属性的,只会关注子类自身的属性。所以一开始两个child虽然他们的code是不同的,name是相同的,但是由于没加上这个注解,忽略了父类的code,只会关注子类Child的name,就会就是true了。

总结:

@EqualsAndHashCode(callSuper = true)的作用就是不会忽略父类的属性,也会对父类的属性进行比较。

最后:

如果大家觉得这篇文章对你们有所帮助的话,麻烦点个免费的赞赞,也祝各位码农在未来的IT道路上越走越远,谢谢!

你可能感兴趣的:(java,开发语言)