JDK软件包1.8java.lang之Object

Object(超类),是类层次结构的根。所有类都把Object作为超类。所有对象都实现类了该类的方法。Java1.0起始版本都定义了该类。

方法:

       Object clone();对象的复制copy

       Class<?> getClass(); 返回实例对象所属类的信息。

       boolean equals(); 判断非空对象是否相等。

对于非空的对象X、Y、Z,存在4个特性:

自反性,X.equals(X),返回true,自己跟自己比较,自反性;

对称性,X.equals(Y)与Y.equals(X)返回结果同时为true;

传递性,X.equals(Y) 返回true,Y.equals(Z)返回true时,X.equals(Z)也返回true;

一致性,对象信息没有修改的情况下,多次调用equals()方法返回结果相同;

任何非空对象与null判断是否相等,都返回false。

此方法重写时,必须重写hashcode方法;hashcode方法协定要求,对象判断相等,必须hashcode相等。

       int hashCode();返回哈希编码

返回对象的哈希码值,该方法是为了提高哈希表的性能。哈希码的协定:java应用程序运行期间,对同一个对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行equals比较时所有的信息没有被修改。对象equals方法比较相等,那么hash值一定相等。若比较不相等,那么hash值不一定不相等,但是为了提高性能,编码的时候不相等的对象,哈希码最好不要相等。Object类定义的hashCode确实针对不通的对象返回不同的哈希值。

void finalize();垃圾回收器确定对象不在有任何引用时(不可达),由对象的垃圾回收器调用此方法。在不可撤销丢弃对象之前,执行清除操作。

  String toString();返回该对象的字符串表示。结果应该是一个建议明了的信息表达,建议所有子类重写此方法。

void wait();final修饰的方法不能被重写。在除当前线程外的其他线程调用notify() /notifyAll() 方法前,让当前线程等待。当前现场必须拥有 此对象的监视器。与wati(0)、wait(0,0)相等。

void wait(long timeout);final修饰的方法不能被重写。按毫秒时间等待

void wait(long timeout, int nanos);final修饰的方法不能被重写。增加纳秒级别的等待精度,也是就是毫秒时间加1;1毫秒等于1000000纳秒,所以传入的纳秒值不能大于999999。

监视器:jvm对每个对象和Class都设置了一个监听器,发现和检测并发代码的冲入。当线程访问受保护的对象数据时,先要获取对象监视器的所有权,然后才能获取对象数据。所有因为获取监视器所有权等待的线程和当前线程,通过CPU调度竞争上岗获取所有权。然后执行受保护的代码,执行完毕后释放Monitor所有权。如果有线程持有对象监视器的所有权,那么其他线程等待(进入等待entry-set)。当一个线程获取对象监视器所有权之后,经过代码执行没有达到条件要求,那么需要调用Object的wait方法,线程会释放对象监视器的所有权,进入等待线程队列(wait-set),等待Object的notify方法唤醒,然后和其他线程通过CPU竞争获取对象监视器所有权。

void notify();final修饰的方法不能被重写。唤醒在此对象监视器上的等待线程(因为某种条件或原因,调用wait,然后释放了监视器所有权的线程)(1个),如果有很多等待的线程,随机唤醒一个。被唤醒的线程继续参加对象监视器所有权竞争。

void notify();final修饰的方法不能被重写。唤醒在此对象监视器上所有等待的线程。

 

package java.lang;


public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    /**
     * 返回对象所属类的信息。类名称、类方法、变量等
     */
    public final native Class<?> getClass();

    /**
     * 生成对象的哈希码值,equals相同的对象,有相同的哈希码;不相同的对象,尽量有不相同的哈希码
     */
    public native int hashCode();

    /**
     * 判断非空对象是否相等
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 创建对象的副本并返回这个副本
     */
    protected native Object clone() throws CloneNotSupportedException;

    /**
     * 返回对象的简明的描述字符串
     */
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    /**
     * 唤醒在此对象监视器上等待线程的随机一个。
     */
    public final native void notify();

    /**
     * 唤醒在此对象监视器上所有等待的线程。
     */
    public final native void notifyAll();

    /**
     * 等待一定量的时间,如果timeout是0,不考虑超时时间
     * 解除等待的方法:notify(),唤醒的包含当前线程;notifyAll()唤醒所有线程;其他线程中断指定
     * 线程;到达等待的时间。
     */
    public final native void wait(long timeout) throws InterruptedException;

    /**
     * 实时量以纳秒为单位
     */
    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");
        }
        //自动加1
        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }
    /**
     * 获得对象监视器所有权的当前线程等待
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * 撤回丢弃对象前的清楚工作
     */
    protected void finalize() throws Throwable { }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章