重写 equals 方法
来源:互联网 发布:淘宝联盟助手机版 编辑:程序博客网 时间:2024/05/18 01:20
-- Start
重写 equals 方法是一件很令人头疼的事情, Java 语言规范要求 equals 方法具有下面的特性:
1. 自反性: x.equals(x)应该返回true.2. 对称性: 如果x.equals(y)返回true, 那么y.equals(x)也应该返回true.3. 传递性: 如果x.equals(y)返回true, y.equals(z)返回true, 那么x.equals(z)也应该返回true.4. 一致性: 如果对象没有变化, 反复调用equals方法应该返回相同的结果.5. x.equals(null) 应该返回false.
看上去很简单, 但是在涉及继承的时候, 稍有不慎就违反了对称性, 下面是一个例子.
public class Test {public static void main(String[] args) {Poeple p = new Poeple();p.setName("ZhangSan");p.setAge(20);Student s = new Student();s.setName("ZhangSan");s.setAge(20);s.setID(1);System.out.println("p.equals(s) == " + p.equals(s));System.out.println("s.equals(p) == " + s.equals(p));}}class Poeple {private String name;private int age;@Overridepublic boolean equals(Object otherObject) {if (this == otherObject)return true;if (otherObject == null)return false;if (!(otherObject instanceof Poeple))return false;Poeple other = (Poeple) otherObject;return name.equals(other.name) && age == other.age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}class Student extends Poeple {private int ID; // 学号@Overridepublic boolean equals(Object otherObject) {if (!super.equals(otherObject))return false;if (!(otherObject instanceof Student))return false;Student other = (Student) otherObject;return ID == other.ID;}public int getID() {return ID;}public void setID(int iD) {ID = iD;}}结果如下:
p.equals(s) == trues.equals(p) == false
出现这种情况的原因是超类与子类有不同的比较规则, 实际的情况有以下两种:
1. 由超类决定是否相等, 如: 不管是学生还是老师, 每个人都有身份证号, 由身份证号来确定两个人是否是同一个人, 下面是一个范例程序.
class Poeple {private int ID;private String name;// 由于超类决定是否相等, 可以将equals方法设置为final, 禁止子类重写@Overridepublic final boolean equals(Object otherObject) {if (this == otherObject)return true;if (otherObject == null)return false;if (!(otherObject instanceof Poeple))return false;Poeple other = (Poeple) otherObject;return ID == other.ID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getID() {return ID;}public void setID(int iD) {ID = iD;}}class Student extends Poeple {// Student 可以有自己的域}class Teacher extends Poeple {// Teacher 可以有自己的域}
2. 子类有自己的相等概念, 下面是一个范例程序.
class Poeple {private String name;private int age;@Overridepublic boolean equals(Object otherObject) {if (this == otherObject)return true;if (otherObject == null)return false;if (getClass() != otherObject.getClass()) // 注意此处, 我们不能通过 instanceof 来判断return false;Poeple other = (Poeple) otherObject;return name.equals(other.name) // 使用 equals 对象域&& age == other.age; // 使用 == 比较基本类型}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}class Student extends Poeple {private int grade;@Overridepublic boolean equals(Object otherObject) {if (!super.equals(otherObject)) // 此处需要调用父类的 equals 方法return false;Student other = (Student) otherObject;return grade == other.grade;}}
从上面的例子可以看出, 想写出一个完美的 equals 还是很不容易的, 幸运的是 Apache Common 包有个 EqualsBuilder 类, 它能帮助我们很容易的实现 equals 方法.
--更多参见:Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-18
-- Written by ShangBo on 2012-05-18
-- End
- 重写equals方法时都要重写equals方法
- 重写equals()方法
- 重写equals()方法
- JAVA重写equals方法
- JAVA重写equals方法
- 重写Equals()方法
- equals方法重写
- 重写 equals 方法
- java 重写equals方法
- 重写equals()方法简介
- 重写equals方法
- 重写equals方法
- 重写equals方法
- 重写equals方法
- 怎么样重写equals方法
- 重写Equals方法
- 重写equals方法
- 重写equals方法
- 串口启动问题:从BL1运行起来后,加载EBOOT.NB0成功,跳转到EBOOT去执行时停止,什么问题?
- 什么时候加上android.intent.category.DEFAULT
- RTSP状态码
- stdafx.h的作用
- 2012年3月15-17日学习记录
- 重写 equals 方法
- [UvaOJ - Getting Started] 458 - The Decoder
- 现实迷途 第二十九章 钱是大爷
- java动态代理2 (cglib 不用实现接口)
- 算法的经典书籍
- 2012年3月18日学习
- 2012年3月19日学习
- 笔试编程题整理1.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
- android抓包命令