java 中覆盖 equals() 方法

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值