在Java中,所有的类都是直接或间接继承自Object类,因此Object类是Java类库中所有类的根。
Object类提供了一些基础的方法,这些方法可以被所有的Java类继承和使用。
这些方法覆盖了从对象的创建、比较、克隆到对象的销毁等整个生命周期,并且提供了线程同步的基本机制。
对象比较和哈希码相关
public boolean equals(Object obj): 比较两个对象是否相等。
==运算符对于基本数据类型(如 int、char、float等),
==比较的是两个变量的值是否相等。对于引用数据类型(如类、接口、数组等),
==比较的是两个引用是否指向同一个对象,即它们是否引用内存中的同一个位置。
- 默认实现使用
==比较对象引用,这可能不符合对象的逻辑相等性。 - 重写此方法时,必须遵守等价关系:自反性、对称性和传递性。
- 重写
equals时,通常还需要重写hashCode方法,以保持两个方法的一致性。
public int hashCode(): 返回对象的哈希码。
- 默认实现返回对象的内存地址的哈希码。
- 重写
hashCode时,应确保它根据equals方法的定义返回一致的哈希码。
对象表示和字符串转换
public String toString(): 返回对象的字符串表示。
java
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}- 默认实现可能不提供有用的信息,因为它只返回类名和哈希码。
- 重写此方法时,应确保它返回对象的“自然”字符串表示,这对于调试和日志记录非常有用。
对象克隆
protected Object clone() throws CloneNotSupportedException: 创建并返回对象的一个副本。
- 默认情况下,对象不可克隆,因为
Object类的clone方法是protected的,不允许外部调用。 - 要使对象可克隆,类必须实现
Cloneable接口,并重写clone方法,提供公共的访问权限。 - 浅克隆和深克隆是两种克隆策略,选择哪种取决于对象的内容和需求。
类信息获取
public final Class<?> getClass(): 返回对象的类信息。
- 这个方法是
final的,不能被重写。 - 它返回一个
Class对象,可以用于反射操作,如动态创建对象、访问字段、调用方法等。
垃圾回收和资源清理
protected void finalize() throws Throwable: 在对象被垃圾收集器回收之前调用,用于资源清理。
- 这个方法不保证会被及时地执行,甚至可能永远不被执行。
- 不要依赖
finalize方法来执行重要的资源释放操作,应该使用显式的资源释放方法。 finalize方法已经被标记为deprecated,从Java 9开始,应该使用try-with-resources语句或者其他资源管理机制。
线程同步和等待
public final void notify(): 唤醒等待对象的单个线程。public final void notifyAll(): 唤醒等待对象的全部线程。public final void wait() throws InterruptedException: 使当前线程等待,直到另一个线程调用notify()或notifyAll()。public final void wait(long timeout) throws InterruptedException: 使当前线程等待,直到另一个线程调用notify()或notifyAll(),或者指定的时间已过。public final void wait(long timeout, int nanos) throws InterruptedException: 使当前线程等待,直到另一个线程调用notify()或notifyAll(),或者指定的时间已过,提供更高的时间精度。
