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。
相关推荐
jimy17 分钟前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
captain37617 分钟前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫1228 分钟前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心中有你021439 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
心疼你的一切1 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
步行cgn1 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog2 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老2 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang2 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库