在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()
,或者指定的时间已过,提供更高的时间精度。