JDK软件包1.8java.lang之Object

本文深入解析Java中Object类的功能和作用,包括其方法如equals、hashCode、toString等的使用及重要性,以及如何正确重写这些方法。同时,探讨了Object类在Java内存管理和线程同步中的关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 { }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值