参考 JDK1.8 的 API 文档

Object 类

Object 类在 JDK1.8 的 API 中是这么定义的:

public class Object

Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

Object 类的方法

Method Description
protected Object clone() 创造并返回这个对象的复制
boolean equals(Object obj) 指示某个其他对象是否“等于”此对象
protected void finalize() 当垃圾回收确定没有对该对象的引用时,由对象上的垃圾收集器调用
Class<?> getClass() 返回这个对象的运行时类
int hashCode() 返回这个对象的哈希码
void notify() 唤醒在该对象监视器上的一个单线程
void notifyAll() 唤醒在该对象监视器上的所有线程
String toString() 返回该对象的字符串表示
void wait() 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法
void wait(long timeout) 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法,或者超过了指定的时间
void wait(long timeout, int nanos) 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法,或者某个其他线程中断当前线程,或者超过了指定的时间

方法详解

getClass

1
public final Class<?> getClass()
  • 返回此 Object 运行时类的 Class 对象。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

hashCode

1
public int hashCode()
  • 返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

  • hashCode 的常规协定是:

    • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
    • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

equals

1
public boolean equals(Object obj)
  • 指示其他某个对象是否与此对象“相等”。如果此对象与 obj 参数相同,则返回 true;否则返回 false
  • equals 方法在非空对象引用上实现相等关系:
    • 自反性:对于任何非空引用值 xx.equals(x) 都应返回 true
    • 对称性:对于任何非空引用值 xy,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
    • 传递性:对于任何非空引用值 xyz,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
    • 一致性:对于任何非空引用值 xy,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
    • 对于任何非空引用值 xx.equals(null) 都应返回 false
  • 该方法比较的是引用,对于任何非空引用值 xy,当且仅当 xy 引用同一个对象时,此方法才返回 truex == y 具有值 true)。
  • 很多类对该方法进行了重写,以实现比较对象实际内容的功能,这里需要注意的是:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

clone

1
protected Object clone() throws CloneNotSupportedException
  • 创建并返回此对象的一个复制。“复制”的准确含义可能取决于对象的类。
  • 如果对象的类不支持 Cloneable 接口,则重写 clone 方法的子类也会抛出此异常,以指示无法复制某个实例。
  • 该方法执行的是对象的”浅拷贝”,即对象本身没有被复制。
  • Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。但所有的数组都被视为实现接口 Cloneable

toString

1
public String toString()
  • 返回该对象的字符串表示。通常, toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

  • Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

    1
    getClass().getName() + '@' + Integer.toHexString(hashCode())

notify

1
public final void notify()
  • 唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。
  • 此方法只应由作为此对象监视器的所有者的线程来调用。
  • 如果当前线程不是此对象监视器的所有者,抛出 IllegalMonitorStateException 异常。

notifyAll

1
public final void notifyAll()
  • 唤醒在此对象监视器上等待的所有线程。
  • 此方法只应由作为此对象监视器的所有者的线程来调用。

  • 如果当前线程不是此对象监视器的所有者,抛出 IllegalMonitorStateException 异常。

wait

1
public final void wait(long timeout) throws InterruptedException
  • 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

  • 此方法只应由作为此对象监视器的所有者的线程来调用。

  • 抛出:
    • IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
    • InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
1
public final void wait(long timeout) throws InterruptedException
  • 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,或者超过指定的时间量前,导致当前线程等待。

  • 此方法只应由作为此对象监视器的所有者的线程来调用。

  • 参数:

    • timeout - 要等待的最长时间(以毫秒为单位)。
  • 抛出:

    • IllegalArgumentException - 如果超时值为负。

    • IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。

    • InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。

1
public final void wait(long timeout, int nanos) throws InterruptedException
  • 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,或者其他某个线程中断当前线程,或者超过指定的时间量前,导致当前线程等待。

  • 此方法只应由作为此对象监视器的所有者的线程来调用。

  • 参数:

    • timeout - 要等待的最长时间(以毫秒为单位)。
    • nanos - 额外时间(以毫微秒为单位,范围是 0-999999)。
  • 抛出:

    • IllegalArgumentException - 如果超时值是负数,或者毫微秒值不在 0-999999 范围内。

    • IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。

    • InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。

finalize

1
protected void finalize() throws Throwable
  • 当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
  • 对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。
  • finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但此外的都会被忽略。
  • Throwable - 此方法抛出的 Exception