如何书写一个恰当的equals()方法?
2012-07-08 20:19
309 查看
若有错误,欢迎指正。
Object类中的equals()方法默认比较的是对象之间的引用是否一样,但在实际开发中需要比较的是对象之间的状态是否一样。这就要求我们覆写equals()方法。
考虑继承层次下的equals()方法应如何书写?
1、父类的equals()方法比较共有属性部分,等待子类中的equals()调用
2、子类各自覆写equals()方法比较新增属性部分
下面以Person, Student, Teahcer这三个类举例
Person类
1、super关键字,并不是指父类对象的引用,它只是告诉编译器要去调用父类的方法的关键字。
2、考虑到继承,所以采用getClass()进行检测,而不是使用instanceof关键字来比较,这是因为子类有自己的相等概念。
举个例子,如果使用的是instanceof关键字,父类中的equals()方法应该为:
当Student子类对象和Teacher子类对象的名字和年龄都一样的情况下,那么要如何在子类中所覆写的equals()方法再进一步比较这两个对象呢?
所以,如果是由超类来决定相等的概念的话,那么就可以使用instanceof关键字进行比较了。
Object类中的equals()方法默认比较的是对象之间的引用是否一样,但在实际开发中需要比较的是对象之间的状态是否一样。这就要求我们覆写equals()方法。
考虑继承层次下的equals()方法应如何书写?
1、父类的equals()方法比较共有属性部分,等待子类中的equals()调用
2、子类各自覆写equals()方法比较新增属性部分
下面以Person, Student, Teahcer这三个类举例
Person类
package com.test.equals; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } // 采用getClass()方法来比较双方是否属于同一个类 if (this.getClass() != obj.getClass()) { System.out.println("The this's class name is " + this.getClass()); System.out.println("The obj's class name is " + obj.getClass()); return false; } Person person = (Person) obj; return this.name.equals(person.name) && (this.age == person.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; } }Student类
package com.test.equals; public class Student extends Person { private int score; public Student(String name, int age, int score) { super(name, age); this.score = score; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public boolean equals(Object obj) { if (super.equals(obj)) { // 通过父类的equals方法,已经确定比较双方同属于一个类,父类中的公有属性值也一样 Student student = (Student) obj; // 开始比较子类中特有的属性值是否一样 return this.score == student.score; } return false; } }Teacher类
package com.wujilin.equals; public class Teacher extends Person { private int salary; public Teacher(String name, int age, int salary) { super(name, age); this.salary = salary; } @Override public boolean equals(Object obj) { if (super.equals(obj)) { // 通过父类的equals方法,已经确定比较双方同属于一个类,父类中的公有属性值也一样 Teacher teacher = (Teacher) obj; // 开始比较子类中特有的属性值是否一样 return this.salary == teacher.salary; } return false; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } }注意:
1、super关键字,并不是指父类对象的引用,它只是告诉编译器要去调用父类的方法的关键字。
2、考虑到继承,所以采用getClass()进行检测,而不是使用instanceof关键字来比较,这是因为子类有自己的相等概念。
举个例子,如果使用的是instanceof关键字,父类中的equals()方法应该为:
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (obj instanceof Person) { // obj是Person类对象或Student类对象或Teahcer类对象的引用,都会进入到该if语句块里 Person person = (Person) obj; return this.name.equals(person.name) && (this.age == person.age); } return false; }
当Student子类对象和Teacher子类对象的名字和年龄都一样的情况下,那么要如何在子类中所覆写的equals()方法再进一步比较这两个对象呢?
所以,如果是由超类来决定相等的概念的话,那么就可以使用instanceof关键字进行比较了。
相关文章推荐
- 如何写一个正确的equals方法
- java中如何实现一个优美的equals方法
- Java:Object类的equals()方法 如何编写一个完美的equals()方法
- 最近帮公司开发一个邮件营销软件 用到XPTable 但找了很多方法 摸索了很久都不知道如何更新进度条 不过在国外的一个网站 终于找到答案了
- 如何用C#创建一个类并在其他Web页中调用该类的方法(2)
- qsv格式转换mp4如何操作?这一个方法轻松解决
- ARX的方法如何实现删除一个选择集中所有实体
- 如何判断一个类是否支持某属性和方法以及如何判断IOS的版本
- 在一个有返回值的方法里使用了子线程,如何返回子线程中的值,如下代码中,我在子线程获取到了address的值,但是这个方法的返回结果是空,该如何解决?
- 请教:在一个在方法段的异常处理里面,如何获取当前方法输入的所有参数值。
- java如何监控一个方法的运行时间 [问题点数
- ASP.NET MVC如何在一个同步方法(非async)方法中等待async方法
- 【JQ】jquery如何判断一个节点下面没有子节点方法整理
- jvm是如何确定一个方法的调用的呢。
- Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一)
- 如何在cocos2d-x中使用ECS(实体-组件-系统)架构方法开发一个游戏?
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 如何为引用类型如何重写Object.Equals()方法?
- JAVA如何调用另外一个类的方法
- 怎样写一个尽可能优雅的equals方法