以 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