重写部分Object方法

重写部分Object方法

Person 类(记录姓名和年龄)为例,通过重写 Object 类的 toString()equals()hashCode() 三个核心方法,实现打印对象详细信息比较对象内容是否相同的需求。

说明:Object 类是所有Java类的根父类,所有类都直接或间接继承自它,这三个方法是 Object 类提供的默认方法,默认实现通常无法满足业务需求,因此需要重写。


1. 定义 Person 类

import java.util.Objects;

public class Person {

    public String name;
    public int age;

    // 构造方法:初始化姓名和年龄
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 重写 toString() 方法:自定义对象的打印格式,替代默认的 "类名@哈希值" 格式
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // 重写 equals() 方法:比较两个对象的「内容」是否相同,替代默认的「地址值」比较
    @Override
    public boolean equals(Object o) {
        // 1. 判断两个对象是否是同一个对象(地址值相同),是则直接返回true
        if (this == o) return true;
        // 2. 判断被比较对象是否为null,或两个对象不属于同一个类,是则返回false
        if (o == null || getClass() != o.getClass()) return false;
        // 3. 将被比较对象强转为 Person 类型,比较核心属性值是否全部相同
        Person person = (Person) o;
        // 年龄是基本类型直接比较,姓名是String(引用类型)用 Objects.equals() 安全比较(避免空指针)
        return age == person.age && Objects.equals(name, person.name);
    }

    // 重写 hashCode() 方法:保证「内容相同的对象」返回相同的哈希值,遵循 "equals相等则hashCode必相等" 的约定
    @Override
    public int hashCode() {
        // 利用 Objects.hash() 方法,根据对象的核心属性生成哈希值
        return Objects.hash(name, age);
    }
}

2. 定义 Test 类

public class Test {

    public static void main(String[] args) {
        // 创建两个「内容相同、地址不同」的 Person 对象
        Person person1 = new Person("小明", 10);
        Person person2 = new Person("小明", 10);

        // 1. 调用重写的 toString() 方法(System.out.println() 会自动调用对象的 toString())
        System.out.println(person1);

        // 2. 调用重写的 equals() 方法,比较两个对象的内容
        System.out.println(person1.equals(person2));

        // 3. 调用重写的 hashCode() 方法,打印两个对象的哈希值
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
    }
}

运行结果

Person{name='小明', age=10}
true
23458764
23458764
面向对象:多态 2025-07-06
Comparable&Comparator 2025-07-10

评论区