在Java中,Object
类是所有类的根父类,其提供的方法会被所有子类继承。以下是Object
类的常用方法及其典型应用场景:
1. toString()
-
作用:返回对象的字符串表示(默认格式:
类名@哈希码
)。 -
重写场景:
-
打印对象时需要可读性更高的信息(如日志、调试)。
-
集合的
System.out.println()
输出依赖元素的toString()
。
-
-
示例:
@Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; }
2. equals(Object obj)
-
作用:比较两个对象是否“逻辑相等”(默认比较内存地址,即
==
)。 -
重写场景:
-
需要根据对象内容(而非地址)判断相等性(如值对象、DTO)。
-
集合类(如
HashSet
、ArrayList.contains()
)依赖此方法。
-
-
规则:
-
必须重写
hashCode()
以保证一致性(若equals
返回true
,hashCode
必须相同)。 -
满足自反性、对称性、传递性、一致性。
-
-
示例:
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); }
3. hashCode()
-
作用:返回对象的哈希码(默认返回内存地址的哈希值)。
-
重写场景:
-
对象作为
HashMap
的键或HashSet
的元素时。 -
必须与
equals()
逻辑一致。
-
-
示例:
@Override public int hashCode() { return Objects.hash(name, age); // 使用工具类简化计算 }
4. getClass()
-
作用:返回对象的运行时类(
Class
对象)。 -
应用场景:
-
反射操作(如动态创建实例、调用方法)。
-
精确判断对象类型(优于
instanceof
)。
-
-
示例:
Class<?> clazz = obj.getClass(); System.out.println(clazz.getName()); // 输出类全限定名
5. clone()
-
作用:创建对象的浅拷贝副本。
-
应用场景:
-
需要复制对象时(需实现
Cloneable
标记接口,否则抛CloneNotSupportedException
)。 -
深拷贝需手动重写(递归复制引用类型字段)。
-
-
示例:
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); // 浅拷贝 }
6. finalize()
(已废弃)
-
作用:对象被垃圾回收前调用的清理方法(Java 9+标记为废弃)。
-
替代方案:使用
AutoCloseable
(如try-with-resources
)或显式清理方法。
7. wait()
, notify()
, notifyAll()
-
作用:线程间通信的等待/通知机制(必须在
synchronized
块中使用)。 -
应用场景:
-
生产者-消费者模型。
-
多线程协作任务(如线程池任务调度)。
-
-
示例:
synchronized (lock) { while (conditionNotMet) { lock.wait(); // 释放锁并等待 } // 执行操作 lock.notifyAll(); // 唤醒其他线程 }
核心方法总结
方法 | 典型应用场景 | 注意事项 |
---|---|---|
toString() | 日志输出、调试 | 建议所有类重写 |
equals() /hashCode() | 集合操作、对象比较 | 必须同时重写,保持逻辑一致 |
getClass() | 反射、类型判断 | 返回运行时类对象 |
clone() | 对象复制 | 深拷贝需手动实现 |
wait() /notify() | 多线程同步 | 需搭配synchronized 使用 |
为什么重要?
-
默认行为:所有类继承
Object
,理解其方法避免踩坑(如集合比较错误)。 -
框架依赖:如
HashMap
依赖hashCode()
和equals()
,序列化依赖toString()
。 -
设计规范:正确重写这些方法是面向对象设计的基本要求。