- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何覆盖java中equals方法
如何覆盖java中equals方法
摘 要
java编程中比较两个对象是否相同,用Object的equals方法或“==”符号进行比较,equals方法和“==”是比较对象内存地址,但在实际中,仅以两个对象内存地址不同而判断它们不同是不够的,需覆盖equals方法,自定义判断标准,本文将对覆盖equals方法遵循的原则和技巧进行分析和实现。
【关键词】对象比较覆盖 equals
1 java中对象的比较
在java编程中,提供了两个比较两个对象的方法,一是用“==”运算符比较两个对象的内存地址。二是用Object的equals方法,不覆盖直接使用也是对比对象内存地址。
我们编写一个人类和员工类,员工类是人类的子类,我们先不覆盖equals方法,调用equals方法时,比较对象地址。
(1)编写Person类,关键代码:
private String name;
privateintage;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
(2)编写Employee类继承Person类,关键代码:
privateintsalary;
publicEmployee(String name, int age,int salary) {
super(name, age);
this.salary=salary;
}
(3)以上两个类均没有覆盖equals方法,调用使,比较内存地址,测试关键代码:
Employee p2=new Employee(张三,9,10);
Employee p3=new Employee(张三,9,10);
System.out.println(p2.equals(p3));
运行结果:
false
p2和p3是分别用new关键字创建出来的,是不同地址的对象,比较的结果是false。
2 覆盖java中的equals方法进行自定义比较
上面例子中,有两个叫张三的对象,调用没覆盖的equals方法时,显示是不同对象,假设我们业务上要求,只要他们年龄、名字、工资相同,认为两个对象是相同的,即我们认为这两个张三,是同一个人。
我们就覆盖equals方法,自定义比较规则,让其符合业务要求。
2.1 覆盖equals方法遵循的原则
java语言规范中有要求,如果要覆盖equals方法,那么覆盖后的方法应该具有下面几个的特点:
(1)自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
(2)对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y才应返回 true。
(3)传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
(4)一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或 false,前提是对象上 equals 比较中所用的信息没被修改。对于任何非空引用值 x,x.equals(null) 都返回 false。
2.2 覆盖equals方法
(1)覆盖person的equals方法,关键代码:
a.所有的对象和NULL比较都是false
if(obj==null){
returnfalse;
}
b.下面小段代码遵循了自反性一致性
if(this==obj){
returntrue;
}
c.下面小段代码遵循、对称性、传递性、一致性
if(this.getClass()!=obj.getClass()){
returnfalse;
}
Person p=(Person)obj;
if(this.age!=p.age){
returnfalse;
}
if(!this.name.equals(p.name)){ equals
returnfalse;
}
returntrue;
上面的equals方法中用getClass实现,比较的是同类型,不在父子类对象间比较(子类中没有比较的属性除外),所以这里的equals方法不能用于Person类对象和子类对象的比较。
(2)覆盖Employee的equals方法,关
原创力文档


文档评论(0)