在java中覆盖 equals()
起因
这周软件构造实验中第三题需要判断自建类的相等性.
例如如下代码
class Person{
String name;
public Person(String name){
this.name = name;
}
}
Person aperson = new Person("a")
Person bperson = new Person("a")
我们希望的结果是aperson 等于 bperson.
解决方法
1. 使用 ==
java中 a == b
判断a 和 b 是否引用同一个object, 所以aperson == bperson
会返回false
, 这种方法不行
2. 覆盖euqals()
因为java中的所有class 都直接或间接地继承自 Object 类, 而Object类有一些基本的方法如 equals(), toString()等等…..我们就可以覆盖其中的equals方法, 然后调用aperson.equals(bperson)
来判断两者是否相等.
我的第一次实现如下
class Person{
String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object o){
return this.name == o.name;
}
}
但是第8行return this.name == o.name;
处报错了 name can't be resolved or not a field
于是我又换了种写法:
class Person{
String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Person o){
return this.name == o.name;
}
}
然而这次第七行public boolean equals(Person o)
处又报错了The method equals(Person) of type Person must override or implement a supertype method
这两个错误的原理我不是很清楚, 等之后我弄清楚之后会更新上来
于是我只好再改个方法如下
class Person{
String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object o){
return this.name == o;
}
}
这次倒是没有报错了, 不过调用的时候非常不美观, 得写成aperson.equals(bperson.name)
看着十分不舒服, 我又上网搜索覆盖equals的相关博客, 找到了这个博客, 并根据其改写了最终版本如下:
class Person{
String name;
public Person(String name){
this.name = name;
}
@Override
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(!(o instanceof Person)) {
return false;
}
Person person = (Person) o;
return this.name.equals(person.name);
}
}
终于,aperson.equals(bperson)
可以返回true
了