Object 类

一、Object 类基础概述

  1. 地位 :java.lang.Object 是 Java 中所有类的根父类 。
    • 如果一个类定义时没有写extends继承任何类,默认直接继承 Object;
    • 所有类都间接或直接继承 Object,所以所有对象都能调用 Object 中的方法。
  2. 包说明:java.lang包下的类,不需要手动 import 导入,直接使用。

口诀:万物皆 Object。

二、Object 类常用方法(重点)

1. toString () 方法

作用

返回对象的字符串描述。

源码
复制代码
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  • 默认返回:类名@十六进制哈希值,这个信息对开发基本没用,开发中一般要重写。
代码示例
复制代码
class Student{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 重写toString,返回对象的属性信息
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}
public class Test{
    public static void main(String[] args) {
        Student s = new Student("张三",18);
        // 打印对象,底层默认自动调用toString()
        System.out.println(s);
        // 等价于 System.out.println(s.toString());
    }
}

✅ 重点:System.out.println(对象) 会自动调用该对象toString()。 ✅ 开发规范:实体类建议重写 toString,方便打印查看对象数据。


2. equals () 方法

源码
复制代码
public boolean equals(Object obj) {
    return (this == obj);
}
  • ==:
    • 基本类型:比较值;
    • 引用类型:比较对象地址,判断是不是同一个对象。
  • Object 原生 equals 本质就是==,比较对象地址。
什么时候需要重写 equals?

业务需求:只要两个对象的内容(属性)相同,就认为相等,而不是地址相同,就要重写 equals。

重写 equals 示例
复制代码
class Student{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        // 1. 如果两个对象地址一样,直接true
        if (this == o) return true;
        // 2. 判断传入对象是否为null;判断类型是否一致
        if (o == null || getClass() != o.getClass()) return false;
        // 3. 向下转型
        Student student = (Student) o;
        // 4. 比较属性
        return age == student.age && name.equals(student.name);
    }
}
public class Test{
    public static void main(String[] args) {
        Student s1 = new Student("张三",18);
        Student s2 = new Student("张三",18);
        System.out.println(s1 == s2); // false,地址不同
        System.out.println(s1.equals(s2)); // true,属性相同(重写后)
    }
}

⚠易错点:

  1. 字符串String类已经重写了 equals ,所以"abc".equals("abc")比较内容;
  2. 自己写的类,不重写 equals,equals 和==效果一样,比较地址。

3. hashCode () 方法

作用

返回对象的哈希码值(int 整数),哈希码是对象的数字摘要,主要用于哈希集合(HashMap、HashSet)。

规则
  1. 同一个对象,多次调用hashCode(),返回值必须相同;
  2. 如果两个对象equals()返回 true,那么它们的hashCode()必须相等;
  3. 如果两个对象hashCode()相等,equals()不一定为 true(哈希碰撞)。

✅ 开发规范:重写 equals,必须同时重写 hashCode。

复制代码
class Student{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    // 重写hashCode
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

三、Object 其他方法(了解)

  1. getClass():返回对象的运行时类型,返回Class对象,反射会用到。

    Student s = new Student("张三",18);
    Class clazz = s.getClass();
    System.out.println(clazz.getName()); // 获取类全限定名

  2. clone():对象克隆,复制对象,需要类实现Cloneable标记接口,浅拷贝。

  3. finalize():对象被垃圾回收前执行,JDK9 之后废弃,不推荐使用。

  4. wait() / notify() / notifyAll():多线程等待与唤醒,并发章节学习。

四、对比总结表

方法 原生功能 开发常用操作
toString() 返回类名 @哈希地址 重写,输出对象属性
equals() ==比较对象地址 重写,比较对象内容
hashCode() 返回对象哈希值 重写,配合 equals 使用

五、常见面试题

  1. == 和 equals 的区别?
    • ==是运算符,基本类型比值,引用类型比地址;
    • equals是 Object 的方法,原生等价==;很多类(String)重写后比较内容。
  2. 重写 equals 为什么一定要重写 hashCode? 哈希集合会先判断 hashCode,如果 hashCode 不一样,直接判定对象不同。如果只重写 equals,两个内容相同对象 hashCode 不同,会存入 HashSet 当成两个对象,产生 bug。
相关推荐
知守观1 小时前
feign-core 就在依赖树里,运行时却找不到类:一次 provided scope 引发的启动失败排查
java·spring cloud·maven
她的男孩1 小时前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛1 小时前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端
Nozokime1 小时前
ThreadLocal 在流式 Agent 里静默失效:LangChain4j 轨迹埋点的零侵入方案
java
j7~1 小时前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
小宋10211 小时前
OpenTelemetry GenAI可观测性实战:串起模型、工具、Token与错误
java·人工智能·算法·贪心算法
leisoo80971 小时前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
Lazionr1 小时前
unordered_map和unordered_set的使用
开发语言·c++·算法
m0_587383001 小时前
工业场景设备维修维护实战技巧 全流程标准化落地与常见问题排查指南
java·spring·小程序·架构·需求分析