object所有方法及知识点

一、Object 类的全部方法(按常用度排序)

Object 类共有 11 个方法(含 2 个 wait 重载、1 个 finalize 已废弃),核心常用方法如下:

表格

方法签名 核心作用 是否可重写
public String toString() 返回对象的字符串表示 ✅ 推荐重写
public boolean equals(Object obj) 判断两个对象是否 "相等" ✅ 推荐重写
public int hashCode() 返回对象的哈希码值 ✅ 重写 equals 必须重写
public final Class<?> getClass() 获取对象的运行时类 ❌ 不可重写
public native int hashCode() 返回对象哈希码(native 方法) ✅ 需配合 equals 重写
public final void notify() 唤醒等待该对象锁的一个线程 ❌ 不可重写
public final void notifyAll() 唤醒等待该对象锁的所有线程 ❌ 不可重写
public final void wait() throws InterruptedException 让当前线程等待,释放对象锁 ❌ 不可重写
public final void wait(long timeout) throws InterruptedException 带超时的等待 ❌ 不可重写
public final void wait(long timeout, int nanos) throws InterruptedException 高精度超时等待 ❌ 不可重写
protected void finalize() throws Throwable 垃圾回收前的清理操作 ✅ 但已废弃(Java 9+)
protected native Object clone() throws CloneNotSupportedException 复制对象 ✅ 需实现 Cloneable 接口

二、核心方法详解(附代码示例)

1. toString()
  • 默认实现 :返回 类名@哈希码的十六进制(如 com.example.User@15db9742),可读性差。
  • 重写目的:返回包含对象核心属性的字符串,方便调试 / 日志输出。
  • 示例

java

运行

复制代码
public class User {
    private String name;
    private int age;

    // 重写 toString
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }

    // 构造器、getter/setter 省略
    public static void main(String[] args) {
        User user = new User("张三", 20);
        System.out.println(user); // 直接打印对象,底层调用 toString()
        // 输出:User{name='张三', age=20}
    }
}
2. equals(Object obj)
  • 默认实现 :比较两个对象的内存地址this == obj),即 "是否是同一个对象"。
  • 重写目的 :比较对象的内容 / 属性(如两个 User 的 name 和 age 都相同则认为相等)。
  • 重写规则
    • 自反性:x.equals(x) 必须返回 true;
    • 对称性:x.equals(y)y.equals(x)
    • 传递性:x.equals(y)y.equals(z)x.equals(z)
    • 一致性:多次调用结果不变(对象属性未变时);
    • 非空性:x.equals(null) 必须返回 false。
  • 示例

java

运行

复制代码
@Override
public boolean equals(Object obj) {
    // 1. 地址相同,直接返回 true
    if (this == obj) return true;
    // 2. obj 为 null 或类型不同,返回 false
    if (obj == null || getClass() != obj.getClass()) return false;
    // 3. 强转后比较属性
    User user = (User) obj;
    return age == user.age && Objects.equals(name, user.name);
    // 用 Objects.equals 避免空指针(name 为 null 时不会报错)
}
3. hashCode()
  • 核心规则
    • 同一对象多次调用 hashCode(),返回值必须相同(属性未变时);
    • x.equals(y) 为 true,则 x.hashCode() == y.hashCode()
    • x.equals(y) 为 false,hashCode() 可以相同(但尽量不同,提升哈希表效率)。
  • 重写要求重写 equals 必须重写 hashCode(否则 HashMap/HashSet 等哈希容器会失效)。
  • 示例

java

运行

复制代码
@Override
public int hashCode() {
    // 用 Objects.hash 生成哈希码,自动处理 null
    return Objects.hash(name, age);
}
4. getClass()
  • 作用 :获取对象的运行时类(Class 对象),用于反射、判断对象类型。
  • 特点:final 方法,不可重写;返回的是实际运行时的类(而非声明类型)。
  • 示例

java

运行

复制代码
Object obj = new User("李四", 25);
Class<?> clazz = obj.getClass();
System.out.println(clazz.getName()); // 输出:com.example.User
System.out.println(clazz == User.class); // true
5. wait()/notify()/notifyAll()
  • 核心场景:多线程通信(基于对象锁的等待 / 唤醒机制)。
  • 使用前提 :必须在 synchronized 同步代码块 / 方法中调用(否则抛 IllegalMonitorStateException)。
  • 核心逻辑
    • wait():当前线程释放对象锁,进入等待队列,直到被 notify()/notifyAll() 唤醒或超时;
    • notify():随机唤醒一个等待该对象锁的线程;
    • notifyAll():唤醒所有等待该对象锁的线程。
  • 示例

java

运行

复制代码
public class WaitNotifyDemo {
    private static final Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        // 等待线程
        new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("线程1:等待中...");
                    lock.wait(); // 释放锁,进入等待
                    System.out.println("线程1:被唤醒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        Thread.sleep(1000); // 确保线程1先执行

        // 唤醒线程
        new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程2:唤醒等待线程");
                lock.notify(); // 唤醒一个等待线程
            }
        }).start();
    }
}
6. clone()
  • 作用 :创建对象的 "副本",默认是浅拷贝(基本类型复制值,引用类型复制地址)。
  • 使用条件
    1. 类必须实现 Cloneable 接口(否则抛 CloneNotSupportedException);
    2. 重写 clone() 方法(并修改为 public)。
  • 示例

java

运行

复制代码
public class User implements Cloneable {
    private String name;
    private int age;

    // 重写 clone,改为 public
    @Override
    public User clone() throws CloneNotSupportedException {
        return (User) super.clone(); // 浅拷贝
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        User u1 = new User("张三", 20);
        User u2 = u1.clone();
        System.out.println(u1 == u2); // false(不同对象)
        System.out.println(u1.equals(u2)); // true(属性相同)
    }
}
7. finalize()
  • 现状:Java 9 标记为废弃(@Deprecated),Java 18 彻底移除。
  • 原作用:垃圾回收器回收对象前调用,用于释放资源(如关闭文件、连接)。
  • 问题 :执行时机不确定、可能导致内存泄漏,推荐用 try-with-resources 或手动关闭资源替代。

三、Object 核心知识点

  1. 所有类的父类

    • 显式继承:class A extends Object {}(可省略);
    • 隐式继承:class A {} 等价于 class A extends Object
    • 数组、枚举、接口的实现类都间接继承 Object。
  2. null 与 Object

    • null 表示 "没有对象",不能调用 Object 的任何方法(否则抛 NullPointerException);
    • 可以将 null 赋值给 Object 类型变量:Object obj = null;
  3. equals 与 == 的区别

    • ==:基本类型比较值,引用类型比较内存地址;
    • equals:默认等价于 ==,重写后可比较对象内容。
  4. native 方法

    • Object 中的 hashCode()clone()wait() 等是 native 方法(底层由 C/C++ 实现),用于提升性能。

总结

  1. 核心方法toString()(重写提升可读性)、equals()+hashCode()(成对重写,保证相等对象哈希码相同)是日常开发中最常重写的方法;
  2. 线程相关wait()/notify()/notifyAll() 是多线程通信的基础,必须在 synchronized 块中使用;
  3. 核心规则 :所有类继承 Object,重写 equals() 必须重写 hashCode()finalize() 已废弃,推荐手动管理资源。
相关推荐
予枫的编程笔记2 小时前
【面试专栏|JVM虚拟机】CMS vs 其他垃圾收集器:核心差异+适用场景
java·jvm·java面试·后端开发·垃圾回收机制·cmv垃圾回收器·jvm性能优化
渡过晚枫2 小时前
[第十六届蓝桥杯/java/算法]1.偏蓝
java·算法·蓝桥杯
zhaoyin19942 小时前
JavaScript面试题笔记
java·javascript·笔记
.小小陈.2 小时前
C++进阶7:深入理解哈希表,从原理到 C++ 实践
开发语言·c++·学习·哈希算法
码云数智-大飞2 小时前
排序算法的终极博弈:从复杂度推导到工程选型实战
开发语言
计算机学姐2 小时前
基于SpringBoot的宠物诊所管理系统
java·vue.js·spring boot·后端·spring·elementui·宠物
2501_940315262 小时前
【无标题】1302 层数最深叶子节点的和
java·数据结构·算法
南 阳2 小时前
Python从入门到精通day48
开发语言·python
悟能不能悟2 小时前
idea默认的快捷键和eclipse配置快捷键对比,列出一些常用的
java·eclipse·intellij-idea