欢迎来到天天文库
浏览记录
ID:10144764
大小:28.00 KB
页数:6页
时间:2018-06-11
《如何覆盖java中的equals方法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、如何覆盖java中的equals方法摘要java编程中比较两个对象是否相同,用Object的equals方法或“==”符号进行比较,equals方法和“==”是比较对象内存地址,但在实际中,仅以两个对象内存地址不同而判断它们不同是不够的,需覆盖equals方法,自定义判断标准,本文将对覆盖equals方法遵循的原则和技巧进行分析和实现。【关键词】对象比较覆盖equals1java中对象的比较在java编程中,提供了两个比较两个对象的方法,一是用“==”运算符比较两个对象的内存地址。二是用Object的equals方法,不覆盖直
2、接使用也是对比对象内存地址。我们编写一个人类和员工类,员工类是人类的子类,我们先不覆盖equals方法,调用equals方法时,比较对象地址。(1)编写Person类,关键代码:privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;6this.age=age;}(2)编写Employee类继承Person类,关键代码:privateintsalary;publicEmployee(Stringname,intage,ints
3、alary){super(name,age);this.salary=salary;}(3)以上两个类均没有覆盖equals方法,调用使,比较内存地址,测试关键代码:Employeep2=newEmployee(”张三”,9,10);Employeep3=newEmployee(”张三”,9,10);System.out.println(p2.equals(p3));运行结果:falsep2和p3是分别用new关键字创建出来的,是不同地址的对象,比较的结果是false。2覆盖java中的equals方法进行自定义比较6上面例子
4、中,有两个叫张三的对象,调用没覆盖的equals方法时,显示是不同对象,假设我们业务上要求,只要他们年龄、名字、工资相同,认为两个对象是相同的,即我们认为这两个张三,是同一个人。我们就覆盖equals方法,自定义比较规则,让其符合业务要求。2.1覆盖equals方法遵循的原则java语言规范中有要求,如果要覆盖equals方法,那么覆盖后的方法应该具有下面几个的特点:(1)自反性:对于任何非空引用值x,x.equals(x)都应返回true。(2)对称性:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,
5、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比较都是
6、falseif(obj==null){6returnfalse;}b.下面小段代码遵循了自反性一致性if(this==obj){returntrue;}c.下面小段代码遵循、对称性、传递性、一致性if(this.getClass()!=obj.getClass()){returnfalse;}Personp=(Person)obj;if(this.age!=p.age){returnfalse;}if(!this.name.equals(p.name)){equalsreturnfalse;}returntrue;上面的equ
7、als方法中用getClass实现,比较的是同类型,不在父子类对象间比较(子类中没有比较的属性除外),所以这里的equals方法不能用于Person类对象和子类对象的比较。6(2)覆盖Employee的equals方法,关键代码:if(this.getClass()!=obj.getClass()){returnfalse;}a.调用子类equals方法要调用父类equals方法,但如果父类是Object,则不要调用其父类的equals方法。b.比较父类里面的而子类没有声明的属性if(!(super.equals(obj)))
8、{returnfalse;}Employeee=(Employee)obj;if(salary!=e.salary){returnfalse;}returntrue;(3)运行测试代码。运行结果true按照业务要求,两个对象都具有相同的名字、年龄、工资,所以是相同的。3小结6
此文档下载收益归作者所有