Object中equals方法重写基本问题及实例

Object中equals方法重写基本问题及实例,第1张

Object中equals方法重写基本问题及实例

问题一:java语言中什么类型的数据可以使用"=="判断?

java中基本数据类型比较是否相等,使用"=="

问题二: java中什么类型的数据需要使用equals判断?

java中所有的引用数据类型统一使用equals方法来判断是否相等。

问题三:什么时候重写equals()方法?为什么要重写equals()方法?

以后所有类的equals方法基本都需要重写。(除了代码中仅仅使用基本数据类型)因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较内容,所以需要重写。

问题四:equals有什么重写规则?

编写时候自己定,符合语法规则规范即可。主要看是什么和什么相等时表示两个对象相等。

例如:对象和对象比较:调用equals方法

String类是SUN公司编写的,所以String类的equals已经方法重写了。 以后判断两个字符串是否相等,最好不要使用 “==”,要调用字符串对象的equals方法。

下面代码测试Object中的equals方法
此处为自己写的测试例子,代码中有详细注解

import java.util.Objects;

public class EqualsTest {
    public static void main(String[] args) {
        //创建地址对象 s1 和 用户对象 u1
        Address s1 = new Address("北京","大兴区","121212");
        User u1 = new User("张三",s1);

        //创建地址对象 s2 和 用户对象 u2
        Address s2 = new Address("北京","大兴区","121212");
        User u2 = new User("张三",s2);

        //判断s1、s2姓名和地址是否相同 相同输出 true ,不同输出 false
        System.out.println(u1.getAddr().equals(u2.getAddr()));

    }

}

//用户类
class User {
    //私有变量 名字 地址
    private String name;
    private Address addr;

    //构造方法
    public User() {
    }

    public User(String name, Address addr) {
        this.name = name;
        this.addr = addr;
    }

    //getting and setting
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddr() {
        return addr;
    }

    public void setAddr(Address addr) {
        this.addr = addr;
    }

    //重写equals方法 判断用户 姓名 和 地址 是否相同
    @Override
    public boolean equals(Object o) {
        //如果两个地址相同,则表示指向同一对象,保存内容一定相同
        if (this == o) return true;
        //如果比较的内容为空 或者 二者的类型不同(不属于同一范畴 ,例如 猫和牛 无法比较),返回 false
        if (o == null || getClass() != o.getClass()) return false;
        //o向上转型 从Object类转为User类(运行到此处表示比较的二者属于相同类型,可跳过判断 直接转型)
        User user = (User) o;
        //返回结果 如果name相同 且 地址相同 返回true ,否则返回false
        //name.equals(user.name)中name为引用数据类型String,SUN公司已经重写了equals,可以直接使用
        //addr.equals(user.addr)中addr为引用数据类型Address,需要调用地址类中的 equals方法 ,故地址类中 equals 方法需要重写
        return name.equals(user.name) && addr.equals(user.addr);
    }

}

//地址类
class Address {
    //变量 城市 街道
    String city;
    String street;
    String zipcode;

    //构造方法
    public Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    //重写equals方法 方便 User中调用
    @Override
    public boolean equals(Object o) {
        //内容不做详细解释,可以参考User中equals方法重写的注释
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return city.equals(address.city) && street.equals(address.street) && zipcode.equals(address.zipcode);
    }
}

文章对你有帮助的话,顺手点个赞哈!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5706840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存