您的位置:首页 > 其它

如何书写一个恰当的equals()方法?

2012-07-08 20:19 309 查看
若有错误,欢迎指正。

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关键字进行比较了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐