我有一个简单的基类,后来由许多单独的类扩展,这可能会引入新的字段,但不一定.我在基类中定义了一个equals方法,但是也为一些子类重写了它.可以在基础/子类中混合定义吗?在我的例子中,它是为了避免代码重复检查相同的字段.

解决方法:

以下是一些问题的简要说明和可能的解决方案:

等同合同说(其中包括):

It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

这意味着如果您的子类引入了新字段并且您正在将基类的对象(或不重写equals的另一个子类)与此子类的对象进行比较,则可能会遇到问题.

请勿执行以下操作:

class BaseClass {

private int field1 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof BaseClass) {

return field1 == ((BaseClass) obj).field1;

}

return false;

}

}

class BadSubClass extends BaseClass {

private int field2 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof BadSubClass) {

return super.equals(obj)

&& field2 == ((BadSubClass) obj).field2;

}

return false;

}

}

因为你得到了

BaseClass baseClass = new BaseClass();

BadSubClass subClass = new BadSubClass();

System.out.println(baseClass.equals(subClass)); // prints 'true'

System.out.println(subClass.equals(baseClass)); // prints 'false'

可能的解决方案:

用类比较替换instanceof-check:

obj != null && obj.getClass() == getClass()

使用此解决方案,BaseClass的对象永远不会等于任何子类的对象.

如果你创建另一个没有equals方法的@Override的SubClass,两个SubClass对象可以相互相等(如果BaseClass.equals检查决定这样)开箱即用,但SubClass对象永远不会等于a BaseClass的对象.

一个好的实施可能如下:

class BaseClass {

private int field1 = 0;

@Override

public boolean equals(Object obj) {

if (obj != null && obj.getClass() == getClass()) {

return field1 == ((BaseClass) obj).field1;

}

return false;

}

}

class GoodSubClass extends BaseClass {

private int field2 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof GoodSubClass) {

return super.equals(obj) && field2 == ((GoodSubClass) obj).field2;

}

return false;

}

}

有关更高级的问题及其解决方案,请参阅上面提到的文章.来源:https://www.icode9.com/content-1-463601.html

java 子类型_Java – 基类和子类中的equals方法相关推荐

  1. java定义子类_java定义类和子类中的方法

    展开全部 你好: 首先是62616964757a686964616fe78988e69d8331333335343337Parents类public class Parents { private S ...

  2. java 静态线程_Java线程类静态本机void yield()方法(带示例)

    线程类静态本机无效 yield()软件包java.lang.Thread.yield()中提供了此方法. yield()方法表示停止当前正在执行的线程,并为其他优先级相同的等待线程提供机会. 如果没有 ...

  3. java clock计时_Java Clock类| 实例的Instant()方法

    java clock计时 Clock Class Instant()方法 (Clock Class instant() method) instant() method is available in ...

  4. java中equals函数所在的类,重写Java中的equals方法介绍

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  5. 【C++】多态问题:基类调用子类的protected或者private函数

    1.问题描述 如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数? 答案是: 基类指针指向子类时,可以访问,并且访问的是子类重载后的函数 ...

  6. java 基本类型 object_Java常用类-Object类

    一.java.lang.Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Obj ...

  7. 关于基类和子类构造函数的问题

    关于基类和子类构造函数的问题 情况一:在一个类无自定义构造函数时,用这个类定义一个对象a,再定义另个一个对象b时,使用b(a)这种默认的拷贝构造函数时会出错,编译器提示a没有被定义. 如下面程序: # ...

  8. 谈谈基类与子类的this指针(C++)

    引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数).一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量.而对于同一个类 ...

  9. Java快速入门(17) - Number类及其子类

    文章目录 前言 Number类及其子类 程序实例 Number类的方法 关注公众号「小白轻松学编程」 前言 我们在进行数值计算的时候,通常情况下,使用的是基本数据类型,比如byte.int.long和 ...

  10. moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...

最新文章

  1. docker-compose编排最佳实战(多服务)
  2. c语言socket发送excel,socket文件传输功能的实现
  3. C语言中的字节对齐以及其相关处理
  4. Leetcode--字符串压缩
  5. 菜单控件menuStrip 1127
  6. 质量故事(1)---“请三思而后行!不要轻易下结论”
  7. python中的self怎么理解_python中的self理解
  8. 《手把手教你》系列基础篇之4-python+ selenium自动化测试-xpath使用(详细教程)
  9. 超高薪的机器学习工程师和现在的前后端们有什么不同?
  10. 区块链 PBFT最多多少个节点
  11. cdev 结构体、设备号相关知识解析
  12. STM32 vcap引脚
  13. android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...
  14. 基于Spring+SpringMVC+MyBatis博客系统的开发教程(十三)
  15. 计算机基础作业1,学习平台-北京大学16春计算机基础与应用作业1答案-成人高等教育_成人本科教育报名_远程网络教育学院-江苏学历网报名服务中心...
  16. 如何查看磁盘是GUID格式(GPT)还是MBR格式?判别UEFI模式启动,还是Legacy模式启动?
  17. 如何使用Arthas查看类变量值
  18. 织梦调用栏目名称的五个方法
  19. java小型超市系统_Java小型超市收银系统
  20. 怎么聊微信才能让她喜欢你

热门文章

  1. (转)【特征工程】特征工程技术与方法
  2. 技术人 | 为什么我们的系统会如此复杂?
  3. 今天,一起吐槽容器镜像中那些让人一言难尽的事情
  4. java nextprime_中国MOOC_零基础学Java语言_第7周 函数_1分解质因数
  5. 毕设题目:Matlab三维装箱
  6. 【时间序列预测】基于matlab鲸鱼算法优化LSTM时间序列预测【含Matlab源码 1687期】
  7. 【印刷字符识别】基于matlab模板匹配英文字母识别【含Matlab源码 808期】
  8. 【图像分割】基于matlab GUI类间方差阈值图像分割【含Matlab源码 583期】
  9. 【腐蚀率预测】基于matlab GUI BP神经网络钢筋腐蚀率预测【含Matlab源码 107期】
  10. python爬虫xpath提取数据_Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结...