Java源码解读:顶级父类Object

来源:互联网 发布:sql replace 正则 编辑:程序博客网 时间:2024/05/01 21:46

类Object是类层次结构的根类。每个类都使用Object作为超类,所有对象都实现这个类的方法。

  1. 方法签名
private static native void registerNatives();//返回此Object运行时类型public final native Class<?> getClass();//返回对象的哈希值public native int hashCode();//判断其他对象是否与此对象"相等"public boolean equals(Object obj);//创建并返回此对象的一个副本protected native Object clone() throws CloneNotSupportedException;//返回此对象的字符串表示public String toString();//唤醒在此对象监视器上等待的单个线程public final native void notify();//唤醒在此对象监视器等待的所有线程public final native void notifyAll();//在其他线程调用此对象的notify()方法或notifyAll()方法前,或者超过指定的时间量前,让当前线程等待public final void wait() throws InterruptedException;public final native void wait(long timeout) throws InterruptedException;public final void wait(long timeout, int nanos) throws InterruptedException//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法protected void finalize() throws Throwable;    
  1. 具体详解

equals方法

    public boolean equals(Object obj) {        return (this == obj);    }
由源码可知,默认的Object的equals方法只是比较对象的地址,对于String这样的类要通过equals比较内容,必须写equals方法。equals方法重写必须注意以下几点   (1)重写的equals方法的访问权限必须是public的,因为Object中的该方法已经是public的了,重写的方法的访问权限不能低于父类的   (2)方法的入参必须是Object类型,不能使用其他类型 正确的equals方法必须满足5个条件   (1)自反性。对任意x,x.equals(x)一定返回true   (2)对称性。对任意x和y,如果y. equals(x)返回true,则x.equals(y)也返回true   (3)传递性。对任意x,y,z,如果有x.equals(y)返回true,y.equals(x)返回true,则x.equals(z)一定返回true。   (4)一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致。   (5)对任何不适null的x,x.equals(null)一定返回false。

hashCode方法

 public native int hashCode();
通常的方法时将成员变量与某一素数相乘,目的是使哈希码既能满足要求,又能均匀分布。 (1)Java应用程序期间,于同一对象多次调用hashCode方法时,在对象上参与equals比较的成员没有被修改的情况下,必须一致地返回相同的整数 (2)从某一个应用程序的一次执行到同一应用的另一次执行,该整数无须保持一致。 (3)如果两个对象各自调用hashCode方法产生的不同结果,对这两个对象进行equals方法的比较一定要返回false。 (4)如果根据equals方法比较。两个对象时等价的,那么在两个对象中各自调用hashCode方法必须产生相同的整数结果 (5)如果根据equals方法比较,两个对象不等价,那么在两个对象中各自调用hashCode方法不一定会产生不同的整数结果。

equals方法和hashCode方法的关系

 (1)如果重写了equals方法,则必须重写hashCode防止两个等价的对象的hashCode值不同,这在集合中将造成严重后果。 (2)如果equals成立,则hashCode必须相同,如果hashCode不同,则equals则一定不成立

notify方法与notifyAll方法

public final native void notify();public final native void notifyAll();
notify方法唤醒在此对象监视器上等待的单个线程,如果此监视器上有多个对象在等待,则会选择唤醒其中一个线程,选择是任意的。而notifyAll会唤醒所有线程。线程通过调用其中一个wait方法,在对象监视器上等待。直到当前线程放弃此对象的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与该对象上主动同步的其他所有线程进行竞争。

一次只能有一个线程拥有对象的监视器

此方法只应由作为同步监视器的所有者的线程来调用。通过以下三种方式之一,线程可以成为此对象监视器的所有者:(1)通过执行此对象的同步实例的方法(2)通过执行在此对象上进行同步的synchronized语句的正文.(3)对于Class类型的对象,可以通过执行该类的同步静态方法。如果当前线程不是此对象监视器的所有者,则调用该方法会抛出IllegalMonitorStateException。

wait方法

public final void wait(long timeout, int nanos) throws InterruptedException {        if (timeout < 0) {            throw new IllegalArgumentException("timeout value is negative");        }        if (nanos < 0 || nanos > 999999) {            throw new IllegalArgumentException(               "nanosecond timeout value out of range");        }        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {            timeout++;        }        wait(timeout);    }
wait方法导致当前线程等待,直到其他线程调用该同步监视器的notify方法或者notifyAll方法。如果当前线程不是此对象监视器所有者,将抛出IllegalMonitorStateException异常。如果在当前线程等待通知之前或者正在等待通知时,任何线程终端了当前线程。都会抛出InterruptedException异常。

finalize方法

protected void finalize() throws Throwable { }
当JVM已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。对于任何给定对象,JVM最多只调用一次 finalize 方法。 

toString方法

 public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }
返回该对象的字符串表示,Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、标记符“@”和此对象哈希码的无符号十六进制表示组成。

clone方法

protected native Object clone() throws CloneNotSupportedException;
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用clone 方法将会导致在运行时抛出异常。 
0 0
原创粉丝点击